我有一個窗體自動完成代碼,當一個文本框中的值更改時執行。它看起來像這樣:奇怪的問題 - 更改事件觸發器只在IE中調試
$('#myTextBoxId)').change(function() {
var caller = $(this);
var ajaxurl = '@Url.Action("Autocomplete", "Ajax")';
var postData = { myvalue: $(caller).val() }
executeAfterCurrentAjax(function() {
//alert("executing after ajax");
if ($(caller).valid()) {
//alert("field is valid");
$.ajax({ type: 'POST',
url: ajaxurl,
data: postData,
success: function (data) {
//some code that handles ajax call result to update form
}
});
}
});
});
由於此表單字段(myTextBoxId)已遠程驗證,我有此功能:
function executeAfterCurrentAjax(callback) {
if (ajaxCounter > 0) {
setTimeout(function() { executeAfterCurrentAjax(callback); }, 100);
}
else {
callback();
}
}
此功能可讓我遠程驗證結束後,執行該自動完成通話僅當文本框具有有效值時纔會自動完成。 ajaxCounter
變量是全球性的,其值在全局AJAX事件設置:
$(document).ajaxStart(function() {
ajaxCounter++;
});
$(document).ajaxComplete(function() {
ajaxCounter--;
if (ajaxCounter <= 0) {
ajaxCounter = 0;
}
});
我的問題是在IE(9),並且只有當我通常使用我的形式出現。問題是executeAfterCurrentAjax(function(){...})中的函數體;有時因某種原因不執行。如果我取消註釋兩個警報中的任何一個,每次都有效,但如果沒有,ajax調用大部分時間都沒有發生(我通過在服務器上調試來檢查)。如果我打開開發人員工具並嘗試捕獲網絡或調試JavaScript,則所有工作都應該如此。
只是一個想法,但IE瀏覽器的JavaScript引擎是相當挑剔自己認爲有效的代碼。這行'var postData = {myvalue:$(caller).val()}'末尾需要一個分號來完成對象定義。不應該有所作爲,但你永遠不會知道...... –
+1 Tieson的評論 - 同樣適用於列表中的尾隨逗號 - 大多數其他瀏覽器都可以,但IE不是。否則,這聽起來像是一本教科書Heisenbug ;-) – RET
+1謝謝,我忽略了 –