如何知道是否有jQuery对象

如何知道是否有jQuery对象,jquery,Jquery,两个问题真的 首先,在编写采用对象参数的jQuery函数时,哪种编码风格更好?该函数是采用jQuery对象还是传递标准JavaScript对象并让函数本身进行包装更好?我想我只是想问这里是否有一个标准,因为对于想要调用函数的人来说,它可能并不总是显而易见的 其次,如何测试对象是否是jQuery对象?理想情况下,如果函数可以采用其中任何一种,那就太好了,所以 function(obj) { var $obj; if (isJQuery(obj)) { $obj =

两个问题真的

首先,在编写采用对象参数的jQuery函数时,哪种编码风格更好?该函数是采用jQuery对象还是传递标准JavaScript对象并让函数本身进行包装更好?我想我只是想问这里是否有一个标准,因为对于想要调用函数的人来说,它可能并不总是显而易见的

其次,如何测试对象是否是jQuery对象?理想情况下,如果函数可以采用其中任何一种,那就太好了,所以

function(obj) {
    var $obj;
    if (isJQuery(obj)) {
        $obj = obj;
    }
    else {
        $obj = $(obj);
    }
    // ....
}

或者你甚至需要这样做?如果对象已经是jQuery对象,那么
$(obj)
是否会简单地返回,这样您就可以始终尝试包装,而这并不重要?

我认为大致如下:

    if (obj instanceof jQuery) {
        $obj = obj;
    }
    else {
        $obj = $(obj);
    }
如果对象已经是jQuery对象,那么
$(obj)
是否会简单地返回,这样您就可以一直尝试包装,而这并不重要

它返回传递的jQuery对象的克隆(请参见)。这可能会导致意外行为。

您可以测试(在jQuery对象的原型上),如下所示:

function(obj) {
  var $obj = obj.jquery ? obj : $(obj);
}
这是什么


更新:已完成,您现在可以找到



编辑:正如@在评论中指出的,这目前还没有出现,但是我很确定它不会出现在任何地方。尽管如此,基于评论讨论(感谢T.J.),我提交了一份改进通知单,希望能将其添加到API文档中,您可以在这里跟踪其进度:

我不明白为什么这比Nick的答案要少修改。这是使用普通、直接的JavaScript结构。也就是说,您可能想提到,它只适用于您拥有的
jQuery
函数创建的jQuery实例。如果您从另一个窗口接收到一个对象(并非罕见),它可能是该窗口中
jQuery
函数的jQuery实例,在这种情况下
instanceof
将为
false
(因为您测试的函数错误)。但对于绝大多数不写库之类的人来说,这是一个边缘案例。@T.J.克劳德:在阅读了你的解释之后,我认为尼克的答案得到了更多的支持,因为它比
instanceof
更可靠,OP无论如何都打算写一个库/函数。不过,我没有意识到跨窗口问题。@BoltClock:取决于您对“可靠”的定义:-)Nick依赖于jQuery的一个未记录的方面,该方面可能会在dot版本中发生变化(例如,1.4.2到1.4.3)。除非我有很好的理由,否则我不喜欢那样做。除非你正在编写一个库,或者一个你特别知道你在处理跨窗口问题的应用程序,否则没有必要这样做。@TJCrowder-我不同意这里的观点,它从来没有改变过,而且很多东西都使用它,它不会去任何地方,为什么?这是他们唯一的版本控制机制,与UI团队后来适应的方式相同。还要注意的是,这在许多
jQuery.noConflict(true)
场景中也不起作用。我完全可以理解为什么jQuery会这样做(为了更好地跨窗口),但我会在自己的应用程序(而不是库)代码中使用
instanceof
,仅仅因为它是如此标准,而
.jquery
属性没有文档记录,可能会在点版本中更改。@TJCrowder-我非常怀疑它会改变,这是jquery如何进行版本控制的。为什么不采用一直有效的方法呢?这可以追溯到1.0版:@Nick:请看我对另一个答案的回复。坦率地说,他们应该把它记录下来。有些事情没有改变并不意味着它不会改变。依赖未记录的特性几乎总是一个坏主意,一个人的下意识反应不应该是这样。我并不是说一个人永远不会这样做,我也不是说我不会在跨窗口的情况下使用上述方法,只是说当有一个简单可行的替代方法时,人们应该不愿意依赖未记录的东西。@TJCrowder-这一建议一点也不坏,我今天晚些时候会提交一个jQuery票证,看看它是否可以添加到已记录的API中。不过要明确的是,你在假设什么是可行的,这实际上取决于情况。@Nick::-)我也在考虑做同样的事情,我将把它留给你。