2011-09-05 43 views
3

我有一個窗體自動完成代碼,當一個文本框中的值更改時執行。它看起來像這樣:奇怪的問題 - 更改事件觸發器只在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,則所有工作都應該如此。

+2

只是一個想法,但IE瀏覽器的JavaScript引擎是相當挑剔自己認爲有效的代碼。這行'var postData = {myvalue:$(caller).val()}'末尾需要一個分號來完成對象定義。不應該有所作爲,但你永遠不會知道...... –

+0

+1 Tieson的評論 - 同樣適用於列表中的尾隨逗號 - 大多數其他瀏覽器都可以,但IE不是。否則,這聽起來像是一本教科書Heisenbug ;-) – RET

+0

+1謝謝,我忽略了 –

回答

0

當遠程驗證請求完成時,在字段丟失焦點的同時,似乎會出現問題。我認爲它發生的是executeAfterCurrentAjaxCall中的回調函數立即執行,並且在那一刻jquery驗證響應尚未完成,所以$(caller).valid()返回false。我仍然不知道如何alert("field is valid")在這種情況下有所幫助,這可能表明我錯了,而其他事情正在發生。但是,改變executeAfterCurrentAjaxCall所以看起來,這似乎解決我的問題:

function executeAfterCurrentAjax(callback) { 
    if (ajaxCounter > 0) { 
     setTimeout(function() { executeAfterCurrentAjax(callback); }, 100); 
    } 
    else { 
     setTimeout(callback, 10); 
    } 
} 
+0

這是一個解決方法,而不是真正的解決方案,所以如果有人遇到了更好的答案,我會留下幾天的問題。 –