5

ユーザーがテキストボックスに何かを入力した場合、ブラウザの更新または戻るボタンを押したときにユーザーに警告したいと思います。そこで、window.onbeforeunload関数を使用してそれを実行しました。

window.onbeforeunload = function () {
    if (if user hasn't entered any thing) {
        return;
    }
    return 'Entered data will be lost.';
};

このJavaScriptコードは、FirefoxとChromeで正常に機能します。ただし、IEでは、この関数は部分的なポストバックのあるボタンに対して起動します。IEでこの問題を克服するための解決策はありますか?ありがとう :)

  • IEのバグが原因で発生します
4

3 に答える 3

5

window.onbeforeunload 関数が IE で正しく実行されません。一部の部分的なポストバックも「ページを離れようとしている」と見なされるためです。ページ上のリンクに href="javascript:...." が含まれている場合 (ASP.Net LinkBut​​ton はこのようにレンダリングされます)、IE はリンクがクリックされたときにウィンドウ アンロード イベントを誤って起動します。だから、私はdirtyflag変数を保持して追加しました

var __ignoreDirtyFlag = false;

$(document).ready(function () {
    if ($.browser.msie) {
        $('[href^="javascript:"]').bind('click.ignoreDirtyFlag', function () {
            __ignoreDirtyFlag = true;
        });
    }
}); 

ページが読み込まれると、 href^="javascript:" で始まるリンクにその機能が割り当てられます。リンクがクリックされると、__ingoreDirtyFlag 変数が true になります。その後追加

window.onbeforeunload = function globalWindowUnload() {
    if (!__ignoreDirtyFlag && isDataFilled == true) {
        return "You have unsaved changes on this page. If you leave this page, those changes will be lost.";
    }
    __ignoreDirtyFlag = false;
    return;
};

ページで使用した ASP 更新パネルがある場合、リンクへの上記の関数バインディングは削除されます。そのため、更新パネルが更新されたときに、関数をリンクに再度バインドする必要があります。

それで、

function foo() {
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
}

function endRequestHandler(sender, args) {
    // Do your stuff
    if ($.browser.msie) {
        $('[href^="javascript:"]').bind('click.ignoreDirtyFlag', function () {
            __ignoreDirtyFlag = true;
        });
    }
}

body タグの onload メソッドには foo() メソッドを割り当てました。 <body onload="foo()">

このハックは IE とすべてのブラウザーで正常に動作します :) ありがとう

于 2013-02-13T09:22:20.753 に答える
0

`var inFormOrLink = false; var url_auth = ''; var __ignoreDirtyFlag = false;

document).ready(function () {

if ($.browser.msie) {
    $('').bind('click.ignoreDirtyFlag', function () { __ignoreDirtyFlag = true; alert("teste luiz") });

    window.onbeforeunload = function () {
        if (!__ignoreDirtyFlag) {
            return "Tem certeza que deseja encerrar a sessão TESTE LUIZ?";
        }
        __ignoreDirtyFlag = false;
        return;
    };
}
else {
    $('*').live('click', function () { inFormOrLink = true; alert("Passou aqui 1 LUIZ"); });
    $('*').bind('submit', function () { inFormOrLink = true; alert("Passou aqui 2"); });
    window.onbeforeunload = function () {
        if (!inFormOrLink) {

            if (window.location.href.indexOf("DEV2") != -1) {
                $.post("/DEV2/SSQ/AUTH/LOGOUT", null);
                return 'Tem certeza que deseja encerrar a sessão TESTE DEV2?';
            }`
于 2017-01-05T13:24:02.680 に答える
0

目的は、ユーザーがブラウザーを閉じるか、宛先 URL を手動で変更するたびに、ユーザーをログアウトすることです。

var url_auth = '';var __ignoreDirtyFlag = false;$(document).ready(function () {if ($.browser.msie) {$('a').live('click', function () { __ignoreDirtyFlag = true;}); $('*').bind('submit', function () { __ignoreDirtyFlag = true; });window.onbeforeunload = function () {if (!__ignoreDirtyFlag) {if (window.location.href.indexOf("DEV2") != -1) {$.post("/DEV2/SSQ/AUTH/LOGOUT", null);return 'Tem certeza que deseja encerrar a sessão ?';}}};
于 2017-01-05T18:28:57.430 に答える