我想要:
document.createElement('div') //=> true
{tagName: 'foobar something'} //=> false
Run Code Online (Sandbox Code Playgroud)
在我自己的脚本中,我曾经只是使用它,因为我从来不需要tagName作为属性:
if (!object.tagName) throw ...;
Run Code Online (Sandbox Code Playgroud)
因此,对于第二个对象,我想出了以下作为快速解决方案 - 主要是有效的.;)
问题是,它取决于执行只读属性的浏览器,而不是所有人都这样做.
function isDOM(obj) {
var tag = obj.tagName;
try {
obj.tagName = ''; // Read-only for DOM, should throw exception
obj.tagName = tag; // Restore for normal objects
return false;
} catch (e) {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
有一个很好的替代品吗?
将DOM元素传递给WebWorkers变得棘手,因为对DOM的所有引用都"丢失"了.我需要检查在发送WebWorker消息之前传递的对象.
检查对象实例是DOM元素OR/AND DOM树的OR/AND部分的最快方法是什么,或者具有包含对DOM树的任何引用的"children"?
一块用法:
var a = new SharedWorker("bigdatahandler.js");
a.postMessage(s);
s //<--should not be a DOM object
Run Code Online (Sandbox Code Playgroud) 以下代码返回true.
console.log(document.createElement('script') instanceof Element);Run Code Online (Sandbox Code Playgroud)
在<iframe>上下文中执行相同的操作会返回false:
let iframe = document.querySelector('iframe');
iframe = iframe.contentDocument || iframe.contentWindow.document;
console.log(iframe.createElement('script') instanceof Element);
Run Code Online (Sandbox Code Playgroud)
这是为什么?