为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只甜甜圈 2019-07-27 12:15:21
JavaScriptisDOM-如何检查JavaScript对象是否是DOM对象?我试着得到: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;   }}有好的替代品吗?
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

上面和下面的所有解决方案(我的解决方案包括)都有可能不正确,特别是在IE上-很有可能(重新)定义一些对象/方法/属性来模拟一个DOM节点,使测试无效。

所以我通常使用鸭子类型的测试:我专门为我使用的东西进行测试。例如,如果我想克隆一个节点,我会像这样测试它:

if(typeof node == "object" && "nodeType" in node &&
   node.nodeType === 1 && node.cloneNode){
  // most probably this is a DOM node, we can clone it safely
  clonedNode = node.cloneNode(false);}

基本上,这是一个小小的理智检查+对我计划使用的方法(或属性)的直接测试。

顺便说一句,上面的测试是对所有浏览器上的DOM节点的一个很好的测试。但是,如果您想保持安全,请始终检查方法和属性的存在,并验证它们的类型。

编辑:IE使用ActiveX对象来表示节点,因此它们的属性不表现为真正的JavaScript对象,例如:

console.log(typeof node.cloneNode);              // objectconsole.log(node.cloneNode instanceof Function); // false

而它应该返回“函数”和true分别。测试方法的唯一方法是查看是否定义了方法。




查看完整回答
反对 回复 2019-07-28
  • 3 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信