检测DOM对象与jQuery对象

时间:2010-11-10 00:06:47

标签: javascript dom jquery

我有一个函数,我希望能够允许传入常规的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对象的好方法。

6 个答案:

答案 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无法加载。)