2

onbeforeunload タグを設定して、保存されていないコンテンツがある場合にのみ、特定のページでのみユーザーが特定のページを離れないようにしようとしています (単一のマスター ページを使用しています)。onbeforeunload タグに ##anything## を返すと、常に JavaScript の確認がトリガーされ、ポップアップ内に ##anything## が配置されることがすぐにわかりました。明らかに、これは現在予期されている動作ですが、if ステートメントで制御できる独自の確認ボックスを使用するという私の考えが失われています。

私はこれを試しましたが、うまくいきませんでした:

<body class="yui-skin-sam" onbeforeunload="document.onFormClose();">

<script>
document.onFormClose = function () {
    if (document.getElementById('DirtyFlag').value == "true") {
        document.getElementById('DirtyFlag').value == "false";
        return 'You will lose all changes made since your last save';
    }
}
</script>

ここで、DirtyFlag は、保存されていない変更が存在する場合に true になる隠しフィールドです。関数内に return を入れることでうまくいくことを願っていましたが、そのような運はありませんでした。

私の質問は、 onbeforeunload タグを組み込みの return で使用して、そのフィールドの値を保留してバイパスする方法はありますか? または、(これはあまり理想的ではありませんが)getElementById タグを設定またはリセットしたすべての場所で、onbeforeunload タグを動的に追加または削除できると思います。残念ながら、私もそれを行う方法がわかりません。ああ、jQuery やその他の JavaScript ライブラリの使用は完全に制限されています。

4

2 に答える 2

3

これが設計どおりかどうかはわかりませんがreturn null、イベント ハンドラーからの場合は、必要な結果が得られる可能性があります。

window.onbeforeunload = function() {
    var el = document.getElementById("dirtyFlag");
    if (el.value === "true") {
        return 'You will lose all changes made since your last save';

    }
    else {
        return null;
    }
};

以下は FF で機能します: http://jsfiddle.net/andrewwhitaker/chZJ8/。hidden inputs の値を「true」に変更してみてください。確認ダイアログが表示されるはずです。 ただし、Chrome で動作させることができず、IE でテストすることもできません。これらのブラウザのいずれかでこれが機能することを誰かが確認できれば素晴らしいことです.

編集:使いやすく、Chrome で動作する別の例を追加します (JSFiddle の iFrame が問題を引き起こしていました)。http://andrewawhitaker.com/examples/onbeforeunload_test.htmlで例を確認してください。確認を表示するには、入力に「true」と入力します。入力の値が「true」でない場合、ダイアログは表示されません。FF と Chrome で動作しますが、IE は保証できません。

更新 2:これを行うより信頼性の高い方法は、おそらく、プログラムで値を設定するときにイベント リスナーを追加および削除することですdirtyFlag。イベント ハンドラーを適切に削除または追加するだけです。

var isDirty = function() { ... };
if (/* form is dirty*/) {
    window.onbeforeunload = isDirty;
}
else {
    window.onbeforeunload = null;
}
于 2010-12-23T17:44:43.513 に答える
1

のデフォルトの動作は変更できませんonbeforeunload

https://developer.mozilla.org/en/DOM/window.onbeforeunload

http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx

于 2010-12-23T17:31:36.413 に答える