1

Web フォーム ページに JQuery と Ajax の部分的なポストバックが混在しており、ユーザーが変更を保存せずにページから移動するのを止めようとしています。

ページ上のデータバリデータの1つが無効でない限り、うまく機能しています。送信ボタンには、基本的に onbeforeunload イベントを無効にする jquery メソッドがあります。バリデーターが無効な場合、私はそれが発生したくないので、クライアント側の検証をオフにし、Page.Validate() と呼ばれるメソッドで、ページが無効な場合は、スタートアップを登録しようとしましたここで説明されているスクリプトを次のようにリセットします。

if (!Page.IsValid) {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "", "setConfirmUnload(true);", true);
            return;
        }

クリック送信を実行し、ページが無効な場合、setConfirmUnload(true) への呼び出しが発生しますが、メソッドが見つかりません (おそらく、ポストバックが発生するたびにこれを再設定したためでしょうか?

実際のエラーは「JavaScript ランタイム エラー: 'setConfirmUnload' は未定義です」です。これは、おそらく bindEvents() がまだ再実行されていないために作成されたためでしょうか?

私の問題は、部分的なポストバックと自動ポストバックを使用して、ユーザーがフォームを変更したときにデータを設定しているという事実に起因すると思います。デフォルトでは、それは私のjqueryをブリッツするので、document.ready()とポストバックでjquery呼び出しを再バインドします

<script type="text/javascript">
        // attach the event binding function to every partial update
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (evt, args) {
            bindEvents();
        });
    </script>

そして、私の Bind Events メソッドは次のようになります。

 function bindEvents() {

        // stuff removed for brevity here...


        $(function () {
            // Prevent accidental navigation away
            $(':input, select').bind(
                'change', function () { setConfirmUnload(true); });

            $('.noprompt-required').click(
                function () { setConfirmUnload(false); });

            function setConfirmUnload(on) {
                window.onbeforeunload = on ? unloadMessage : null;
            }
            function unloadMessage() {
                return ('You have entered new data on this page. ' +
                        'If you navigate away from this page without ' +
                        'first saving your data, the changes will be lost.');
            }

            window.onerror = UnspecifiedErrorHandler;
            function UnspecifiedErrorHandler() {
                return true;
            }

        });

    }        

その場合、 bindEvents() 呼び出しが発生した後にスクリプトを強制的に実行する方法はありますか?

4

0 に答える 0