我该如何在jQuery中检查元素是否存在?
我目前的代码如下:
if ($(selector).length > 0) {
// Do something
}
有没有更优雅的方法来解决这个问题?也许是插件或函数?
我该如何在jQuery中检查元素是否存在?
我目前的代码如下:
if ($(selector).length > 0) {
// Do something
}
有没有更优雅的方法来解决这个问题?也许是插件或函数?
在JavaScript中,一切都是'truthy'或者'falsy',而对于数字来说,0
表示false
,其他所有的数字表示true
。因此,你可以这样写:
if ($(selector).length)
您不需要那个>0
部分。
是的!
jQuery.fn.exists = function(){ return this.length > 0; }
if ($(selector).exists()) {
// Do something
}
$.fn.exists
的例子将一个属性查找(便宜!)替换为两个函数调用,而这两个函数调用要昂贵得多,并且其中一个函数调用会重新创建一个你已经拥有的 jQuery 对象。 - C Snover.exists
的函数更易于阅读,而 .length
的语义不同,即使语义与相同结果相符。 - Ben Zotto如果您使用了
jQuery.fn.exists = function(){return ($(this).length > 0);}
if ($(selector).exists()) { }
你会误认为可以进行链接操作,但实际上不行。
这样表述更好:
jQuery.exists = function(selector) {return ($(selector).length > 0);}
if ($.exists(selector)) { }
或者,从常见问题解答中:
if ( $('#myDiv').length ) { /* Do something */ }
你也可以使用以下方法。如果jQuery对象数组中没有值,则获取数组中的第一个项目将返回undefined。
if ( $('#myDiv')[0] ) { /* Do something */ }
$(".missing").css("color", "red")
已经做对了...也就是什么都没做。 - Ben Blank// if element exists
if($('selector').length){ /* do something */ }
// if element does not exist
if(!$('selector').length){ /* do something */ }
检查存在性最快且语义自解释的方式实际上是使用纯粹的JavaScript
:
if (document.getElementById('element_id')) {
// Do something
}
与 jQuery 的 length
方法相比,这种方法写起来有点长,但执行速度更快,因为它是原生 JavaScript 方法。
它比编写自己的 jQuery
函数更好。根据 @snover 的说法,另一种方案速度较慢。但它也会给其他程序员留下一个印象,认为 exists()
函数是 jQuery 所固有的。不增加知识负担的情况下,其他编辑您代码的人应该能够理解 JavaScript
。
NB:注意在 element_id
前面没有 '#'(因为这是纯 JS,不是 jQuery)。
$('#foo a.special')
。它可以返回多个元素。getElementById
无法做到这一点。 - kikitoif(document.querySelector("#foo a.special"))
可以起作用,不需要使用 jQuery。 - Blue Skies您可以通过编写以下内容来节省几个字节:
if ($(selector)[0]) { ... }
这是因为每个 jQuery 对象都被伪装成一个数组,所以我们可以使用数组解引用运算符来获取 数组 的第一项。如果指定的索引不存在任何项,则返回 undefined
。jQuery.first()
或 jQuery.eq(0)
都会返回对象,即使它们是空的也会被视为真值。这个例子说明了为什么这些函数不能直接使用:if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist 存在")
。 - Salman A您可以使用:
if ($(selector).is('*')) {
// Do something
}
可能再优雅一点。
这个插件可以像这样在一个if
语句中使用:if ($(ele).exist()) { /* DO WORK */ }
或者使用回调函数。
;;(function($) {
if (!$.exist) {
$.extend({
exist: function() {
var ele, cbmExist, cbmNotExist;
if (arguments.length) {
for (x in arguments) {
switch (typeof arguments[x]) {
case 'function':
if (typeof cbmExist == "undefined") cbmExist = arguments[x];
else cbmNotExist = arguments[x];
break;
case 'object':
if (arguments[x] instanceof jQuery) ele = arguments[x];
else {
var obj = arguments[x];
for (y in obj) {
if (typeof obj[y] == 'function') {
if (typeof cbmExist == "undefined") cbmExist = obj[y];
else cbmNotExist = obj[y];
}
if (typeof obj[y] == 'object' && obj[y] instanceof jQuery) ele = obj[y];
if (typeof obj[y] == 'string') ele = $(obj[y]);
}
}
break;
case 'string':
ele = $(arguments[x]);
break;
}
}
}
if (typeof cbmExist == 'function') {
var exist = ele.length > 0 ? true : false;
if (exist) {
return ele.each(function(i) { cbmExist.apply(this, [exist, ele, i]); });
}
else if (typeof cbmNotExist == 'function') {
cbmNotExist.apply(ele, [exist, ele]);
return ele;
}
else {
if (ele.length <= 1) return ele.length > 0 ? true : false;
else return ele.length;
}
}
else {
if (ele.length <= 1) return ele.length > 0 ? true : false;
else return ele.length;
}
return false;
}
});
$.fn.extend({
exist: function() {
var args = [$(this)];
if (arguments.length) for (x in arguments) args.push(arguments[x]);
return $.exist.apply($, args);
}
});
}
})(jQuery);
您可以指定一个或两个回调函数。第一个函数将在元素存在时触发,第二个函数将在元素不存在时触发。但是,如果您选择仅传递一个函数,则仅当元素存在时才会触发该函数。因此,如果所选元素不存在,则链条将中断。当然,如果它存在,则第一个函数将被触发并且链条将继续。
请注意,使用回调变量有助于维护链式调用 - 元素将被返回,您可以像使用任何其他jQuery方法一样继续链接命令!
if ($.exist('#eleID')) { /* DO WORK */ } // param as STRING
if ($.exist($('#eleID'))) { /* DO WORK */ } // param as jQuery OBJECT
if ($('#eleID').exist()) { /* DO WORK */ } // enduced on jQuery OBJECT
$.exist('#eleID', function() { // param is STRING && CALLBACK METHOD
/* DO WORK */
/* This will ONLY fire if the element EXIST */
}, function() { // param is STRING && CALLBACK METHOD
/* DO WORK */
/* This will ONLY fire if the element DOES NOT EXIST */
})
$('#eleID').exist(function() { // enduced on jQuery OBJECT with CALLBACK METHOD
/* DO WORK */
/* This will ONLY fire if the element EXIST */
})
$.exist({ // param is OBJECT containing 2 key|value pairs: element = STRING, callback = METHOD
element: '#eleID',
callback: function() {
/* DO WORK */
/* This will ONLY fire if the element EXIST */
}
})
Has Items
回调函数应该将对象作为参数传递吗? - Chris Marisic我发现这里的大部分答案都不准确,它们检查元素长度,在许多情况下可能是可以的,但不是100%。如果数字传递给函数,那该怎么办?因此,我原型设计了一个函数来检查所有条件并返回正确的答案:
$.fn.exists = $.fn.exists || function() {
return !!(this.length && (this[0] instanceof HTMLDocument || this[0] instanceof HTMLElement));
}
这将检查长度和类型,现在你可以这样检查:
$(1980).exists(); //return false
$([1,2,3]).exists(); //return false
$({name: 'stackoverflow', url: 'http://www.stackoverflow.com'}).exists(); //return false
$([{nodeName: 'foo'}]).exists() // returns false
$('div').exists(); //return true
$('.header').exists(); //return true
$(document).exists(); //return true
$('body').exists(); //return true
你可以使用这个:
jQuery.fn.extend({
exists: function() { return this.length }
});
if($(selector).exists()){/*do something*/}
NaN != false
。 - Robert[].toString() === [].join(',') === ""
和"" === ""
。 - Ismael Miguela
是任何值时,NaN!= a
。 - user1280483