クロスブラウザでElement / Nodeを判定
IEでは以下のコードが動作しない。
hoge instanceof Node; hoge instanceof Element;
仕方ないのでJavascript:DOMオブジェクトかECMAオブジェクトかを判定する。: Script雑感を参考にして以下のような判定関数を作った。
if(typeof(Util) == "undefined") window.Util = {}; if(/*@cc_on!@*/false) { Util.isDomNode = function(obj) { if(!!obj && !(obj instanceof Object) && typeof(obj.nodeType) == "number") { try { obj.nodeType = obj.nodeType; } catch(e) { return true; } } return false; }; Util.isElement = function(obj) { if(!!obj && !(obj instanceof Object) && obj.nodeType === 1) { try { obj.nodeType = obj.nodeType; } catch(e) { return true; } } return false; } } else { Util.isDomNode = function(obj) { return !!obj && obj instanceof Node; }; Util.isElement = function(obj) { return !!obj && obj instanceof Element; } }
使い方はこんな感じで。
var obj = {nodeType: 1}; var textNode = document.createTextNode("hoge"); // 普通のオブジェクト Util.isDomNode(obj); // false Util.isElement(obj); // false // window Util.isDomNode(window); // false Util.isElement(window); // false // document Util.isDomNode(document); // true Util.isElement(document); // false // document.body Util.isDomNode(document.body); // true Util.isElement(document.body); // true // TextNode Util.isDomNode(textNode); // true Util.isElement(textNode); // false
一応namespaceつけたけど、UtilよりDomの方がいいのかなぁ、これ。