Можно ли имитировать заблокированный диалог, например «window.confirm()»?

Я хочу смоделировать диалоговое окно блока, например window.alert(), window.confirm() или window.prompt(), с помощью DIV+JavaScript. Кажется простым использовать функцию обратного вызова. Но я хочу заблокировать процесс, пока отображается диалоговое окно подтверждения.

То есть я хочу определить такую ​​функцию, как:

var Alert = function(){ balabala };

который возвращает true или false после нажатия кнопки "ОК" или "Отмена".

ИЗМЕНИТЬ:

На данный момент я определил функцию с именем Confirm(), и теперь мне нужно вызвать ее как

Confirm(*callback*);

и в реализации я показываю диалоговое окно, подобное подтверждению, и при нажатии кнопки «ОК» будет выполнен обратный вызов. Интересно, можно ли переписать его так, чтобы я мог называть его как

if(Confirm()) {
    callback(); 
} else {
    balabala;
}

person zidianqs    schedule 24.07.2011    source источник
comment
если вы можете заблокировать весь процесс, я бы сообщил об этом создателю браузера как об ошибке. Единственное, что вы должны иметь возможность блокировать из javascript, — это выполнение javascript на этой единственной вкладке.   -  person CodesInChaos    schedule 24.07.2011


Ответы (2)


Вы не можете запретить пользователю использовать свой браузер IE, переключать вкладки и выполнять другие действия на них до того, как они вернутся к вам, как это делает вызов alert(). Но вы можете запретить им использовать что-либо на вашей странице, пока они не ответят на вопрос. Вы можете просто заполнить все тело блоком div с абсолютным позиционированием, который имеет z-index больше, чем остальная часть вашей страницы, и дать всплывающему окну z-index один выше этого и отцентрировать его.

Конечно, пользователь по-прежнему может использовать такие вещи, как инструменты разработчика Chrome или Firebug, чтобы удалить блокирующий div, так что это небезопасно.

Изменить Я неправильно понял ваш вопрос. Вы не заботитесь о визуальной блокировке страницы, но хотите, чтобы возвращаемое значение всплывающего окна было синхронным с остальной частью вашего скрипта, а не асинхронным с обратным вызовом. Я не уверен, как это сделать.

Возможно, это будет вам полезно: https://developer.mozilla.org/en/Code_snippets/Threads#Waiting_for_a_background_task_to_complete

person Paul    schedule 24.07.2011
comment
Ага. Теперь для подробностей я определил функцию с именем Confirm(), и теперь я должен вызывать ее как Confirm(*callback), а в реализации я показываю диалоговое окно, например подтверждение, и при нажатии кнопки OK будет выполнен обратный вызов. Интересно, можно ли переписать его так, чтобы я мог вызывать его как if(Confirm()) callback(); еще балабала - person zidianqs; 24.07.2011

К сожалению, невозможно имитировать вызовы синхронного кода только с помощью JavaScript. Вы можете создавать чистые диалоги на основе DOM, но для того, чтобы код выполнялся при их закрытии, вам нужно, чтобы он принимал обратный вызов или возвращал обещание. К сожалению, это не самый чистый код.

person DuxPrime    schedule 16.12.2015