代码日记 | 小叉 | 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_NODE | 1 |
ATTRIBUTE_NODE | 2 |
TEXT_NODE | 3 |
CDATA_SECTION_NODE | 4 |
ENTITY_REFERENCE_NODE | 5 |
ENTITY_NODE | 6 |
PROCESSING_INSTRUCTION_NODE | 7 |
COMMENT_NODE | 8 |
DOCUMENT_NODE | 9 |
DOCUMENT_TYPE_NODE | 10 |
DOCUMENT_FRAGMENT_NODE | 11 |
NOTATION_NODE | 12 |
现在,将这两个方法整合在一起,就完成了判断 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;
};
这里是小叉试验场的简版,请到正式版参与评论