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()

danik.js 21.02.2014 11:31

kostyanet, ты с каждым комментарием доказываешь что твоя компетенция в программировании стремится к нулю. Твой аппаратный мозг не приемлет парадигмы программирования.

Цитата:

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

Что должен делать твой setInterval?

Rustam 21.02.2014 12:58

Цитата:

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

1. То ли я тупой, то ли это не работает :) То есть получить ответ пользователя - не проблема. Проблема дождаться этого ответа, так как метод PreSaveAction() просто прет вперед и возвращает true/false. "Остановить" его у меня получается только confirm'ом или setTimeout'ом. Но confrim не позволяет мне форматировать сообщение, а setTimeout не дает нужной гибкости/отзывчивости.
2) Sharepoint при попытке сохранить элемент вызывает метод PreSaveItem, который вызывает метод PreSaveAction (SaveAction - это он и есть, ошибся немного) если он создан. Таким образом программисту дают сделать валидацию, т.е. достаточно написать свой метод PreSaveAction. Но я не могу изменить порядок его вызова, его аргументы и т.д.


Цитата:

Сообщение от kostyanet (Сообщение 298710)
confirm это модальный диалог, а ваш хтмль никакого отношения к диалоговым окнам не имеет, потому что не окно, а просто кусок хтмл.

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





Такая тема уже была, когда некий профессор заявил что на вебе ничего мониторить не надо. Не бывает типа тут 1 раз в секунду опрос кнопки.

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

"мой хтмль" - самый настоящий модальный диалог. И он не deprecated. Просто это "встроенный" диалог sharepoint'a. Полное наименование SP.UI.ModalDialog.showModalDialog. Он может открывать как "настоящую" страницу, так и просто кусок html


Спасибо всем за помощь. Чуда не случилось - javascript не обмануть. Придется подменять кнопку и костылями изменять порядок вызова PreSaveAction()

Aetae 21.02.2014 13:07

Конкретно за sharepoint не скажу, но обычно продукты мелкомягких позволяют пользоваться vbscript, а также сущностями vbscript в jscript. А уже там есть всякие Sleep и прочее.

kostyanet 22.02.2014 05:28

Цитата:

Сообщение от Rustam
Просто это "встроенный" диалог sharepoint'a.

Не все знают об офисных фичах. Я подумал шарипоинт - очередная либа на js для браузера. Оказалось там браузер и рядом не стоял.

С мс связываться опасно. У них там свои понятия по изложению документации в которых разобраться простому смертному за бесплатно не всегда реально.

Дайте ссылку на метод.

kostyanet 22.02.2014 06:11

Цитата:

Сообщение от danik.js
Что должен делать твой setInterval?

Он будет делать callback.

Автору. И еще такая особенность платформ МС - они не популярны. Например чтобы написать простенький скрипт на WScript мне приходится сперва рыться в msdn, ничерта там не поняв шариться с вопросами по инету и там ничего не найдя вообще делать усилие, возвращаться к документации пытаясь вникнуть в ход глубоких мыслей персонала МС.

Ваш вопрос задан ровно 1 раз

http://sharepoint.stackexchange.com/...ialog-response

Ну полтора

http://stackoverflow.com/questions/1...-in-sharepoint

потому без ответа остался.

Выберите другую платформу и полегчает.

kostyanet 22.02.2014 06:15

Кстати, если вы ищите, то подделывайте свою национальность, иначе гугль загадит результаты национальными мифами. Делается так: надо выйти с гугля, убить куки, перейти на com и в адресную строку вписать webhp?complete=0

ruslan_mart 04.03.2014 14:18

Deff, тоже как-то пробовал делать такой вариант с бесконечным циклом и вот что скажу: лучше не делать так, браузер начинает виснуть, да и как-то не правильно это.


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