Страницы

Поиск по вопросам

среда, 22 января 2020 г.

javascript alert синхронность или задержка выполнения скрипта

#javascript


Хочу перегрузить стандартное поведение alert. Делается это просто:
function alert(_m){
    //code 
    // предположим здесь я рисую окошко из div элементов и одной кнопкой, просто
дизайн меняю.
}

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


Ответы

Ответ 1



Во-первых, Firebug - это все-таки не просто скрипт, а расширение, имеющее доступ к API платформы (например, Mozilla). Потому и остановы в указанных точках он делает с помощью движка. Во-вторых, у браузеров есть такое понятие как "UI thread" - это поток, разделяемый (в смысле "shared") UI-событиями на странице и пользовательским JS на этой же странице. Это разделение означает, что нельзя одновременно выполнять JS-код и выдавать пользователю отзывчивую страницу. Можно организовать нечто похожее и рабочее (так обычно и делают) с помощью setTimeout()/setInterval(), но по сути это лишь откладывание на потом - это не запуск отдельного потока в полном смысле этого слова, это, скорее, перенесение части кода в "будущее" все того же UI-потока. Из вышеприведенного можно сделать вывод, что на пользовательском JS создать блокирующую функцию, чтобы она работала в точности как alert(), нельзя. В конце концов, вам понадобится нечто вроде бесконечного цикла для проверки какого-нибудь условия, который займет всю работу UI-потока. При этом вам нельзя будет использовать setInterval(), так как тогда ваша alert() не будет блокирующей. Возможно, в мои размышления вкралась ошибка, буду рад любым возражениям.

Ответ 2



Есть дурацкий, но вариант - прописать callback: function alert(x, c){ prompt(x); if(c) c(); } alert('test', function(){alert('stop');}); А если вы выводите сообщение div'ами, можете повесить callback на кнопку ОК.

Комментариев нет:

Отправить комментарий