「未保存の変更」を実装しようとしていますWebアプリケーションで警告が表示されますが、これを適切に機能させるのに苦労しています。javascriptのonbeforeunloadイベントの存在は知っていますが、カスタムdivをモーダルポップアップとしてモーダルポップアップとして使用するよう要求されました。未保存の変更。
私がこれまでに得たのはこれです:
基本的にそれがすることは関数をバインドすることですページが汚れているかどうかを確認し、ポストバックを引き起こす可能性のあるリンクやボタンなどをクリックする前にポップアップでユーザーにプロンプトを表示します。私が今抱えている問題の1つは、最後のイベントではなく、続行を押すとキャンセルされたイベントがすべて実行されているように見えることです。
私はそれが最良の解決策ではないことを知っていますが、それが私の頭に浮かんだ唯一のものです。より良いアイデアは大歓迎です:)
他のすべてのイベントの前にイベントをバインドするjQuery関数:
$.fn.bindFirst = function(name, fn) {
this.bind(name, fn);
var handlers = this.data("events")[name.split(".")[0]];
if (handlers.length) {
var handler = handlers.pop();
handlers.splice(0, 0, handler);
}
};
function hideSaveWarning() {
$("#divSaveWarning").hide();
}
これにより、キャンセルされたアクションを実行するための続行ボタンが設定されます
function showSaveWarning(e) {
$("#divSaveWarning").show();
$("[id$="_btnContinue"]").click(function() {
e.currentTarget.click();
});
}
function onClickContinueWithoutSaving() {
hideSaveWarning();
setDirtyContent(false);
}
function SetSavePrompt() {
setDirtyContent(false);
$(":input, :radio, :button, a").not("[id$="_btnSave"]").bindFirst("click", function(e) {
if (isPageDirty) {
showSaveWarning(e);
return false;
}
});
}
ありがとう。 よろしく。
回答:
回答№1の場合は3これでうまくいくでしょうか。
http://mal.co.nz/code/jquery-dirty-forms/
回答№2の場合は1
私はこれをテストしていないので、おそらく微調整が必要になりますが、次のようなことができるはずです。
JavaScript:
<script language="javascript" type="text/javascript">
var formChanged = false;
window.onbeforeunload = function() {
if(!formChanged){
return;
}
return confirm("You have made changes to this form. Do you want to continue without saving these changes?");
}
function setDirty() {
formChanged = true;
}
</script>
コードビハインド:
protected void RegisterClientSaveChangeHandler()
{
foreach (Control ctrl in Page.Controls)
{
if (ctrl != null)
{
//make sure it doesn"t prompt for save if it"s a button click
if (ctrl is Button | ctrl is LinkButton | ctrl is ImageButton | ctrl is HyperLink)
((WebControl)ctrl).Attributes.Add("onclick", "javascript:formChanged=false;");
//make sure that all user input fields register for prompting when the value changes
if (ValidateAsInput(ctrl))
((WebControl)ctrl).Attributes.Add("onchange", "setDirty()");
}
}
}
private bool ValidateAsInput(Control ctrl)
{
return ctrl is TextBox | ctrl is CheckBox | ctrl is RadioButton | ctrl is DropDownList | ctrl is RadioButtonList;
}