javascript - 如何检查 JavaScript 对象是否为 DOM 对象?

标签 javascript dom object

我想得到:

document.createElement('div')  //=> true
{tagName: 'foobar something'}  //=> false

在我自己的脚本中,我以前只是使用它,因为我从来不需要 tagName 作为属性:

if (!object.tagName) throw ...;

因此,对于第二个对象,我想出了以下作为快速解决方案的解决方案——这主要是可行的。 ;)

问题在于,它依赖于强制执行只读属性的浏览器,而并非所有浏览器都这样做。

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;
  }
}

有没有好的替代品?

最佳答案

这可能很有趣:

function isElement(obj) {
  try {
    //Using W3 DOM2 (works for FF, Opera and Chrome)
    return obj instanceof HTMLElement;
  }
  catch(e){
    //Browsers not supporting W3 DOM2 don't have HTMLElement and
    //an exception is thrown and we end up here. Testing some
    //properties that all elements have (works on IE7)
    return (typeof obj==="object") &&
      (obj.nodeType===1) && (typeof obj.style === "object") &&
      (typeof obj.ownerDocument ==="object");
  }
}

它是 DOM, Level2 的一部分.

更新 2:这是我在自己的库中实现它的方式: (之前的代码在 Chrome 中不起作用,因为 Node 和 HTMLElement 是函数而不是预期的对象。这段代码在 FF3、IE7、Chrome 1 和 Opera 9 中测试过)。

//Returns true if it is a DOM node
function isNode(o){
  return (
    typeof Node === "object" ? o instanceof Node : 
    o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string"
  );
}

//Returns true if it is a DOM element    
function isElement(o){
  return (
    typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
    o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName==="string"
);
}

关于javascript - 如何检查 JavaScript 对象是否为 DOM 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384286/

相关文章:

Javascript倒计时器只显示一次?

javascript - 在视口(viewport)中获取元素的最快方法

jquery dom ajax 与 ckeditor 的问题

javascript - 更改对象的键值而不丢弃其余键

javascript - Vuex `people[0] = { age: people[0].age + 1 };` 不会触发重新渲染,为什么?

javascript - 在大多数移动浏览器上只有在出现重大延迟后图像才会更改

javascript - 捕获模块加载错误并处理它们

javascript - 找不到模块 vertx/container

javascript - 为什么我需要 4 previousSibling 才能获取 2 个前一个元素?

c++ - 如何使用 'this' 通过公共(public)函数调用将对象传递到全局数组中?