是否有任何简单的方法来检查 jquery 选择器中的任何元素是否满足条件?例如,要检查表单中的任何文本框是否为空(一种伪,不是真正的 jquery):
$('input.tb').any(val().length == 0);
注意:我知道可以使用辅助方法来完成,只是好奇是否可以在一个语句中完成。
是否有任何简单的方法来检查 jquery 选择器中的任何元素是否满足条件?例如,要检查表单中的任何文本框是否为空(一种伪,不是真正的 jquery):
$('input.tb').any(val().length == 0);
注意:我知道可以使用辅助方法来完成,只是好奇是否可以在一个语句中完成。
当前答案以及jQuery 自己的过滤功能(包括 .is()
、.has()
和)的问题.filter()
在于,一旦满足标准,它们都不会短路。这可能是也可能不是一个很大的性能问题,具体取决于您需要评估多少元素。
这是一个简单的扩展方法,它遍历一个 jQuery 对象并评估每个元素,这样我们就可以在符合条件时尽早终止。
jQuery.fn.any = function(filter){
for (var i=0 ; i<this.length ; i++) {
if (filter.call(this[i])) return true;
}
return false;
};
然后像这样使用它:
var someEmpty= $(":input").any(function() {
return this.value == '';
});
这会产生更好的性能结果:
如果您确实走纯 jQuery 路线,那么它可能会使用更短且更具声明性的代码来代替.$.is(<sel>)
!!$.filter(<sel>).length
is
filter
$.any()
:jQuery.fn.any = function(filter){
for (var i=0 ; i<this.length ; i++) {
if (filter.call(this[i])) return true;
}
return false;
};
$(function() {
$(":input").change(function() {
var someEmpty = $(":input").any(function() {
return this.value == '';
});
console.log("Some Empty:", someEmpty);
}).eq(0).change(); // fire once on init
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" value="">
<input type="text" value="">
<input type="text" value="">
jQuery 内置了很多伪选择器:http: //api.jquery.com/category/selectors/jquery-selector-extensions/
filter()
您还可以使用以下功能构建自己的:http: //api.jquery.com/filter/
$('input.tb').filter(function() { return this.value.length == 0});
.is()
使用函数参数是您所追求的。
var anyEmpty = $('input.tb').is(function(index, element) {
return !element.value;
})
警告:
这个功能令人惊讶,因为它不会短路。即使回调已经得到满足,它也会不必要地遍历所有选定的元素。
let i = 0
let result = $('div').is((index, element) => {
i++;
return element.tagName === 'DIV';
})
console.log(`count = ${i}, result = ${result}`);
// count = 732, result = true
if ( $('input.tb[value=""]').length > 0 ) // there are empty elements
对于偶然发现此问题的其他人,我要晚一年才添加此内容:
Malk 的答案将满足您示例中的确切要求:
$('input.tb').filter(function() { return this.value.length == 0}).length != 0;
执行此操作的性能稍高一些的方法(如果提前满足条件,过滤器函数仍将迭代剩余的 DOM 元素)是编写您自己的辅助方法(诚然,操作已声明
我知道可以使用辅助方法来完成,只是好奇是否可以在一个语句中
,但我来到这个页面希望能节省 2 分钟写我自己的):
;(function($) {
//iterates over all DOM elements within jQuery object
//and returns true if any value returned from the supplied function is 'truthy'.
//if no truthy values are returned, returns false.
//
//Function( Integer index, Element element )
$.fn.any = function(fn) {
var i=0;
for (;i<this.length;i++) {
if (fn.call(this[i],i,this[i])) {return true;}
}
return false;
}
)(jQuery);