Функции JavaScript выполняются, не ожидая функций в вышеупомянутых строках, чтобы вернуться?

StackOverflow https://stackoverflow.com/questions/2026847

Вопрос

Я связал функцию с кнопкой отправки формы. Я хочу, чтобы функция всплыла в диалоговом окне 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top