Функции JavaScript выполняются, не ожидая функций в вышеупомянутых строках, чтобы вернуться?
-
19-09-2019 - |
Вопрос
Я связал функцию с кнопкой отправки формы. Я хочу, чтобы функция всплыла в диалоговом окне IFRAME и ожидал взаимодействия с пользователем, а затем отправила форму (через пост Ajax).
Но поведение, которое я вижу, состоит в том, что диалоговое окно появляется, но функция продолжает выполнять и выполняет пост Ajax, хотя вызов диалогового окна еще не вернулся. Мне нужен какой -то способ остановить выполнение кода, пока эта функция диалога не вернется.
У меня есть что -то вроде:
submitForm: function () {
<call a function that pops up a dialog, doesn't return until user interacts>
new Ajax.Updater('dialogContainer', url, {
...........
}
});
return false;
}
Я думаю, что это ожидаемое поведение JavaScript, но я не уверен, как его обойти ...
Решение
JavaScript в браузере выполнится последовательно, поэтому, очевидно, ваш вызов запустить диалоговое окно iframe не Дождитесь взаимодействия с пользователем и немедленно возвращается. Я предполагаю, что любая библиотека, которую вы используете для всплывающего диалогового окна, будет иметь какую -то функцию обратного вызова, которую он будет выполнять на основе действия пользователя. Так что вам просто нужно переместить свой new Ajax.Updater(....);
код в функцию обратного вызова.
Другие советы
Основываясь на базовых знаниях, которые у меня есть из JavaScript, я думаю, что это нормальное поведение, пока диалоговое окно работает независимо от вашего кода (код назвал его).
В вашем диалоговом окне есть какой -нибудь JavaScript, работающий в нем? Потому что я думаю, если это так, вы можете передать функцию в качестве параметра (обратный вызов, который выполнит желаемый код), который будет вызван из диалогового окна, когда он возвращается.
Я бы сказал, что вы должны вызвать первую функцию также через Ajax. И я думаю, что вы используете прототип.
У вас есть функция обратного вызова в Ajax.request и Ajax.updater. Затем в функции Oncomplete может запустить вторую функцию.
как
Oncomplete: function () {new ajax.updater ('DialogContainer', url, {...........}}); }
Если ваш целевой веб -клиент является только Internet Explorer, вы можете использовать window.showmodaldialog. Он имеет хорошее свойство блокировки потока JavaScript в родительском окне.
Showmodaldialog был реализован в Firefox, но я не знаю, блокируется ли функция в Firefox.