将DOM元素传递给WebWorkers变得棘手,因为所有对DOM的引用都会丢失。我需要检查在发送WebWorker消息之前传递的对象。
什么是检查对象是否为DOM元素或/和DOM树的一部分,或者是否具有包含任何对DOM树的引用的“子项”的最快方法?
使用示例:
var a = new SharedWorker("bigdatahandler.js");
a.postMessage(s);
s //<--should not be a DOM object
将DOM元素传递给WebWorkers变得棘手,因为所有对DOM的引用都会丢失。我需要检查在发送WebWorker消息之前传递的对象。
什么是检查对象是否为DOM元素或/和DOM树的一部分,或者是否具有包含任何对DOM树的引用的“子项”的最快方法?
使用示例:
var a = new SharedWorker("bigdatahandler.js");
a.postMessage(s);
s //<--should not be a DOM object
要检查一个对象是否为元素实例,请使用instanceof
:
s instanceof Element
使用ownerDocument
来检查其拥有者文档:
s.ownerDocument == document
要检查它是否为元素,我认为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;
}
nodeName
而不是 nodeType
。谢谢你提醒我 :) 至于 ownerDocument
,我不确定哪些浏览器支持它。现在我看到所有IE 5.5+以上的浏览器都可以使用。 :) - gblazex对象
都将成为 **DOM 的一部分
**。但是什么样的 元素
不会成为 DOM 的一部分呢?(我认为[可能不正确] Element
意味着像 <form>
、<input>
、<img>
等的 **HTML 元素
**)。 - Kevin Fegan检查 s instanceof Node
。每个 DOM 对象都是一个 Node
。
NodeLists
、DOMStrings
和其他一些列表结构不是Node
,但它们是DOM对象。 - Eli Grey