Chrome中的“Uncaught TypeError:Illegal invocation”是什么?

时间:2016-07-02 22:22:39

标签: javascript

我有一个问题。想象一下,我们有这样的HTML文档:

<html>
  <head>
  </head>
  <body>
    <p id="1">Hi</p>
  </body>
</html>

当我写document.getElementById("1").__proto__;时 - 我有HTMLParagraphElement对象。它是p对象原型链中的第一个原型对象(HTMLParagraphElement - &gt; HTMLElement - &gt; Element - &gt; Node - &gt; ...)。由于Node对象正在此链中,因此其所有属性和方法都可用于HTMLParagraphElement对象。当我写document.getElementById("1").__proto__.parentNode;时,浏览器会给我

未捕获的TypeError:非法调用。 这是什么意思?如何知道此HTMLParagraphElement对象与BOM的连接位置?例如,如果我写var x = 10; - 它是一个对象,它连接到窗口对象的根(window.x;)。我想清楚地了解BOM的结构。

1 个答案:

答案 0 :(得分:0)

如果需要访问元素的parentNode,则应直接执行:

document.getElementById("1").parentNode

上面的行会返回对<body>节点的引用,适合遍历DOM。

否则,

document.getElementById("1").__proto__.parentNode

意味着您正在尝试获取类/类型HTMLParagraphElement的parentNode,它不是元素而是元素类型:元素类型没有parentNodes。

__proto__更合适的方法是:

document.getElementById("1").__proto__.__proto__

上面的行会给你HtmlElement类,虽然这不是很有用。

关于var x,应该注意的是,javascript中定义的变量没有附加到DOM,全局变量被添加到windowwindow通过window.document连接到DOM,只需输入document....命令即可​​访问。