1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptのオブジェクトがDOMオブジェクトであるかどうかを確認する方法は?

2022-04-14 16:49:34

質問

取得しようとしています。

document.createElement('div')  //=> true
{tagName: 'foobar something'}  //=> false

私自身のスクリプトでは、以前はこれだけを使っていました。 tagName をプロパティとして使用します。

if (!object.tagName) throw ...;

そこで、2つ目のオブジェクトについては、手っ取り早く次のような解決策を思いつきました -- これはほとんど機能します ;)

問題は、ブラウザが読み取り専用のプロパティを強制しているかどうかにかかっています。

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;
  }
}

良い代用品はないでしょうか?

どのように解決するのですか?

これは興味深いかもしれません。

function isElement(obj) {
  try {
    //Using W3 DOM2 (works for FF, Opera and Chrome)
    return obj instanceof HTMLElement;
  }
  catch(e){
    //Browsers not supporting W3 DOM2 don't have HTMLElement and
    //an exception is thrown and we end up here. Testing some
    //properties that all elements have (works on IE7)
    return (typeof obj==="object") &&
      (obj.nodeType===1) && (typeof obj.style === "object") &&
      (typeof obj.ownerDocument ==="object");
  }
}

の一部です。 DOM, レベル2 .

アップデート2 : 自分のライブラリではこのように実装しました。 (前のコードはChromeでは動作しませんでした。NodeとHTMLElementが期待されるオブジェクトではなく、関数になっていたからです。このコードは、FF3、IE7、Chrome 1、Opera 9でテストされています)。

//Returns true if it is a DOM node
function isNode(o){
  return (
    typeof Node === "object" ? o instanceof Node : 
    o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string"
  );
}

//Returns true if it is a DOM element    
function isElement(o){
  return (
    typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
    o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName==="string"
);
}