【问题标题】:<input type="time" step="1"> not returning seconds in .value in Chromium<input type="time" step="1"> 在 Chromium 中的 .value 中不返回秒数
【发布时间】:2018-07-24 02:10:13
【问题描述】:

考虑以下输入字段

document.getElementById("inp").addEventListener(
  "change",
  function(e) {
    document.getElementById("div").textContent = e.target.value;
  }
);
<input type="time" step="1" value="00:00:00" id="inp" />
<div id="div">00:00:00</div>

在 Firefox 中测试时,该值是我在输入更改时所期望的值——格式为 hh:mm:ss。但是在 Chromium (67.0.3396.99) 中进行测试时,当输入更改为具有 0 秒的任何内容时,例如01:00:00,value属性只返回hh:mm。

这是否符合规范的正确/预期行为? (编辑:是的。)主要问题:是否有一种我不知道的标准方法,它比.value 更可取,以获得它在 hh:mm:ss 中的值,还是我必须求助到一些 JavaScript 字符串解析?

【问题讨论】:

    标签: javascript html dom input event-handling


    【解决方案1】:

    Firefox 和 Chromium 的输出实际上都符合规范。

    HTML Living Standard(最后更新于 2018 年 7 月 24 日)声明:

    value 属性,如果指定且不为空,则必须具有一个有效时间字符串的值。

    而“有效时间字符串”为defined,如下:

    字符串是一个有效的时间字符串,代表一个小时小时,一分钟 分钟,如果它由以下组件组成,则为第二个 按照给定的顺序:

    1. 两个ASCII数字,代表小时,范围0≤小时≤23
    2. U+003A 冒号字符 (:)
    3. 两个ASCII数字,代表分钟,范围0≤分钟≤59
    4. 如果 second 不为零,或者如果 second 为零,则可选:
      1. U+003A 冒号字符 (:)
      2. 两个ASCII数字,代表的整数部分,范围0≤s≤59
      3. 如果 second 不是整数,或者如果 second 是整数则可选:
        1. 一个 U+002E 句号字符 (.)
        2. 一个、两个或三个 ASCII 数字,表示 秒的小数部分

    感谢用户 @int32_t 将我链接到当前标准。

    【讨论】:

    • 这是非常非常非常古老的工作草案。最新规范为html.spec.whatwg.org/multipage/…,第二部分可选。
    • @int32_t 感谢您的链接。我责怪 Google 给了我旧的。
    【解决方案2】:

    值得一提的是,JavaScript 字符串解析非常简单且易于实现:

    document.getElementById("inp").addEventListener(
      "change",
      function(e) {
        let time = e.target.value;
        if (time.length < 6) { // missing :ss on chrome
          time += ':00'; // add it ourselves
        }
        document.getElementById("div").textContent = time;
      }
    );
    <input type="time" step="1" value="00:00:00" id="inp" />
    <div id="div">00:00:00</div>

    【讨论】:

    • 我不愿意这样做,因为它感觉太“hacky”并且在奇怪的情况下可能会失败。在链接到更新的规范之后,至少对于符合标准的浏览器来说,这是这样做的方法(可能首先检查空字符串)。对我来说,第二部分的可选部分不是一个大问题,但如果是的话,字符串长度检查也可以工作。我将把这个问题留几天,如果没有更好的答案,我会接受这个。
    猜你喜欢
    • 2012-10-28
    • 2020-04-26
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2018-08-17
    • 2015-03-06
    相关资源
    最近更新 更多