我的代码尝试重新填充选项并选择一个元素。 问题是填充很多任务重新填充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
}
答案 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
});
}