是否有跨浏览器和跨框架的方法来检查对象是否是 HTML 元素?

Šim*_*das 6 html javascript dom cross-browser

给定一个对象obj,我想检查该对象是否是本机 HTML 元素。我可以做:

if ( obj instanceof HTMLElement )
Run Code Online (Sandbox Code Playgroud)

但这不适用于跨帧(例如,在 的对象上<iframe>),因为每个帧都有自己的HTMLElement构造函数。或者,我可以这样做:

if ( obj.tagName ) 
Run Code Online (Sandbox Code Playgroud)

但这并不安全/可靠,因为这样的属性可能会(无意)故意添加到对象中。

那么,有没有可靠的方法来做到这一点呢?

Joh*_*ler 0

我知道的最好方法是检查对象的 toString 表示形式。

对于 HTMLElement 的字符串表示形式,有两件事始终是正确的:

  1. 它将开始于[object HTML
  2. 它将结束于Element]

这是检查的详细方法:

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

仍然存在一些(但很小)误报的可能性。

  • ES6: `var isHTMLElement = object =&gt; { var string = {}.toString.call(object); return string.startsWith('[object HTML') &amp;&amp; string.endsWith('Element]'); };` (3认同)