【问题标题】:element.valueAsDate = xxx -- not working any more... (javascript)element.valueAsDate = xxx - 不再工作......(javascript)
【发布时间】:2012-01-28 09:35:05
【问题描述】:

在我的应用程序中,我有一个为某些日期设置默认值的 javascript。执行此操作的函数如下所示:

<script language='javascript'> 
setNow(document.getElementById('date_86')); //line 166
setNow(document.getElementById('time_86'));
setNow(document.getElementById('date_0'));
setNow(document.getElementById('time_0'));

    function setNow(element) { //line 173
        date = new Date();date.setHours(date.getHours() + 3);
        element.valueAsDate = date;
    }
...
</script>

html:

<input type='date' id='date_86' name='date_86' />

有趣的是,直到最近它还可以正常工作,但现在不行了,Chrome 的控制台显示:

Uncaught Error: INVALID_STATE_ERR: DOM Exception 11
setNowmanual.html:173
(anonymous function)manual.html:166

如果我理解正确的话,我真的不明白为什么 setNow 不是这个 DOM 中的对象。

PS:当我交换声明和调用时发生同样的事情,只是控制台报告中的行号不同。

【问题讨论】:

  • 你能给我们看一些 HTML 吗?
  • 附注:如果您使用的是 HTML5,则应将 &lt;script language='javascript'&gt; 更改为 &lt;script type="text/javascript"&gt;language 属性在 HTML4 中已被弃用。
  • @TimVermaelen:有问题的页面很大,哪些部分是相关的?作为参数传递给 setNow() 函数的元素声明为
  • @ÁlvaroG.Vicario 为什么它是错误的?对整个表单的调用和对该函数的调用由服务器端脚本生成,当服务器端有日期时,作为值插入,为空时,由javascript生成.
  • @ÁlvaroG.Vicario 我确实将 javascript 的开始标签更改为

标签: javascript exception dom


【解决方案1】:

该死的! 引自 Chromium 博客 (source)

大家好,我们禁用了以下输入类型,以及 Google Chrome 16不会有他们。 日期、日期时间、本地日期时间、月份、时间。这些类型具有带有旋转按钮的简单文本字段界面。自从 Google Chrome 16,它们不被识别为有效的输入类型,并且 作为类型=文本工作。他们被禁用是因为他们的 不完整性。他们的用户界面并不令人满意,而且 这些类型的存在对特征检测是有害的。好吧 当我们完成它们的丰富实现时再次启用它们 用户界面。 -- TAMURA,Kent 软件工程师,Google

【讨论】:

  • 如果他们以不破坏现有代码的方式删除它们会很好。哦,好吧。
【解决方案2】:

编辑:根据我刚刚在此处阅读的内容:http://www.w3.org/TR/html5/common-input-element-attributes.html 如果您尝试在“不是基于日期或时间”的控件上设置 valueAsDate,则会引发错误,但鉴于您的输入是type="date"我不知道发生了什么。

编辑 2:根据此页面:https://groups.google.com/a/chromium.org/group/chromium-html5/browse_thread/thread/d1a22c42ebdf8ee4/9eb4210ce60341b1 Chrome 版本 16 已禁用日期和时间输入类型,它们将被视为文本。

Chrome 似乎不喜欢自定义属性/属性的点语法。请改用.setAttribute()

// Chrome doesn't like
element.valueAsDate = date;

// So do this:
element.setAttribute("valueAsDate",date);

// And to retrieve the value:
var v = element.getAttribute("valueAsDate")

【讨论】:

  • 不明原因的反对票?不管你是谁,什么都不感谢。我完全按照问题中给出的方式运行代码并得到相同的错误,但是当我使用setAttribute() 时,错误消失了。我注意到在其他情况下也有类似的行为。我认为这足以证明我的回答。
  • 这不是语法问题,它们是完全不同的东西。自定义属性不会导致chrome出现任何错误,属性值只能是字符串。因此,当您执行 setAttribute.. 时,日期对象将丢失。最重要的是, valueAsDate 不是自定义属性。但无论如何,我对典型的属性/属性无知投了反对票;P
  • 好的,谢谢@Esailija。当我错了,我不介意投反对票,我只是不喜欢没有解释的投反对票。我现在意识到 valueAsDate 实际上并不是一个自定义属性:原来是一个我以前没有使用过的 HTML5 属性。所以一方面我的回答确实使错误消失了,但另一方面它并没有真正解决问题。对不起。
  • 嗯,这似乎是合理的,因为我的输入变成了看起来像正常(type='text')而不是时间或日期(带有小箭头)输入的东西。但为什么会是呢? (这可能发生在 Chrome 自动更新之后,但如何解决呢?)
  • 我放弃了寻找最新版本的官方 Chrome 发行说明,但我正在运行版本 16,并且我确实找到了支持日期和时间类型的说明(请参阅我编辑的答案)已(暂时)在版本 16 中删除。
猜你喜欢
  • 2013-03-16
  • 2012-04-11
  • 2018-06-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多