我在Internet Explorer 9中有一个奇怪的JavaScript异常:
翻译成英文,信息为:
对象不支持属性或方法' getElementById'
但是,当我通过JavaScript控制台执行document.getElementById
时,会找到该函数。实际上,如果我执行导致异常的整个语句,它就会成功! (参见截图)。
这种奇怪的原因是什么?如果不是,document
应始终采用getElementById
方法吗?如果我在调试器中重试它,为什么同一个语句会成功?
我可以使用Internet Explorer 9重现问题,但不能重现IE 11或Firefox。
答案 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创建的函数中,这导致它不继承词法范围。