2010-08-21 3 views
4

У меня есть существующий веб-приложение, которое использует window.showmodaldialog() показать определенные формы и на основе возвращаемого значения он выполняет некоторые другие JavaScriptsСоздание JS выполнения блокировки диалоговых окон с помощью JQuery

Например:

var retVal = window.showmodaldialog('...'); 

if (retVal==XXX) 
    callXXX(); 
else 
    callYYY(); 

Когда showModalDialog() выполняется, он блокирует выполнение JS в главном окне до тех пор, пока модальность не будет закрыта.

Я пытаюсь заменить эти модальные окна на диалоги jQuery, но проблема в том, что после выполнения $(...).dialog().open() выполнение JavaScript не ждет закрытия диалогового окна.

Я знаю, что есть jQuery API, которые позволяют мне настраивать функцию обратного вызова, но для меня это связано с большими изменениями. В любом случае, я могу приостановить выполнение JavaScript до тех пор, пока диалог не будет закрыт (я все равно должен выполнить сценарии из диалога).

ответ

1

Я боюсь, что невозможно «приостановить» выполнение javascript, пока вы не захотите изначально .. Функция showModalDialog делает это, потому что реализована браузером.

Вы можете просто сделать свой «ожидающий» механизм вручную, и вам нужно будет сделать изменения (как вы сказали, они много, но не должны быть сложными изменениями).

Это то, что приходит на ум прямо сейчас:

  • Воспользоваться обратных вызовов (для меня, лучший на сегодняшний день)
  • Используйте setTimeout и свой собственный механизм, как g.d.d.c answered.
  • Использование некоторых пользовательских потоков javascript library.

Но если вы открыты для плагинов, я только что нашел этот плагин JQuery: BlockUI и some others, что, возможно, поможет вам. И должно быть еще несколько плагинов, которые уже реализуют то, что я упоминал в вышеприведенных пунктах.

3

К сожалению, нет. Вам нужно будет использовать функции обратного вызова. «Блокировка», как это в JavaScript, является плохой идеей, потому что есть только один поток выполнения, а JavaScript использует модель Event Driven.

Вы могли бы сделать что-то вроде этого «ждать» для возвращаемого значения, но это не «блок» другое исполнение на всех:

var myReturn, 
myInterval = setInterval(function() { 
    if (myReturn != undefined) { 
    clearInterval(myInterval); 
    // Rest of processing code here. 
    } 
}, 50); 

$('myContainer').dialog(close: function() { 
    myReturn = 'Dialog Closed'; 
}).open(); 

Попытка «блок» или «пауза» JavaScript исполнение следует избегать - язык просто не предназначен для этого.

+0

+1 для общей почты. В качестве побочного примечания нет необходимости устанавливать значение переменной неопределенным при его объявлении. 'var myReturn,' такой же, как 'var myReturn = undefined,'. Хотя это более подробно, некоторые из нас-байтеры предпочитают более короткую версию :-) –