Sub-fields in input[type=time] should be read-only in some cases. This requires window.internals. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". createTimeInput argument order: min, max, step, value Milliseconds field: PASS isReadOnlyField(createTimeInput("00:00:00.500", null, step1sec, ""), pseudoMillisecond) is true PASS isReadOnlyField(createTimeInput("00:00:00.500", null, step1sec, "00:00:00.500"), pseudoMillisecond) is true PASS isReadOnlyField(createTimeInput("00:00:00.500", null, step1sec, "00:00:00.600"), pseudoMillisecond) is false PASS isReadOnlyField(createTimeInput("00:00:00.000", null, step1sec, "00:00:00.600"), pseudoMillisecond) is false PASS isReadOnlyField(createTimeInput("00:00:00.500", "00:00:00.500", step1ms, ""), pseudoMillisecond) is true PASS isReadOnlyField(createTimeInput("00:00:00.500", "00:00:00.501", step1ms, ""), pseudoMillisecond) is false PASS isReadOnlyField(createTimeInput("00:00:00.500", "00:00:00.500", step1ms, "00:00:00.100"), pseudoMillisecond) is false Seconds field: PASS isReadOnlyField(createTimeInput("00:00:30", null, step1min, ""), pseudoSecond) is true PASS isReadOnlyField(createTimeInput("00:00:30", null, step1min, "00:00:30"), pseudoSecond) is true PASS isReadOnlyField(createTimeInput("00:00:30.500", null, step1min, "00:00:30.600"), pseudoSecond) is true PASS isReadOnlyField(createTimeInput("00:00:30", null, step1min, "00:00:35"), pseudoSecond) is false PASS isReadOnlyField(createTimeInput("00:00:00", null, step1min, "00:00:35"), pseudoSecond) is false PASS isReadOnlyField(createTimeInput("00:00:30", "00:00:30", step1ms, ""), pseudoSecond) is true PASS isReadOnlyField(createTimeInput("00:00:30", "00:00:31", step1ms, ""), pseudoSecond) is false PASS isReadOnlyField(createTimeInput("00:00:30", "00:00:30", step1ms, "00:00:29"), pseudoSecond) is false Minutes field: PASS isReadOnlyField(createTimeInput("00:30", null, step1hour, ""), pseudoMinute) is true PASS isReadOnlyField(createTimeInput("00:30", null, step1hour, "00:30"), pseudoMinute) is true PASS isReadOnlyField(createTimeInput("00:30", null, step1hour, "00:35"), pseudoMinute) is false PASS isReadOnlyField(createTimeInput("00:00", null, step1hour, "00:35"), pseudoMinute) is false PASS isReadOnlyField(createTimeInput("00:00:00", "00:00:30", step1sec, ""), pseudoMinute) is true PASS isReadOnlyField(createTimeInput("00:00:00", "00:01:30", step1sec, ""), pseudoMinute) is false PASS isReadOnlyField(createTimeInput("00:00:00", "00:00:30", step1sec, "00:01:00"), pseudoMinute) is false Hour field: PASS isReadOnlyField(createTimeInput("11:00", null, step1day, ""), pseudoHour) is false PASS isReadOnlyField(createTimeInput("11:00", null, step1day, ""), pseudoAMPM) is false PASS isReadOnlyField(createTimeInput("11:00", null, step1day, ""), pseudoMinute) is true PASS isReadOnlyField(createTimeInput("11:30", null, step1day, "11:30"), pseudoHour) is false PASS isReadOnlyField(createTimeInput("11:30", null, step1day, "11:30"), pseudoAMPM) is false PASS isReadOnlyField(createTimeInput("11:30", null, step1day, "11:30"), pseudoMinute) is true PASS isReadOnlyField(createTimeInput("11:30", null, step1day, "12:30"), pseudoHour) is false PASS isReadOnlyField(createTimeInput("11:30", null, step1day, "12:30"), pseudoAMPM) is false PASS isReadOnlyField(createTimeInput("11:30", null, step1day, "12:30"), pseudoMinute) is true PASS isReadOnlyField(createTimeInput("00:00", null, step1day, "12:30"), pseudoHour) is false PASS isReadOnlyField(createTimeInput("00:00", null, step1day, "12:30"), pseudoAMPM) is false PASS isReadOnlyField(createTimeInput("00:00", null, step1day, "12:30"), pseudoMinute) is false PASS isReadOnlyField(createTimeInput("00:00", "00:30", step1min, ""), pseudoHour) is true PASS isReadOnlyField(createTimeInput("00:00", "00:30", step1min, ""), pseudoAMPM) is true PASS isReadOnlyField(createTimeInput("00:00", "00:30", step1min, ""), pseudoMinute) is false PASS isReadOnlyField(createTimeInput("00:00", "00:00", step1hour, ""), pseudoHour) is false PASS isReadOnlyField(createTimeInput("00:00", "00:00", step1hour, ""), pseudoAMPM) is true PASS isReadOnlyField(createTimeInput("00:00", "00:00", step1hour, ""), pseudoMinute) is true AM/PM field: PASS isReadOnlyField(createTimeInput("00:00", null, step1min, ""), pseudoAMPM) is false PASS isReadOnlyField(createTimeInput("23:00", null, step1min, ""), pseudoAMPM) is false PASS isReadOnlyField(createTimeInput(null, "01:00", step1min, ""), pseudoAMPM) is false PASS isReadOnlyField(createTimeInput(null, "23:00", step1min, ""), pseudoAMPM) is false PASS isReadOnlyField(createTimeInput("00:00", "11:59", step1min, ""), pseudoAMPM) is true PASS isReadOnlyField(createTimeInput("00:00", "12:00", step1min, ""), pseudoAMPM) is false PASS isReadOnlyField(createTimeInput("12:00", "12:00", step1min, ""), pseudoAMPM) is true PASS isReadOnlyField(createTimeInput("12:00", "23:59", step1min, ""), pseudoAMPM) is true PASS successfullyParsed is true TEST COMPLETE