考虑这种情况进行验证:
function validateForm (validCallback) {
$('#first-name').add($('#last-name')).add($('#address')).each(function () {
// validating fields and adding 'invalid' class to invalid fields.
});
// doing validation this way for almost 50 fields (loop over 50 fields)
if ($('#holder .invalid').length == 0) {
// submitting data here, only when all fields are validated.
}
}
现在,我的问题是, if 块在循环完成之前执行。我希望validateForm
的主体可以同步执行,但似乎jQuery each()
函数异步执行。我对吗?为什么这不起作用?
答案 0 :(得分:148)
是的,jQuery each
方法是同步的。几乎所有JavaScript都是同步的。唯一的例外是AJAX,计时器(setTimeout
和setInterval
)以及HTML5 Web Workers。
您的问题可能在您的代码中的其他位置。
答案 1 :(得分:7)
jQuery
纯粹是一个javascript库。除ajax
,setTimeout
和setInterval
之外,在JavaScript
中无法异步执行任何操作。所以each
肯定是同步执行的。 each
块代码中肯定存在一些js错误。您应该在控制台中查看是否存在任何错误。
或者你可以看一下jQuery queue来执行队列中的任何函数。这将确保仅在先前的代码执行完成时才执行排队功能。
答案 2 :(得分:4)
提出这个问题的另一个原因是.each只会在(.each())函数返回false时停止迭代,并且必须使用附加变量来传递“return false”信息。
var all_ok=true;
$(selector).each(function(){
if(!validate($(this))){
all_ok=false; //this tells the outside world something went wrong
return false; //this breaks the .each iterations, returning early
}
});
if(!all_ok){
alert('something went wrong');
}
答案 3 :(得分:1)
同样的问题。所以我这样修理
var y = jQuery(this).find(".extra_fields");
for(var j in y)
{
if( typeof y[j] =='object')
{
var check = parseInt(jQuery(y[j]).val());
if(check==0){
jQuery(y[j]).addClass('js_warning');
mes="Bạn vui lòng chọn đầy đủ các thuộc tính cho sản phẩm";
done=false;
eDialog.alert(mes);
return false;
}
}
}
答案 4 :(得分:1)
多数民众赞成我是怎么做的
function getAllEventsIndexFromId(id) {
var a;
$.each(allEvents, function(i, val) {
if (val.id == id) { a=i; }
});
return a;
}
答案 5 :(得分:1)
对我而言,它就像异步一样。如果它同步工作,为什么它会这样:
var newArray = [];
$.each( oldArray, function (index, value){
if($.inArray(value["field"], field) === -1){
newArray.push(value["field"]);
}
}
);
//do something with newArray here doesn't work, newArray is not full yet
$.when.apply($, newArray).then(function() {
//do something with newArray works!! here is full
});
答案 6 :(得分:1)
return false
函数中的 .each()
仅中断循环,并且循环外的其余代码仍将执行。因此,请在.each()
循环中设置一个标志,并在循环外对其进行检查。
答案 7 :(得分:0)
我有同样的问题。我的$ .each在ajax调用的成功函数内。我通过添加async: false
使我的ajax调用同步,并且可以正常工作。
答案 8 :(得分:-9)
jQuery.each方法循环同步,但你无法保证它会以任何特定的顺序遍历项目。