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