У меня есть два текстовых поля ввода и одна кнопка «Сохранить».
<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)до завершения
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);
});