jQuery Deferred and Dialog box
javascript, jquery, jquery-ui
Solution
Well, This can work.
Your dialog function... showDialog()
function confirmation(question) {
var defer = $.Deferred();
$('<div></div>')
.html(question)
.dialog({
autoOpen: true,
modal: true,
title: 'Confirmation',
buttons: {
"Yes": function () {
defer.resolve(true); //answer
$(this).dialog("close");
},
"No": function () {
defer.resolve(false); //answer
$(this).dialog("close");
}
},
close: function () {
$(this).remove(); //removes this dialog div from DOM
}
});
return defer.promise();
}
and then the code where you use the function...
function onclick(){
var question = "Do you want to start a war?";
confirmation(question).then(function (answer) {
if (answer) {
alert("this is obviously " + answer);//TRUE
} else {
alert("and then there is " + answer);//FALSE
}
});
}
This may seem wrong for most people. But there is always some situations where you just can't go without return from JQuery Dialog.
This will basically mimic the confirm() function. But with ugly code and a nice confirm box look :)
I hope this helps some people out.
**
EDIT: Bootstrap 3 Solution
**
I am now using [NakuPanda's][1] bootstrap library, It works really well. Basically the same as with JQueryUI but in the Bootstrap UI.
function bsConfirm(question) {
var defer = $.Deferred();
BootstrapDialog.show({
type: BootstrapDialog.TYPE_PRIMARY,
title: 'Confirmation',
message: question,
closeByBackdrop: false,
closeByKeyboard: false,
draggable: true,
buttons: [{
label: 'Yes',
action: function (dialog) {
defer.resolve(true);
dialog.close();
}
}, {
label: 'No',
action: function (dialog) {
defer.resolve(false);
dialog.close();
}
}],
close: function (dialog) {
dialog.remove();
}
});
return defer.promise();
}
function bsAlert(error, message) {
BootstrapDialog.show({
type: error ? BootstrapDialog.TYPE_DANGER : BootstrapDialog.TYPE_SUCCESS,
title: error ? "Error" : "Success",
message: message,
closeByBackdrop: false,
closeByKeyboard: false,
draggable: true,
buttons: [{
label: 'OK',
action: function (d) {
d.close();
}
}]
});
}
and using it (Pretty much the same way)
bsConfirm("Are you sure Bootstrap is what you wanted?").then(function (answer) {
if (answer) {
bsAlert("Well done! You have made the right choice");
} else {
bsAlert("I don't like you!");
}
});
Problem
``` function ValidateField(){ var bAllow= true; //some checking here if (bAllow == true && apl.val().trim() == "") { showDialog(); showDialog().done(function() { return true; // wanna return true, but not success }).fail(function() { return false; //wanna return false, but not success }); return false; //stop it to execute to next line } return bAllow; //success return } function showDialog(){ var def = $.Deferred(); var modPop = '<div id="diaCom" title="Information?"><p>something something</p></div>'; $("#diaCom").remove(); $(modPop).appendTo('body'); $("#diaCom").dialog({ resizable: false, draggable: false, height:150, width:300, modal: true, buttons: { "Ok": function() { def.resolve(); $(this).dialog("close"); }, "Cancel": function() { def.reject(); $(this).dialog("close"); } } }); return def.promise(); } //on click if (validateField() == true){ //do something }else{ //do something } ``` hi everyone, any chance to return the value? I wish to return the true and false through showDialog().done() and fail for validatefield() function, but it not working as what I want, I can't assign to bAllow as I had already have a return false to hold the dialog to execute its next line, any idea? Or it is correct to do like these?