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
}
大家好,有什么机会回报价值?我希望通过showDialog()。done()返回true和false,并且对于validatefield()函数失败,但它不能正常工作,我无法分配给bAllow,因为我已经有一个返回false来保存执行下一行的对话框,任何想法?或者这样做是正确的吗?
答案 0 :(得分:29)
嗯,这可行。
你的对话功能...... showDialog()
function confirmation(question) {
var defer = $.Deferred();
$('<div></div>')
.html(question)
.dialog({
autoOpen: true,
modal: true,
title: 'Confirmation',
buttons: {
"Yes": function () {
defer.resolve("true");//this text 'true' can be anything. But for this usage, it should be true or false.
$(this).dialog("close");
},
"No": function () {
defer.resolve("false");//this text 'false' can be anything. But for this usage, it should be true or false.
$(this).dialog("close");
}
},
close: function () {
$(this).remove();
}
});
return defer.promise();
}
然后是使用该函数的代码...
function onclick(){
var question = "Do you want to start a war?";
confirmation(question).then(function (answer) {
var ansbool = Boolean.parse(answer.toString());
if(ansbool){
alert("this is obviously " + ansbool);//TRUE
} else {
alert("and then there is " + ansbool);//FALSE
}
});
}
对大多数人来说,这似乎是错误的。但总有一些情况下你不能没有从JQuery Dialog返回。
这基本上模仿confirm()函数。但是使用丑陋的代码和一个很好的确认框看起来:)
我希望这可以帮助一些人。
<小时/>
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();
}
}]
});
}
并使用它(几乎相同)
bsConfirm("Are you sure Bootstrap is what you wanted?").then(function (a) {
if (a) {
bsAlert("Well done! You have made the right choice");
} else {
bsAlert("I don't like you!");
}
});
答案 1 :(得分:5)
我创建了this JSFIDDLE并更改了布尔解析,因为它正在爆炸。谢谢,皮埃尔!这为我节省了很多时间。
的javascript:
function confirmation(question) {
var defer = $.Deferred();
$('<div></div>')
.html(question)
.dialog({
autoOpen: true,
modal: true,
title: 'Confirmation',
buttons: {
"Yes": function () {
defer.resolve("true");//this text 'true' can be anything. But for this usage, it should be true or false.
$(this).dialog("close");
},
"No": function () {
defer.resolve("false");//this text 'false' can be anything. But for this usage, it should be true or false.
$(this).dialog("close");
}
},
close: function () {
//$(this).remove();
$(this).dialog('destroy').remove()
}
});
return defer.promise();
};
function onclick(){
var question = "Do you want to start a war?";
confirmation(question).then(function (answer) {
console.log(answer);
var ansbool = (String(answer) == "true");
if(ansbool){
alert("this is obviously " + ansbool);//TRUE
} else {
alert("and then there is " + ansbool);//FALSE
}
});
}
$("#item").on('click', onclick);
HTML:
<button id="item">Hello, click me.</button>
答案 2 :(得分:1)
为什么不使用解决方法instaed(&#34; false&#34;)。然后,您将能够将对象作为参数传递。 假设您有多个输入字段集,每个字段集都有一个删除按钮:
function confirmation(question,obj) {
var defer = $.Deferred();
$('<div></div>')
.html(question)
.dialog({
autoOpen: true,
modal: true,
title: 'Confirmation',
buttons: {
"Oui": function () {
defer.resolve(obj);// pass the object to delete to the defer object
$(this).dialog("close");
},
"Non": function () {
defer.reject();//reject, no need to pass the object
$(this).dialog("close");
}
},
close: function () {
$(this).dialog('destroy').remove()
}
});
return defer.promise();
}
$(document).on("click", ".btn-suppr",function (){// all delete buttons having a class btn-suppr
var question = "Are you sure to delete this fieldset ?";
confirmation(question,$(this)).then(function (obj) {
obj.parent('fieldset').remove(); // remove the parent fieldset of the delete button if confirmed
});
});