鑑於對象obj
,我想檢查該對象是否是本機HTML元素。我可以這樣做:是否有跨瀏覽器和跨框架方式來檢查對象是否是HTML元素?
if (obj instanceof HTMLElement)
但是,這並不跨框架的工作(例如從一個對象),因爲每一幀都有自己的HTMLElement
構造函數。或者,我可以這樣做:
if (obj.tagName)
但這並不安全/可靠,因爲這樣的屬性可能會(不)故意添加到對象。
那麼,有沒有可靠的方法來做到這一點?
鑑於對象obj
,我想檢查該對象是否是本機HTML元素。我可以這樣做:是否有跨瀏覽器和跨框架方式來檢查對象是否是HTML元素?
if (obj instanceof HTMLElement)
但是,這並不跨框架的工作(例如從一個對象),因爲每一幀都有自己的HTMLElement
構造函數。或者,我可以這樣做:
if (obj.tagName)
但這並不安全/可靠,因爲這樣的屬性可能會(不)故意添加到對象。
那麼,有沒有可靠的方法來做到這一點?
我知道如何檢查對象的toString表示的最佳方式。
兩件事情將永遠是一個HTML元素的字符串表示的真實:
[object HTML
Element]
這裏端氏冗長的檢查方法:
var str = Object.prototype.toString.call(obj),
isHtmlElement = str.indexOf('[object HTML') === 0
&& str.indexOf('Element]') > -1;
還有這樣我(但很少)有可能產生誤報。
嗯,有趣。 –
ES6:'var isHTMLElement = object => {var string = {} .toString.call(object); return string.startsWith('[object HTML')&& string.endsWith('Element]'); };' –
請參閱https://github.com/lodash/lodash/issues/427#issuecomment-30357634:主機對象'[[Class]]'名稱取決於實現 - '({})。toString.call (document.documentElement)=='[object Object]'在IE 6和7中,而HTML * Element'接口不公開。 –
您可以使用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;
}
這也是underscore.js使用的方法。 '_.isElement = function(obj){return !!(obj && obj.nodeType === 1); };' –
怎麼樣isPrototypeOf
功能?對於任何HTML元素,HTMLElement.prototype.isPrototypeOf(obj)
應返回true
,但對於某些隨機對象應返回false
。
我還沒有機會跨幀測試它,所以我的一個擔心是,如果它遇到instanceOf
所做的相同問題。 。 。
您可以使用以下,接受這樣的事實,這將只用於支持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);
的輸出會有所不同,從瀏覽器到瀏覽器,火狐25(在Windows 7 )給出:
true
true
true
true
鑑於IE 11,歌劇12,Safari 5及鉻31(在Windows 7)所有給出:
true
false
true
true
小提琴:
element.outerHTML.match(/^ dandavis