Значение ожидания в начальной загрузке подтверждает модальный?
Вопрос кажется глупым, но я не могу понять, как ждать кнопку подтверждения для возврата значения. Javascript основан на одном потоке, поэтому мне нужно знать, как я могу установить что-то вроде функции обратного вызова до нажатия кнопки, это структура диалога:
<div class="modal fade" id="confirmation" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Confirm</h4>
</div>
<div class="modal-body">
<label>Are you sure?</label>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default btn-ok" data-dismiss="modal">Continue</button>
<a class="btn btn-danger" data-dismiss="modal">Cancel
</a>
</div>
</div>
</div>
</div>
<button id="go">press me</button>
и JS:
$(document).ready(function()
{
$('#go').click(function()
{
$('#confirmation').modal('show');
//if the user has pressed the .btn-ok button then an alert appear
alert(true);
})
});
На практике, когда пользователь нажимает кнопку, появляется диалоговое окно начальной загрузки, мне нужно отображать предупреждение, только если пользователь нажимает кнопку "Продолжить". .bnt-ok
, но на самом деле я не могу понять, как это сделать. Кто-то может показать мне, как? Благодарю.
ОБНОВИТЬ
1 пользователь запускает событие и функцию one
выполняется:
one: function()
{
if(two()) //if function two return true then show alert
{
alert(true);
}
}
2 Функция два показывает диалог начальной загрузки:
two: function()
{
$('#confirmation').show();
//here I need to check if the user has pressed btn-ok, if yes,
//I need to return true, otherwise false
return true;
}
3 Проблема в функции two
, потому что нет способа остановить функцию, пока пользователь не нажмет кнопку. Таким образом, отображается диалоговое окно подтверждения, но функция возвращает true. Как я могу ждать клика пользователя?
1 ответ
Просто прикрепите обработчик кликов к .btn-ok
элемент.
В качестве таких:
$('.btn-ok').click(function(){
alert(true);
});
РЕДАКТИРОВАТЬ:
Проверьте решение вашей проблемы, используя обещания ES6.
const modal = new Promise(function(resolve, reject){
$('#confirmation').modal('show');
$('#confirmation .btn-ok').click(function(){
resolve("user clicked");
});
$('#confirmation .btn-danger').click(function(){
reject("user clicked cancel");
});
}).then(function(val){
//val is your returned value. argument called with resolve.
alert(val);
}).catch(function(err){
//user clicked cancel
console.log("user clicked cancel", err)
});
Обновлен jsFiddle. Обратите внимание, что он использует обещания ES6, и вы должны проверить поддержку браузера или перенести свой код (например, с помощью babel).
Я хорошо понимаю эту проблему. Решение Pure Typescript выглядит следующим образом:
const result: boolean = confirm(message);
if (result == true) {
return ConfirmationResult.ConfirmationResultPositive;
} else {
return ConfirmationResult.ConfirmationResultNegative;
}
где ConfirmationResult.ConfirmationResultPositive является некоторым перечислением. Функция подтверждения сделки показывает стандартное окно js и ожидает пользовательский результат (блокирует дальнейшее выполнение). К сожалению, у начальной загрузки нет этой стандартной функциональности. Например, WinForms, WPF и UMP (clear async) имеют одинаковое стандартное поведение. Я также полагаю, что с Promise<> мы можем обойти его с помощью начальной загрузки.