クロスブラウザで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の方がいいのかなぁ、これ。