您想在单击时更改对话框的配置(在本例中为 Ok 按钮的行为)。为此,您有很多解决方案,所有这些都很难看(imo)。我建议即时生成一个对话框,并在使用后将其销毁,如下所示:
$("#delete").click(function(ev) {
ev.preventDefault(); // preventDefault should suffice, no return false
var href = $(this).attr("href");
var dialog = $("<div>Are you sure?</div>");
$(dialog).dialog({
resizable: false,
autoOpen: true,
modal: true,
buttons: {
'OK': function() {
window.location = href;
$( this ).dialog( "close" );
},
'Cancel': function() {
$( this ).dialog( "close" );
}
},
close: {
$( this ).remove();
}
});
});
或者更好的是,将确认对话框封装到一个函数中,以便您可以重复使用它,如下所示:
function confirmDialog(msg) {
var dialog = $("<div>"+msg+"</div>");
var def = $.Deferred();
$(dialog).dialog({
resizable: false,
autoOpen: true,
modal: true,
buttons: {
'OK': function() {
def.resolve();
$( this ).dialog( "close" );
},
'Cancel': function() {
def.reject();
$( this ).dialog( "close" );
}
},
close: {
$( this ).remove();
}
});
return def.promise();
}
然后像这样使用它
confirmDialog("are your sure?").done(function() {
window.location = $(this).attr("href");
}).fail(function() {
// cry a little
});
在关闭对话框之前,您可能必须检查延迟对象是否已被拒绝或解决,以确保在关闭时确认拒绝(而不仅仅是在按下“取消”按钮时)。这可以通过 def.state() === "pending" 条件来完成。
有关 jquery deferred 的更多信息:http: //api.jquery.com/category/deferred-object/