判断 DOM 对象、jQuery 对象以及 Zepto 对象

返回列表

代码日记 | 小叉 | 2014年01月14日

  方法本来非常简单,直到今天我遇到了判断 Zepto 对象失败之后,我才决定这事得记一下。

  判断一个对象是否属于某个对象,我们都是使用 instanceof 运算符,例如判断一个对象是否是 DOM 对象:

var dom=document.getElementById("box")
console.log(dom instanceof HTMLElement);    // =>true,如果页面中没有 id=box 的元素,则会返回 false

  在 DOM 标准中,每个 HTML 元素都是继承自 HTMLElement。当提到标准时,往往都会提到 IE,没错,在 IE9 之前,都是没有 HTMLElement 对象的。这时,我们得使用另外一个属性 nodeType 来判断。

var dom=document.getElementById("box")
console.log(dom && dom.nodeType && dom.nodeType===1);    // =>true,如果页面中,没有 id=box 的元素,则会返回 null

nodeType 属性返回被选节点的节点类型:

常量名
ELEMENT_NODE1
ATTRIBUTE_NODE2
TEXT_NODE3
CDATA_SECTION_NODE4
ENTITY_REFERENCE_NODE5
ENTITY_NODE6
PROCESSING_INSTRUCTION_NODE7
COMMENT_NODE8
DOCUMENT_NODE9
DOCUMENT_TYPE_NODE10
DOCUMENT_FRAGMENT_NODE11
NOTATION_NODE12

  现在,将这两个方法整合在一起,就完成了判断 DOM 对象的方法:

// 检测是否是 DOM 元素
function isElement(o) {
    if(o && (typeof HTMLElement==="function" || typeof HTMLElement==="object") && o instanceof HTMLElement){
        return true;
    }else{
        return (o && o.nodeType && o.nodeType===1) ? true : false;
    };
};

  加上 typeof 检测引用对象是有必要的,否则不存在的时候将会出现错误。


  接着说检测 jQuery 对象,学会检测 DOM 对象方法后,这事简单得多了,上代码:

// 检测是否是 jquery 对象
function isJquery(o) {
    return (o && o.length && (typeof jQuery==="function" || typeof jQuery==="object") && o instanceof jQuery) ? true : false;
};

  在这里多了对 length 属性的判断,因为 jQuery 选择器返回的是一个数组对象,所以当页面上没有所要选择的元素时,依然属于 jQuery 对象,只是没有 DOM 而已。当然如果你只是需要单纯的判断是不是 jQuery 对象,这可以去掉这一步。


  继续说怎么检测 Zepto 对,你是不是已经想到,是这样的?

// 错误的示例
function isZepto(o) {
    return (o && o.length && (typeof Zepto==="function" || typeof Zepto==="object") && o instanceof Zepto) ? true : false;
};

  万万没想到,这居然是错的,不论怎样都会返回 false,这绝壁是坑。经过查阅,终于发现 Zepto 居然自己有一个方法:$.zepto.isZ。(需要 Zepto v0.8 以上版本支持),于是方法改为:

// 检测是否是 Zepto 对象
function isZepto(o){
    return (o && o.length && (typeof Zepto==="function" || typeof Zepto==="object") && Zepto.zepto.isZ(o)) ? true : false;
};


标签
DOM
jQuery
Zepto
参考资料
1Node.nodeType
2Feature Request: Have a way to determine if an object is wrapped by Zepto

这里是小叉试验场的简版,请到正式版参与评论

下一篇:教你怎么把图标字体(IconFont)转为 PNG

上一篇:优雅的使用 jQuery Validation Engine 表单验证插件

返回列表