Javascript 如何判断$(“quot;”)。的每个()调用是否已提前中止?
首先,一些psuedo psuedo代码:Javascript 如何判断$(“quot;”)。的每个()调用是否已提前中止?,javascript,jquery,Javascript,Jquery,首先,一些psuedo psuedo代码: $("some-selector-logic").each(function() { if (someLogic($(this))) { return false; } // Otherwise do stuff related to $(this) }); someMoreExcitingCode(); 在本例中,我们将根据一些选择器逻辑获取DOM元素的集合,然后对每个元素进行迭代。对于我们调用的每个元素someLogic()
$("some-selector-logic").each(function() {
if (someLogic($(this))) {
return false;
}
// Otherwise do stuff related to $(this)
});
someMoreExcitingCode();
在本例中,我们将根据一些选择器逻辑获取DOM元素的集合,然后对每个元素进行迭代。对于我们调用的每个元素someLogic()
。如果返回true
我们中止每个循环。否则,我们对元素执行一些逻辑,然后继续下一个元素。完成所有元素后,我们将继续调用somemoreExchangingCode()
在调用somemoreExchangingCode()
之前,我想知道循环是否提前中止。显然,你可以这样做:
var aborted = false;
$("..").each(function() {
if (someLogic($(this))) {
aborted = true;
return false;
}
});
但这让我觉得有些草率,比如jQuery应该以另一种方式向我提供这些信息。有没有一种我不知道的更惯用的方法来实现这一点?关于
$.each()
,没有什么神奇之处。这是一个简单的函数,它要么做你需要的,要么不做。如果没有,那么在代码示例中设置变量没有什么错。编写自己的each()
函数完全可以满足您的需要,这并没有错。它只是运行循环并调用回调函数的几行代码
以下是jQuery 1.10.1中$的源代码。each()
:
// args is for internal usage only
each: function( obj, callback, args ) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike( obj );
if ( args ) {
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback.apply( obj[ i ], args );
if ( value === false ) {
break;
}
}
} else {
for ( i in obj ) {
value = callback.apply( obj[ i ], args );
if ( value === false ) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback.call( obj[ i ], i, obj[ i ] );
if ( value === false ) {
break;
}
}
} else {
for ( i in obj ) {
value = callback.call( obj[ i ], i, obj[ i ] );
if ( value === false ) {
break;
}
}
}
}
return obj;
},
这实际上完全取决于什么使您的代码最干净。您可以使用
$.each()
或编写自己的。由于jQuery函数倾向于返回调用它们的对象的相同集合(以允许链接),因此each()无法
函数将该信息返回给您-它已经返回了一个jQuery对象,您可以将其他方法调用链接到该对象上
根据您提供的信息,我认为使用外部标志或计数器变量获取此信息没有问题。如果您能告诉我们更多您需要了解这一点的原因,我们可能会提供更多有用的建议。可能没有您希望的那么优雅,但您可以使用:
如果您真的,真的想要避免
中止
布尔运算,并且您不关心效率,那么您可以执行以下操作:
$("..").removeClass('aborted').each(function() {
if(someLogic($(this))) {
$(this).addClass('aborted');
return false;
}
});
if( $("..").find('aborted').length ) {
//each was aborted
}
else {
//each ran to completion
}
但这实际上是使用DOM注册布尔状态,而不是设置js变量
就我个人而言,我会咬紧牙关,使用你的
abort=true
想法。我没有遇到任何其他方法来解决这个问题。你为什么需要知道?我个人从来没有遇到过这样的要求,乍一看,它很臭/很漏。也许有更好的方法来解决你正在处理的任何更大的问题。我想你已经拥有的一个变体是计数器,但我不认为这比你已经拥有的有什么优势一个布尔值不会破坏内存库,而且很可能它也不会使你的代码变得通心粉。这些我称之为“邋遢”+1件整洁的衣服question@Mash当然,虽然在我的具体案例中,每一轮的每一轮都可能使下一轮失效:你只能通过执行每一轮来判断,所以没有办法过滤掉它。。虽然我认为我可以滥用filter()
并让它执行操作,但是对filter的调用实际上返回了处理过的元素集合,这些元素可能是也可能不是全部。不过闻起来很难闻:P
function doExcitingStuff() {
var $elements = $("some-selector-logic");
for( var i = 0; i < $elements.length; i++ ) {
var $element = $($elements[i]);
if( someLogic($element) )
return;
// Otherwise do stuff related to $element
}
someMoreExcitingCode(); // only runs if the loop completes
}
var aborted = Array.prototype.some.call($(".foo"), function(el) {
if ($(el).hasClass('bar')) {
return true;
}
});
$("..").removeClass('aborted').each(function() {
if(someLogic($(this))) {
$(this).addClass('aborted');
return false;
}
});
if( $("..").find('aborted').length ) {
//each was aborted
}
else {
//each ran to completion
}