JavaScript синхронная настраиваемая подсказка - PullRequest
9 голосов
/ 11 января 2009

Мне нужно использовать пользовательское приглашение, как показано в демонстрационной версии плагина jQuery . Проблема в том, что все пользовательские приглашения зависят от обратного вызова, они асинхронизированы, мне нужно, чтобы они были синхронными.

Мне нужно сделать что-то вроде:

alert("Your name is " + myPrompt("What's your name?"));

Где myPrompt - модальная настраиваемая синхронная подсказка.

Возможно ли это?

Спасибо, Наий

Ответы [ 2 ]

3 голосов
/ 11 января 2009

Мне нужно, чтобы они были синхронными.

Возможно, вам придется пересмотреть свои потребности. Поскольку IE7 + запрещает даже window.prompt (), кросс-браузерный способ получения синхронного ввода отсутствует.

Существует showModalDialog, но он не доступен глобально, и, на мой взгляд, довольно враждебен пользователю. В большинстве браузеров синхронность блокирует не только ваши скрипты, но и пользовательский интерфейс браузера, что может быть очень неудобно.

Обратные вызовы не так уж плохи IMO:

myPrompt("What's your name?", function(x) {
    alert("Your name is "+x);
});
3 голосов
/ 11 января 2009

Вы можете использовать JQuery UI Dialog для отображения DIV в качестве модального диалога.

См. http://docs.jquery.com/UI/Dialog/dialog#options

Однако для поддержки действительно синхронного диалога (вызова функции блокировки) вам понадобится некоторая помощь из браузера. Не все браузеры поддерживают это. IE работает уже много лет, и недавно Mozilla добавила showModalDialog в Firefox.

Рассматривали ли вы использование замыкания для продолжения обратного вызова?

Пример

function dosomethingwhichneedsprompt()
{
   var a = "stuff";
   var o = {}
   //other code
   displayPrompt("PleaseInputStuff",o)  //o modified by prompt would like this to block
   //continue to use data on o and the variable a after prompt dismissed.
}

Так как displayPrompt не может реально блокировать все браузеры, фреймворки будут использовать обратные вызовы вместо: -

function doSomethingWhichNeedsPrompt(fnContinue)
{
   var a = "stuff";
   var o = {}
   //other code
   displayPrompt("PleaseInputStuff",o, fnCallback)
   function fnCallback() {
       //continue to use data on o and the variable a after prompt dismissed.
       if (fnContinue) fnContinue();
  }
}

Конечно, все, что вызывает doSomethingWhichNeedsPrompt, также должно знать о своей асинхронной природе, и для doSomethingWhichNeedsPrompt может потребоваться принять параметр функции, который он вызывает после выполнения всей своей работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...