【问题标题】:What is "Uncaught TypeError: Illegal invocation” in Chrome?什么是 Chrome 中的“未捕获的 TypeError:非法调用”?
【发布时间】:2016-07-02 22:22:39
【问题描述】:

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

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

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

未捕获的类型错误:非法调用。 这是什么意思?我怎么知道这个 HTMLParagraphElement 对象在哪里连接到 BOM?例如,如果我正在写 var x=10; - 它是一个对象,它连接到窗口对象的根(window.x;)。我想对BOM的结构有一个清晰的了解。

【问题讨论】:

标签: javascript


【解决方案1】:

如果你需要访问一个元素的parentNode,你应该直接这样做:

document.getElementById("1").parentNode

以上行将返回对&lt;body&gt; 节点的引用,并且适用于向上遍历 DOM。

否则,

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

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

更适合使用__proto__ 的方法是:

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

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

关于var x,需要注意的是,javascript中定义的变量并没有附加到DOM上,而是在window中添加了全局变量。 window 通过 window.document 连接到 DOM,简而言之,只需键入 document.... 命令即可访问。

【讨论】:

  • 是的,我要获取原型对象HTMLParagraphElement的parentNode,因为这个属性是在它的属性中定义的。我认为如果它被定义它必须正常工作,但它给出“未捕获的类型错误:非法调用”。我想了解更多关于BOM结构的信息
  • @Damon,在编写的代码中运行HTMLParagraphElement.prototype.parentNode 是没有意义的。 parentNode 是元素类型中的内置函数,将尝试在不执行 .parentNode() 的情况下评估自身。在尝试访问.parentNode 时,它将失败,因为HTMLParagraphElement.prototype 不在DOM 树中。澄清document.getElementById("1") 在DOM 树中,HTMLParagraphElement 不在。 HTMLParagraphElement 仅作为位于 window.HTMLParagraphElement 的 javascript 类型包装器存在,并且不在 DOM 中。
  • 那么我如何在 BOM 中导航(以了解其结构)?如何获得 BOM 中的位置,例如 HTMLElement、Element、Node、function-constructor Array()、function-constructor Function()、function-constructor Object()、Array.protorype、Function.prototype。 .... 已连接到 BOM? (在 BOM 中)是否有一些用于在 BOM 中导航的 prorerties 或方法?
  • 大部分都直接暴露在window。即 window.Node、window.HTMLElement 都已定义。要查看层次结构,您可以使用__proto__ 来表示:即HTMLElement.__proto__ 是元素。 Element.__proto__ 是节点。
猜你喜欢
  • 2013-07-31
  • 2012-03-29
  • 2016-12-07
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
相关资源
最近更新 更多