Okay, I've spent whole day reading Q&A but still couldn't get it done. I needed to create a customized confirm() wherein instead of the default dialog, I use bootstrap modal to return true if user clicks Yes, return false for No.
Example:
<a href="remove.php?id=3" onclick="return custom_confirm('Are you sure you want to remove this?');" />
and my custom confirm function is:
function custom_confirm(message) {
// put message into the body of modal
$('#modal-custom-confirmation').on('show.bs.modal', function (event) {
// store current modal reference
var modal = $(this);
// update modal body help text
modal.find('.modal-body #modal-help-text').text(message);
});
// show modal ringer custom confirmation
$('#modal-custom-confirmation').modal('show');
// if Yes button is clicked, return true
// if No button is clicked, return false
// logic here...
}
My modal is here:
<!-- modal: custom confirmation -->
<div class="modal fade text-left" id="modal-custom-confirmation" tabindex="-1" role="dialog" aria-labelledby="modal-help-title">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<strong class="modal-title" id="modal-help-title">Confirm</strong>
</div><!-- /.modal-header -->
<div class="modal-body">
<p id="modal-help-text"></p>
</div><!-- /.modal-body -->
<div class="modal-footer">
<button type="button" class="btn btn-success">Yes</button>
<button type="button" class="btn btn-default" data-dismiss="modal">No</button>
</div><!-- /.modal-footer -->
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
Click event is inherently non blocking and async. Unlike native confirm. So you can't return true or false. You have to somehow handle the async nature of user interaction.
The most straight forward way would be to pass a callback
function custom_confirm(message, callback) {
// put message into the body of modal
$('#modal-custom-confirmation').on('show.bs.modal', function (event) {
// store current modal reference
var modal = $(this);
// update modal body help text
modal.find('.modal-body #modal-help-text').text(message);
});
// show modal ringer custom confirmation
$('#modal-custom-confirmation').modal('show');
$('#modal-custom-confirmation button.ok').off().on('click', function() {
// close window
$('#modal-custom-confirmation').modal('hide');
// and callback
callback(true);
});
$('#modal-custom-confirmation button.cancel').off().on('click', function() {
// close window
$('#modal-custom-confirmation').modal('hide');
// callback
callback(false);
});
}
And in HTML
...
<div class="modal-footer">
<button type="button" class="btn btn-success ok">Yes</button>
<button type="button" class="btn btn-default cancel">No</button>
</div>
...
If you want to actually return something you could return a Promise that would resolve to either true or false. But still async code remains async.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With