经过一些调试之后,似乎每个语句之前的代码都在每个语句完成之前执行。脚本在每个完成之前被执行
我也注意到,每个函数循环两次。
这是发生了什么:
- 单击#ProductsSubmit元素
- 警报弹出窗口了消息上: '事件触发' - (该#ProductSubmit click事件只被触发一次。警报框只弹出一次。)
- 通过使用Firefox萤火虫,我可以看到get函数被调用4次。只有2个.AddProduct元素。查看包含抓取的元素ID的URL时,我可以看到.each()函数正在循环两次,但请记住#ProductSubmit click事件仅触发一次。
- 第一个警报(ErrorFound)弹出值为0.我证实get回调正在触发if(VerifyData ['Valid']!='Yes')语句。因此if语句在100%的时间内为真(用于调试)
- Settimeout被触发。警报弹出窗口显示警报(ErrorFound)为1
所以它看起来像警报(ErrorFound)之前ErrorFound在每个语句设置为1被触发。但是,当我在上面拖延时,它似乎赶上并显示应该是什么值,这是1.
var ErrorFound;
$(document).ready(function(){
$(document).delegate("#ProductsSubmit", 'click', function(){
alert('Event Triggered');
ErrorFound = 0;
$(".AddProduct").each(function(){
var IDToConfirm = $(this).attr('id');
var SKUToConfirm = $(this).val();
$("#"+IDToConfirm).removeClass("InputError");
$.get('http://www.example.com/script.php?s='+SKUToConfirm+'&ut='+IDToConfirm, function(data) {
var VerifyData = jQuery.parseJSON(data);
if(VerifyData['Valid']!='Yes') { ErrorFound = 1; $("#"+VerifyData['ID']).addClass("InputError"); }
});
});
// Alert box shows value as 0
alert(ErrorFound);
setTimeout("AlertError()", 5000);
return false;
});
});
function AlertError() {
// Alert box shows value as 1
alert(ErrorFound);
}
这是怎么回事?我已经尝试了很多解决方法,但还没有找到任何可行的方法。
'$ .get()'是异步的。阅读承诺。 – Interrobang 2012-03-15 23:10:19
'.delegate()'已弃用,请使用'.on()' – mowwwalker 2012-03-15 23:10:22
**绝不**将字符串传递给'setInterval()'或'setTimeout()'。这样做与使用'eval()'一样糟糕,并且只要使用变量,就会导致不可读和可能不安全的代码,因为您需要将它们插入到字符串中,而不是传递实际变量。正确的解决方案是'setInterval(function(){/ * your code *)},msecs);'。 'setTimeout()'同样适用。如果你只想调用一个没有任何参数的函数,你也可以直接传递函数名:'setInterval(someFunction,msecs);'(注意函数名后面有** no **'()') – ThiefMaster 2012-03-15 23:11:04