document.getElementById(' someId')导致"对象不支持属性或方法' getElementById'"

时间:2014-09-16 12:50:03

标签: javascript internet-explorer internet-explorer-9 getelementbyid

我在Internet Explorer 9中有一个奇怪的JavaScript异常:

Screenshot

翻译成英文,信息为:

  

对象不支持属性或方法' getElementById'

但是,当我通过JavaScript控制台执行document.getElementById时,会找到该函数。实际上,如果我执行导致异常的整个语句,它就会成功! (参见截图)。

这种奇怪的原因是什么?如果不是,document应始终采用getElementById方法吗?如果我在调试器中重试它,为什么同一个语句会成功?

我可以使用Internet Explorer 9重现问题,但不能重现IE 11或Firefox。

1 个答案:

答案 0 :(得分:-1)

进一步分析显示以下内容:

当JavaScript函数在元素的事件处理程序属性中声明时,该元素成为函数的词法范围链的一部分,导致该元素的document属性隐藏window.document的全局声明。 (如果不清楚,我建议阅读Scope of Event Handlers)。

此外,在调用函数之前,jQuery DOM操作已替换文档中的该节点。这导致Internet Explorer 9更新该元素的document属性以指向创建的DocumentFragment jQuery。

因此,该函数意外地使用了元素document属性,得到了一个DocumentFragment,其中预计会有一个完整的Document。 DocumentFragment没有getElementById方法。

我已经解决了这个问题,并阻止了词法范围链的进一步推断,但是将事件处理程序包装到用Function constructor创建的函数中,这导致它不继承词法范围。