检查对象是否为DOM元素。

11

将DOM元素传递给WebWorkers变得棘手,因为所有对DOM的引用都会丢失。我需要检查在发送WebWorker消息之前传递的对象。

什么是检查对象是否为DOM元素或/和DOM树的一部分,或者是否具有包含任何对DOM树的引用的“子项”的最快方法?

使用示例:

var a = new SharedWorker("bigdatahandler.js");   
a.postMessage(s);

s //<--should not be a DOM object

这个问题已经在这里得到了回答:https://dev59.com/-W445IYBdhLWcg3wpb8P#4754104 ;) - Martin Jespersen
3个回答

10

要检查一个对象是否为元素实例,请使用instanceof

s instanceof Element

使用ownerDocument来检查其拥有者文档:

s.ownerDocument == document

8

要检查它是否为元素,我认为obj.nodeName是最好的选择。

var a = new SharedWorker("bigdatahandler.js");   
if (!s.nodeName) {
    a.postMessage(s);
}

您也可以检查s instanceof Element,因为我猜您不需要支持IE :)

要检查它是否是DOM的一部分:

function inDOM(elem) {
  do {
      if (elem == document.documentElement) {
         return true;
      }
  } while (elem = elem.parentNode)
  return false;
}​

1
...并且要检查它是否有任何DOM元素的“子级”,您需要对给定项的所有属性进行递归下降(如果它是一个对象)。 - T.J. Crowder
@TJ - 他说“具有包含对DOM树的任何引用的'children'”。如果元素不是DOM的一部分,则其子元素不能包含对DOM的引用,就这么简单 :) - gblazex
@Eli - 你的陈述是正确的,但它们之间只是因为不同的假设而有所不同。我猜他不想传递除节点和普通对象之外的任何东西。然后他只是想区分一下。在这方面,我的答案是正确的。 - gblazex
哎呀,只有一件事。我想写的是 nodeName 而不是 nodeType。谢谢你提醒我 :) 至于 ownerDocument,我不确定哪些浏览器支持它。现在我看到所有IE 5.5+以上的浏览器都可以使用。 :) - gblazex
@galambalazs - 抱歉(DOM 新手警告!)“如果元素不是 DOM 的一部分...”:我可以看到并非所有的 对象 都将成为 **DOM 的一部分**。但是什么样的 元素 不会成为 DOM 的一部分呢?(我认为[可能不正确] Element 意味着像 <form><input><img> 等的 **HTML 元素**)。 - Kevin Fegan
显示剩余5条评论

1

检查 s instanceof Node。每个 DOM 对象都是一个 Node


FileReader是DOM元素吗?它没有通过这个测试。 - jayarjo
FileReader不是DOM对象,但你说得对,我搞错了。NodeListsDOMStrings和其他一些列表结构不是Node,但它们是DOM对象。 - Eli Grey
2
对于已经认可但未被纠正的错误进行负面评价。一旦错误被纠正,我会撤回评价。 - danorton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接