"Любая" логическая функция в jquery
Есть ли способ easy проверить, соответствуют ли какие-либо элементы селектора jquery условию? Например, чтобы проверить, пусты ли какие-либо текстовые поля в форме (вроде псевдо, а не реального jquery):
$('input.tb').any(val().length == 0);
Примечание. Я знаю, что это можно сделать с помощью вспомогательного метода, просто любопытно, если бы это было возможно в одном утверждении.
Ответы
Ответ 1
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});
Ответ 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="">