2010-06-29 206 views
2

我的代碼嘗試重新填充選項並選擇一個元素。 問題是填充很多任務重新填充3個選擇框。我的方法控制返回,但是當我嘗試選擇時,選項尚未填充。這種情況發生在較慢的系統/瀏覽器中。 (特別是在IE)有沒有辦法來防止這種使用jQuery或什麼?當所有選項加載/或正在加載時,瀏覽器是否觸發了任何事件?這似乎是因爲瀏覽器有時需要時間來激活選項,但方法控制已經返回。處理延遲填充選擇選項

function myMethod() { 
    populateOptions(); 
    if(document.getElementById('Id').options[index].text==existId){ 
     $("#Id").val(existId); 
    } 
} 

function populateOptions() { 
//Make ajax call 
    // repopulates options 
} 
+1

請發佈AJAX代碼。 – joshperry 2010-06-29 13:34:56

回答

1

由於AJAX調用都是異步的,你需要移動你的價值分配後運行用於填充您的select代碼。否則,值分配發生在響應返回之前。

我假設任何代碼填充select設置爲運行收到響應。因此,在代碼之後放置您的值選擇應該可以解決問題。

(換句話說,它會去populateOptions()功能。)

除此之外,這是很難提供一個解決方案,沒有看到你的代碼。


編輯:下面是如何這可能是工作的幾個例子。其中任何一項都會比請求中的設置async: false更好。

您可以將需要等待響應的代碼放入success:回調中。

function populateOptions() { 
    $.ajax({ 
     url: "some/path", 
     success: function(resp) { 
      // Place ANY code that needs to wait for the response in here. 
      // This way it will not run until the successful response is received. 
     } 
    }); 
} 

或者你可以將需要等待另一個函數內部的響應,並調用它從success:回調中的代碼。

function populateOptions() { 
    $.ajax({ 
     url: "some/path", 
     success: function(resp) { 
       // Call this function when the successful response is received. 
      successFunction(resp); 
     } 
    }); 
} 
function successFunction(resp) { 

    // Place ANY code that needs to wait for the response in here. 

} 

或者說,如果populateOptions()應以不同的方式重複使用,所以你需要一個不同的回調,可以從將在success:回調內部調用另一個函數傳遞一個函數。

function myMethod() { 
     // Send a function as an argument when you call populateOptions() 
    populateOptions(function(resp){alert(resp);}); 

    // Code that does NOT need to wait can still go here 
} 
function populateOptions(callback_fn) { // Receive the function that was sent 
    $.ajax({ 
     url: "some/path", 
     success: function(resp) { 
       // Call the function that was sent 
      callback_fn(resp); 
     } 
    }); 
} 

或採取上述同樣的例子,你實際上可以使用在通過爲success:回調函數。

function myMethod() { 
     // Send a function as an argument when you call populateOptions() 
    populateOptions(function(resp){alert(resp);}); 

    // Code that does NOT need to wait can still go here 
} 
function populateOptions(callback_fn) { // Receive the function that was sent 
    $.ajax({ 
     url: "some/path", 
     success: callback_fn(resp) // Now the function passed is the callback 
    }); 
} 
+0

是的。就像你說的,一旦我們收到響應,我們在populateOptions()中填充select和thats。所以populateOptions()返回所有操作的控制權完成。但有時瀏覽器需要時間來填充選項。這與瀏覽器一致。如果瀏覽器快速運行, – 2010-06-30 06:03:25

+1

@Jigar - 你說*「populateOptions()所有操作的返回控制都完成了」*,但是當涉及到一個AJAX請求時這不是真的。一個AJAX請求(默認情況下)允許代碼在它得到響應之前繼續運行。因此,在選項填充之前,控件會返回。這是常見的情況。試着移動你的代碼在populateOptions()中選擇一個值,然後在填充的代碼之後。或者用'populateOptions()'的代碼編輯你的問題。 – user113716 2010-06-30 11:42:57

+0

@Jigar - 問題解決了嗎? – user113716 2010-08-24 18:19:43