是否有跨浏览器和跨框架的方法来检查对象是否是HTML元素
Is there a cross-browser and cross-frame way to check if an object is an HTML element?
给定一个对象obj
,我想检查该对象是否是本地HTML元素。我可以做:
if ( obj instanceof HTMLElement )
但这不适用于跨帧(例如来自<iframe>
的对象),因为每个帧都有自己的HTMLElement
构造函数。或者,我可以做:
if ( obj.tagName )
但这并不安全/可靠,因为这样的属性可能是故意添加到对象中的。
那么,有可靠的方法可以做到这一点吗?
您可以使用以下内容,接受这样一个事实,即这只适用于支持HTMLElement
作为基本构造函数的UA:
/// testing vars
var localBody = document.body;
var foreignBody = document.getElementById('iframe').contentDocument.body;
/// useful function
var deriveWindow = function( elm ){
return elm &&
elm.ownerDocument &&
(elm.ownerDocument.defaultView ||
elm.ownerDocument.parentWindow)
;
};
/// instanceofs
console.log( localBody instanceof HTMLElement );
console.log( foreignBody instanceof HTMLElement );
console.log( localBody instanceof deriveWindow(localBody).HTMLElement );
console.log( foreignBody instanceof deriveWindow(foreignBody).HTMLElement );
输出将因浏览器而异,Firefox 25(在Windows 7上)提供:
true
true
true
true
而IE 11、Opera 12、Safari 5和Chrome 31(在Windows 7上)都给出了:
true
false
true
true
Fiddle:
- http://jsfiddle.net/9sGx5/7/
- http://jsfiddle.net/9sGx5/7/embedded/result/
您可以使用nodeType和nodeName属性,不幸的是,如果将这些属性添加到非HTML元素对象中,您仍然会遇到问题。
http://www.w3schools.com/dom/dom_nodetype.asp
//Returns true if it is a DOM element
function isElement(o){
if (typeof o === "object" && o.nodeType === 1 && typeof o.nodeName==="string") {
return true;
}
return false;
}
我所知道的最好的方法是检查对象的toString表示。
HTMLElement的字符串表示有两件事总是正确的:
- 它将从
[object HTML
开始 - 它将以
Element]
结束
以下是详细的检查方法:
var str = Object.prototype.toString.call(obj),
isHtmlElement = str.indexOf('[object HTML') === 0
&& str.indexOf('Element]') > -1;
假阳性的可能性仍然存在(但微乎其微)。
isPrototypeOf
函数怎么样?HTMLElement.prototype.isPrototypeOf(obj)
应该为任何HTML元素返回true
,但为某些随机对象返回false
。
我还没有机会跨帧测试它,所以我担心的是,如果它遇到与instanceOf
相同的问题。
相关文章:
- 遍历 JSON 对象并检查 URL 是否以某个值结尾
- JS数组-检查对象值是否重复
- 如何检查数组中的对象是否等于选项值
- 使用js/jQuery检查对象(而不是元素)是否真的存在
- 如何通过json对象选项卡中的Id来检查对象是否存在
- 尝试简化检查对象键是否为true并将其推送到另一个对象
- 检查对象是否是mongo游标
- 检查对象的所有属性是否未定义
- 如何使用*ngIf检查角度2模板中的空对象
- javascript检查对象存在
- Three.js-如何检查对象是否在球体后面(不可见)
- 检查对象是否基于jquery对象
- 正在检查对象javascript中是否存在嵌套属性
- 在对象数组上使用map()检查差异
- 如何检查文字对象是否在 Javascript 数组中
- javascript对象检查在IE11中不起作用
- Javascript 对象检查
- 通过JavaScript中的dictionary对象检查单词的有效性-是否有更好的方法来引用/构建词典
- 如何将对象检查为未定义
- 如何使用 jquery 延迟对象检查元素是否在 DOM 中