处理填充选择选项的延迟

时间:2010-06-29 13:28:56

标签: jquery browser

我的代码尝试重新填充选项并选择一个元素。 问题是填充很多任务重新填充3个选择框。我的方法控件返回但是当我尝试选择时,尚未填充选项。使用较慢的系统/浏览器会发生这种情况。 (特别是在IE上)有没有办法防止这种使用jQuery或什么?当加载/或正在加载所有选项时,是否有任何事件由浏览器触发。这似乎是因为浏览器有时需要时间来进行popualte选项,但方法控件已经返回。

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

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

1 个答案:

答案 0 :(得分:1)

由于默认情况下AJAX调用是异步的,因此您需要移动值赋值以填充select的代码后运行。否则,值响应将在响应返回之前发生。

我假设任何代码填充select设置为在收到响应后运行。因此,在该代码之后放置您的值选择应该可以解决问题。

(换句话说,它将 in 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
    });
}