18

是否有任何简单的方法来检查 jquery 选择器中的任何元素是否满足条件?例如,要检查表单中的任何文本框是否为空(一种伪,不是真正的 jquery):

$('input.tb').any(val().length == 0);

注意:我知道可以使用辅助方法来完成,只是好奇是否可以在一个语句中完成。

4

6 回答 6

17

当前答案以及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>).lengthisfilter

jQuery 是文档


这是一个实际操作的示例$.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="">

延伸阅读:

于 2017-04-07T15:42:31.950 回答
12

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});
于 2013-05-15T23:25:33.393 回答
8

.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
于 2014-10-10T00:36:02.463 回答
5
if ( $('input.tb[value=""]').length > 0 ) // there are empty elements
于 2013-05-15T23:25:07.520 回答
5

对于偶然发现此问题的其他人,我要晚一年才添加此内容:

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);
于 2014-06-18T23:09:42.077 回答
0

不需要 jQuery,因为 javascript 数组具有该.some功能(只要您不使用 IE < 9)。然后你可以做类似的事情:

// toArray() called for being a jQuery element, we need an array for this
$('input.tb').toArray().some((elem) => elem.length == 0);

FWIW,还有一个.every函数,它在所有元素都通过函数时返回 true。

于 2021-02-26T04:39:29.217 回答