Подтвердить что ты не робот

"Любая" логическая функция в jquery

Есть ли способ easy проверить, соответствуют ли какие-либо элементы селектора jquery условию? Например, чтобы проверить, пусты ли какие-либо текстовые поля в форме (вроде псевдо, а не реального jquery):

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

Примечание. Я знаю, что это можно сделать с помощью вспомогательного метода, просто любопытно, если бы это было возможно в одном утверждении.

4b9b3361

Ответ 2

.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

Ответ 3

if ( $('input.tb[value=""]').length > 0 ) // there are empty elements

Ответ 4

Я добавляю это через год для других, которые наткнулись на это:

Ответ 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);

Ответ 5

Проблема с текущими ответами, а также с собственными фильтрующими функциями jQuery, включая .is(), .has() и .filter() заключается в том, что ни одно из них не .filter() как только критерии соблюдены. Это может или не может быть большой проблемой производительности в зависимости от того, сколько элементов вам нужно оценить.

Здесь простой метод расширения, который перебирает объект jQuery и оценивает каждый элемент, чтобы мы могли досрочно завершить работу, как только мы соответствуем критериям.

jQuery.fn.any = function(filter){ 
  for (i=0 ; i<this.length ; i++) {
     if (filter.call(this[i])) return true;
  }
  return false;
};

Тогда используйте это так:

var someEmpty= $(":input").any(function() { 
    return this.value == '';
});

Это дает гораздо лучшие результаты:

Performance Graph


Если вы идете на чистый маршрут JQuery, $.is(<sel>) такая же, is filter как !!$.filter(<sel>).length поэтому, вероятно, делает более короткий и более императивного кода, чтобы использовать is вместо filter.

jQuery is Docs


Вот пример $.any() в действии:

jQuery.fn.any = function(filter){ 
  for (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="">