經過一些調試之後,似乎每個語句之前的代碼都在每個語句完成之前執行。腳本在每個完成之前被執行
我也注意到,每個函數循環兩次。
這是發生了什麼:
- 單擊#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