Функции Javascript выполняются, не дожидаясь возврата функций в строках выше? - PullRequest
1 голос
/ 08 января 2010

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

Ответы [ 4 ]

4 голосов
/ 08 января 2010

Javascript в браузере будет выполняться последовательно, поэтому очевидно, что ваш вызов для запуска диалогового окна iframe не ожидает взаимодействия с пользователем и немедленно возвращается. Я предполагаю, что любая библиотека, которую вы используете для всплывающего диалогового окна, будет иметь какую-то функцию обратного вызова, которую она будет выполнять вместо действий пользователя. Так что вам просто нужно переместить ваш код new Ajax.Updater(....); в функцию обратного вызова.

2 голосов
/ 08 января 2010

Основываясь на моих базовых знаниях о javascript, я думаю, что это нормальное поведение, если диалоговое окно работает независимо от вашего кода (кода, который его вызвал).

Есть ли в вашем диалоговом окне какой-либо javascript? Потому что, я думаю, если это так, вы можете передать функцию в качестве параметра (обратный вызов, который выполнит нужный вам код), который будет вызываться из диалогового окна при его возврате.

1 голос
/ 08 января 2010

Я бы сказал, что вы должны вызывать первую функцию также через ajax. и я думаю, что вы используете прототип.

У вас есть функция обратного вызова onComplete в объектах Ajax.Request и Ajax.Updater. Затем в функции onComplete можно запустить вторую функцию.

как

onComplete: function () { новый Ajax.Updater ('dialogContainer', URL, { ........... } }); }

0 голосов
/ 08 января 2010

Если вашим целевым веб-клиентом является только Internet Explorer, вы можете использовать window.showModalDialog. Он имеет свойство nice блокировать поток JavaScript в родительском окне.

showModalDialog был реализован в Firefox, но я не знаю, блокирует ли функция в Firefox.

...