如何在jQuery中检查元素的存在?
我当前的代码是这样的:
if ($(selector).length > 0) {
// Do something
}
有更优雅的方式来解决这个问题吗?也许是插件或功能?
如何在jQuery中检查元素的存在?
我当前的代码是这样的:
if ($(selector).length > 0) {
// Do something
}
有更优雅的方式来解决这个问题吗?也许是插件或功能?
在JavaScript中,一切都是“真实的”或“虚假的”,对于数字而言 0
(和NaN)意思是 false
其他一切 true
。所以你可以写:
if ($(selector).length)
你不需要那个 >0
部分。
在JavaScript中,一切都是“真实的”或“虚假的”,对于数字而言 0
(和NaN)意思是 false
其他一切 true
。所以你可以写:
if ($(selector).length)
你不需要那个 >0
部分。
是!
jQuery.fn.exists = function(){ return this.length > 0; }
if ($(selector).exists()) {
// Do something
}
这是对: 与杰夫阿特伍德的羊群编码播客
如果你用过
jQuery.fn.exists = function(){return ($(this).length > 0);}
if ($(selector).exists()) { }
你会暗示链接是可能的,但事实并非如此。
这会更好:
jQuery.exists = function(selector) {return ($(selector).length > 0);}
if ($.exists(selector)) { }
或者, 来自FAQ:
if ( $('#myDiv').length ) { /* Do something */ }
您还可以使用以下内容。如果jQuery对象数组中没有值,那么获取数组中的第一个项将返回undefined。
if ( $('#myDiv')[0] ) { /* Do something */ }
你可以用这个:
// 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长度替代要长一些,但执行速度更快,因为它是本机JS方法。
它比编写自己的jQuery函数更好。由于@snover的原因,这种替代方案较慢。但它也会给其他程序员一种印象,即exists()函数是jQuery固有的东西。编辑代码的其他人将会/应该理解JavaScript,而不会增加知识债务。
注意:注意元素之前缺少'#'(因为这是普通的JS,而不是jQuery)。
您可以通过编写来保存几个字节:
if ($(selector)[0]) { ... }
这是有效的,因为每个jQuery对象也伪装成一个数组,所以我们可以使用数组解除引用运算符来获取第一个项目 排列。它回来了 undefined
如果指定的索引没有项目。
您可以使用:
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 */
}
})