Javascript 函数参数是本机元素还是jQuery集?

Javascript 函数参数是本机元素还是jQuery集?,javascript,jquery,Javascript,Jquery,我正在用JavaScript编写一个通用助手函数。它访问元素的className属性 但由于我使用的是jQuery,所以有时作为参数传递的元素实际上是一个数组(jQuery集) 如果参数是一个元素,最简单的方法是使用它;如果参数是一个集合,最简单的方法是从集合中获取第一个元素?jQuery是否有用于此的工具?您总是想要一个本机元素?每个jQuery对象都有一个属性jQuery(包含jQuery版本),因此您可以使用它来检查您得到的元素是否可能是jQuery对象: obj = obj.jquery

我正在用JavaScript编写一个通用助手函数。它访问元素的
className
属性

但由于我使用的是jQuery,所以有时作为参数传递的元素实际上是一个数组(jQuery集)


如果参数是一个元素,最简单的方法是使用它;如果参数是一个集合,最简单的方法是从集合中获取第一个元素?jQuery是否有用于此的工具?

您总是想要一个本机元素?每个jQuery对象都有一个属性
jQuery
(包含jQuery版本),因此您可以使用它来检查您得到的元素是否可能是jQuery对象:

obj = obj.jquery ? obj[0] : obj;
如果您不喜欢打字:

obj = (obj instanceof jQuery) ? obj[0] : obj;

您可以使用
instanceof
测试对象是否为jQuery对象:

if (myObject instanceof jQuery) {
    // use $.each to loop over myObject and get class names of all
    // or just use myObject[0].className to return only the first
} else {
    // it's not a jQuery object
}

如果要将单个元素、元素数组或jQuery对象传递给同一个方法,请执行以下操作:

function stuff(element) {
    element = [].concat(element)[0];
}
如果您必须同时处理jQuery对象和非jQuery元素,这就有点困难了。请记住,jQuery集合对于每个元素可能有不同的
className
s,即第一个元素和其他元素可能不相同

这有点低效,但这会起作用:

function (obj) {
   var className = $(obj).get(0).className;
}
jQuery()
中包装jQuery对象不起任何作用,但包装元素允许您通过
.get
再次访问它。它的效率很低,因为您可能有一个额外的
$()
呼叫

如果这不好,您可以检查
obj.hasOwnProperty('className')
,因为jQuery对象通常不应该有它,但我认为风险更大

jQuery对象是元素还是元素数组

严格来说,两者都不是

jQuery对象是具有一些数组功能的Javascript对象。在大多数方面,您可以将其用作元素数组


如果jQuery对象可能包含多个元素,而您只需要第一个元素,则可以使用来获取:

elements = elements.first();
如果参数可以是元素、元素数组或jQuery对象,则可以将其包装到jQuery对象中以处理所有情况:

elements = $(elements).first();

谢谢,但是如果参数是元素而不是set.Updated,则此操作将失败。我想这就是你想要的。jquery的
obj.jquery
做什么?@JonathanWood版本的jquery正在运行,但我会像jbabey建议的那样使用jquery的instanceof。再次更新答案。它包含jQuery版本,并且(通常)对于本机DOM对象不存在