Javascript getElementById(';someId';)结果为;对象不支持属性或方法';getElementById'&引用;

Javascript getElementById(';someId';)结果为;对象不支持属性或方法';getElementById'&引用;,javascript,internet-explorer,internet-explorer-9,getelementbyid,Javascript,Internet Explorer,Internet Explorer 9,Getelementbyid,Internet Explorer 9中有一个奇怪的JavaScript异常: 信息翻译成英文,内容如下: 对象不支持属性或方法“getElementById” 但是,当我通过JavaScript控制台执行document.getElementById时,就会找到该函数。事实上,如果我执行导致异常的整个语句,它就会成功!(c.f.截图) 这种奇怪的原因是什么document应该始终具有getElementById方法,不是吗?如果我在调试器中重试,为什么相同的语句会成功 我可以用Interne

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

信息翻译成英文,内容如下:

对象不支持属性或方法“getElementById”

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

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


我可以用InternetExplorer9重现这个问题,但不能用IE11或Firefox

进一步的分析表明:

当JavaScript函数在元素的事件处理程序属性中声明时,该元素成为该函数词法作用域链的一部分,导致该元素的
document
属性与
window.document
的全局声明形成阴影。(如果不清楚,我建议阅读)

此外,在调用函数之前,jQuery DOM操作已经替换了文档中的该节点。这导致InternetExplorer9将该元素的document属性更新为指向创建的jQuery

因此,该函数意外地使用了elements
document
属性,并获得了一个完整的属性。DocumentFragment不具有
getElementById
方法


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

我不确定,但如果您可以发布一些相关的JS代码,也许我能想出一些有用的方法。首先,你应该经常发布一些代码,以便获得更好的帮助。再看一看@sanki的评论,其中另一个用户遇到了您的问题,只是更改了他使用的变量名。@sanki:这可能是相关的,但由于我没有在该函数中声明任何变量,因此我无法采用现有的解决方案。关于为什么变量名需要不同于html元素的id属性,有没有更具体的解释?我试图找到一些值得解释的东西,但没有。下面是支持该理论的另一个链接:。如果不想重命名变量,请不要忘记正确声明它。添加“var”以避免麻烦。