Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Дождаться ответа пользователя (https://javascript.ru/forum/events/45264-dozhdatsya-otveta-polzovatelya.html)

Rustam 21.02.2014 02:56

Дождаться ответа пользователя
 
Знаю, что тема стара как мир, но мне нужно дождаться ответа пользователя и "продолжить" выполнение функции. Может есть какие-нибудь решения без confirm (это работает, но мне необходимо показать пользователю форматированное сообщение) и setTimeout?

Ситуация такая:
есть платформа(sharepoint), которая предоставляет возможность написать функцию валидации данных SaveAction(). В этой функции я вызываю модальный диалог с вопросом "Сохранить?". Получаю ответ в колбеке и принимаю решение.

Функция SaveAction (название и атрибуты переопределить нельзя) дожидается ответа, только если мы используем confirm, что логично.
Как этого добиться в модальном диалоге?
Платформа Sharepoint ждет возврата true/false от этой функции, изменить это поведение невозможно.
function SaveAction(){
   ...
   var options = {
      callback: MyCallback
   }
   showModalDialog(options);
}

Deff 21.02.2014 03:08

Цитата:

Сообщение от Rustam
Как этого добиться в модальном диалоге?

Ну какой признак завершения ввода ?
Нажатие еnter ? , ввод единственного символа(или заранее определенных слов) ? нажатие на кнопку "Сохранить" ?

danik.js 21.02.2014 03:27

Цитата:

Сообщение от Rustam
Как этого добиться в модальном диалоге?

Никак. JS однопоточный, и этим все сказано.

Deff 21.02.2014 03:58

Цитата:

Сообщение от danik.js
Никак. JS однопоточный, и этим все сказано.

1. Тупой бесконечный цикл проверяющий наличие ответа
2. Кто мешает изменить логику, и запускать SaveAction() по завершении диалога модалки ?

danik.js 21.02.2014 04:31

Цитата:

Сообщение от Deff
1. Тупой бесконечный цикл проверяющий наличие ответа

Смотри мой комментарий выше, об однопоточности JS (причем один поток с ui).

Цитата:

Сообщение от Deff
2. Кто мешает изменить логику, и запускать SaveAction() по завершении диалога модалки ?

Никто. Разве что имеются для этого условия. Вот только это не ответ на прямо поставленный вопрос:
Цитата:

Сообщение от Rustam
Функция SaveAction (название и атрибуты переопределить нельзя) дожидается ответа, только если мы используем confirm, что логично.
Как этого добиться в модальном диалоге?


Deff 21.02.2014 05:16

Цитата:

Сообщение от danik.js
Смотри мой комментарий выше, об однопоточности JS (причем один поток с ui).


<input id="modal"   placeholder='Жду ввода "Yes"'>
<script type="text/javascript">

function showModalDialog(options){
var inp = document.getElementById('modal');
alert('Start Modal')
  while (inp.value != 'Yes') {
     var out=false;
  }
  return out=true;

}
var MyCallback = 1
function SaveAction(){
   //...
   var options = {}
   if( showModalDialog(options))alert('Диалог завершен!')
}
SaveAction()
</script>

danik.js 21.02.2014 05:20

Благодарю за наглядную демонстрацию моего комментария ;)

Deff 21.02.2014 05:34

danik.js,
Можно реализовать и многопоточность
Поставь перед циклом нужное число setTimeout
Короче коммент никчемный, ибо речь идёт в конце концов о возможности решении, а не безапеляционном ничего не дающем заявлении

danik.js 21.02.2014 06:28

Цитата:

Сообщение от Deff
Можно реализовать и многопоточность

:D
Цитата:

Сообщение от Deff
Короче коммент никчемный

Я лишь дал знать, что невозможно заменить строчку
if (confirm()) {} на if (myConfirm()) {}

kostyanet 21.02.2014 09:22

Цитата:

Сообщение от Rustam
Функция SaveAction (название и атрибуты переопределить нельзя) дожидается ответа, только если мы используем confirm, что логично.
Как этого добиться в модальном диалоге?

confirm это модальный диалог, а ваш хтмль никакого отношения к диалоговым окнам не имеет, потому что не окно, а просто кусок хтмл.

Что касается бывших методов совмещения то за злоупотребления очевидно их забанили:

Цитата:

Сообщение от Rustam
showModalDialog(options);

Цитата:

Deprecated
This feature has been removed from the Web. Though some browsers may still support it, it is in the process of being dropped. Do not use it in old or new projects. Pages or Web apps using it may break at any time.
Такая тема уже была, когда некий профессор заявил что на вебе ничего мониторить не надо. Не бывает типа тут 1 раз в секунду опрос кнопки.

Как видите бывает. Делается на самом деле элементарно через setInterval()


Часовой пояс GMT +3, время: 23:20.