检测DOM对象与jQuery对象

UpH*_*lix 31 javascript jquery dom

我有一个函数,我希望能够允许传入常规的javascript DOM元素对象或jQuery对象.如果它还不是jQuery对象,那么我将把它作为一个.

有谁知道一种非常可靠的方法来检测这一点.

function functionName(elm){
   //Detect if elm is not a jquery object in condition
   if (elm) elm = $(elm);

}
Run Code Online (Sandbox Code Playgroud)

逻辑方法是检测DOM元素对象的一个​​属性.问题是,哪个属性最可靠?

我也可以把它变成一个jquery对象,因为jQuery没有像以下那样的问题:$($ imajQueryObjAlready); 但是,这个问题的目的不仅仅是解决问题,而是找到一种检测DOM对象与jQuery对象的好方法.

use*_*716 60

要测试DOM元素,可以检查其nodeType属性:

if( elm.nodeType ) {
    // Was a DOM node
}
Run Code Online (Sandbox Code Playgroud)

或者您可以检查jQuery属性:

if( elm.jquery ) {
    // Was a jQuery object
}
Run Code Online (Sandbox Code Playgroud)

  • 真正.当然,相反,jQuery可以决定添加一个`nodeType`属性! (4认同)
  • +1两个出色的解决方案 - 我更喜欢后者的易读性. (3认同)
  • @lonesomeday - 我给予(或应该给出的)唯一的免责声明是它不是公共API的一部分,[目前无论如何](http://bugs.jquery.com/ticket/7200),所以jQuery可能有一天会决定删除该财产.但令人怀疑. (2认同)

kar*_*m79 13

要测试jQuery对象,可以使用instanceof运算符:

if(elm instanceof jQuery) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

要么:

if(elm instanceof $) {
    ...
}
Run Code Online (Sandbox Code Playgroud)


And*_*eKR 8

jQuery是这样的:

if ( selector.nodeType )
Run Code Online (Sandbox Code Playgroud)

(jQuery 1.4.3,第109行)


Zac*_*oom 7

最简单的方法是简单地将它传递给jQuery函数.如果它已经是一个jQuery对象,它将保持不变:

function(elem){
   elem = $(elem);
   ...
}
Run Code Online (Sandbox Code Playgroud)

从jQuery源代码,这是正在发生的事情:

if (selector.selector !== undefined) {
    this.selector = selector.selector;
    this.context = selector.context;
}

return jQuery.makeArray( selector, this );
Run Code Online (Sandbox Code Playgroud)

其中makeArray将新的(默认)jQuery对象与传入的jQuery对象合并.

  • 它并没有真正改变.你得到一个新的jQuery对象.可能有副作用.这是一个演示:http://jsfiddle.net/nu7D6/ (2认同)

Han*_*-Oh 6

elm instanceof jQuery是最简单的方法,因为测试elm.nodeType会误认为{nodeType:1}是DOM元素,测试elm.jquery会误认为{jquery:$()}jQuery对象,此外还不能保证未来的jQuery对象不会有jquery属性.