代码之家  ›  专栏  ›  技术社区  ›  meriton

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

  •  0
  • meriton  · 技术社区  · 10 年前

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

    Screenshot

    翻译成英文后,该消息写道:

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

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

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

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

    1 回复  |  直到 10 年前
        1
  •  0
  •   meriton    10 年前

    进一步分析表明:

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

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

    因此,函数意外使用了元素 文件 财产,并获得了 文档片段 一个成熟的 Document 应为。DocumentFragment没有 getElementById 方法

    我已经解决了这个问题,并防止了进一步从词法范围链进行推断,但将事件处理程序包装到使用 Function constructor ,这导致它不继承词法范围。