我有一个函数,我希望能够允许传入常规的javascript DOM元素对象或jQuery对象。如果它还不是jQuery对象,那么我将把它作为一个。
有没有人知道一种非常可靠的方法来检测它。
function functionName(elm){
//Detect if elm is not a jquery object in condition
if (elm) elm = $(elm);
}
逻辑方法是检测DOM元素对象的一个属性。问题是,检测哪种属性最可靠?
我也可以把它变成一个jquery对象,因为jQuery没有像以下那样的问题:$($ imajQueryObjAlready);但是,这个问题的目的不仅仅是解决问题,而是找到一种检测DOM对象与jQuery对象的好方法。
答案 0 :(得分:61)
要测试DOM元素,可以检查其nodeType
属性:
if( elm.nodeType ) {
// Was a DOM node
}
或者您可以检查jQuery属性:
if( elm.jquery ) {
// Was a jQuery object
}
答案 1 :(得分:13)
要测试jQuery对象,可以使用instanceof
运算符:
if(elm instanceof jQuery) {
...
}
或:
if(elm instanceof $) {
...
}
答案 2 :(得分:8)
jQuery就是这样的:
if ( selector.nodeType )
(jQuery 1.4.3,第109行)
答案 3 :(得分:7)
最简单的方法是简单地将它传递到jQuery函数中。如果它已经是一个jQuery对象,它将保持不变:
function(elem){
elem = $(elem);
...
}
从jQuery源代码中,这就是发生的事情:
if (selector.selector !== undefined) {
this.selector = selector.selector;
this.context = selector.context;
}
return jQuery.makeArray( selector, this );
makeArray将新的(默认)jQuery对象与传入的jQuery对象合并。
答案 4 :(得分:6)
elm instanceof jQuery
是最简单的方法,因为测试elm.nodeType
会将{nodeType:1}
误认为是DOM元素,而测试elm.jquery
会将{jquery:$()}
误认为是jQuery对象,除了不能保证未来的jQuery对象不会有jquery
属性。
答案 5 :(得分:0)
优雅的方式:
function is_jquery_object(x) {
return window.jQuery && x instanceof jQuery;
}
function is_dom_object(x) {
return window.HTMLElement && x instanceof HTMLElement;
}
在@ karim79的回答基础上,如果您需要确定它是DOM或jQuery对象,请使用这些测试。 (如果没有定义类,window
测试可以帮助函数正常失败,例如jQuery无法加载。)