我有两个输入文本字段和一个“保存”按钮。
<input type="text" id="myInput" />
<input type="text" id="searchResult"/>
<button id="myButton>save</button>
myInput
文本字段有onchange 事件,然后发送 Ajax 请求以获取一些数据并将结果显示到searchResult
文本字段。
保存按钮具有单击事件,可验证searchResult
文本字段的输入是否为空字符串等。如果确定,则继续保存。
$("myInput").change(function() {
var userInput = $("myInput").val(); //get value from the text field
var responseText = callAjaxToGetData(userInput): //XHR request to get some data
$("searchResult").val( responseText ); //show the XHR result here
});
$("myButton").click(function() {
var searchResultField = $("searchResult").val(); //get value from the searchResult field
var isOK = validate(searchResultField); //check empty string and such
if(isOK) { saveDataViaAjax(userInput); }
});
问题
当用户在文本字段中输入一些文本然后单击“save"
按钮时,
onchange event
被触发,callAjaxToGetData()
被调用。(XHR)before
callAjaxToGetData()
完成并填写 searchResult 文本字段,myButtononclick event
被触发。在 onclick 事件处理程序方面,验证失败,因为 searchResult 字段仍然为空。
callAjaxToGetData()
最后完成并填写 searchResult 文本字段。
理想情况下,首先完成 callAjaxToGetData() 然后在 onclick 事件中继续该过程,这样验证就不会失败。
我猜这似乎是人们会面临的很常见的情况,所以我想知道你们是如何解决这个问题的?
我正在考虑将间隔放入 onclick 事件中,如下所示(这需要 responseText 是一个全局变量)
$("myButton").click(function() {
var interval = setInterval(function() { //call every 500ms
//if responseText is not null that means i know the ajax inside of onchange event is completed for sure.
if( responseText != null ) {
clearInterval(interval);
var searchResultField = $("searchResult").val(); //get value from the searchResult field
var isOK = validate(searchResultField); //check empty string and such
if(isOK) { saveDataViaAjax(userInput); }
}
}, 500);
});