クリック時にダイアログの構成を変更したい (この場合は、[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/ を参照してください。