2013-12-11 47 views
4

鑑於對象obj,我想檢查該對象是否是本機HTML元素。我可以這樣做:是否有跨瀏覽器和跨框架方式來檢查對象是否是HTML元素?

if (obj instanceof HTMLElement) 

但是,這並不跨框架的工作(例如從一個對象),因爲每一幀都有自己的HTMLElement構造函數。或者,我可以這樣做:

if (obj.tagName) 

但這並不安全/可靠,因爲這樣的屬性可能會(不)故意添加到對象。

那麼,有沒有可靠的方法來做到這一點?

+0

element.outerHTML.match(/^ dandavis

回答

0

我知道如何檢查對象的toString表示的最佳方式。

兩件事情將永遠是一個HTML元素的字符串表示的真實:

  1. 它將與[object HTML
  2. 開始它將與Element]

這裏端氏冗長的檢查方法:

var str = Object.prototype.toString.call(obj), 
    isHtmlElement = str.indexOf('[object HTML') === 0 
       && str.indexOf('Element]') > -1; 

還有這樣我(但很少)有可能產生誤報。

+0

嗯,有趣。 –

+2

ES6:'var isHTMLElement = object => {var string = {} .toString.call(object); return string.startsWith('[object HTML')&& string.endsWith('Element]'); };' –

+0

請參閱https://github.com/lodash/lodash/issues/427#issuecomment-30357634:主機對象'[[Class]]'名稱取決於實現 - '({})。toString.call (document.documentElement)=='[object Object]'在IE 6和7中,而HTML * Element'接口不公開。 –

0

您可以使用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;  
} 
+0

這也是underscore.js使用的方法。 '_.isElement = function(obj){return !!(obj && obj.nodeType === 1); };' –

0

怎麼樣isPrototypeOf功能?對於任何HTML元素,HTMLElement.prototype.isPrototypeOf(obj)應返回true,但對於某些隨機對象應返回false

我還沒有機會跨幀測試它,所以我的一個擔心是,如果它遇到instanceOf所做的相同問題。 。 。

2

您可以使用以下,接受這樣的事實,這將只用於支持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 

小提琴:

相關問題