1

stackoverflow.com(他のリソースでも)で多くの同様の質問を確認しましたが、回答が見つかりませんでした。そこで、質問を単純化して一般化しました。それは明白な解決策のようです:

$(document).ready(function() {
    var a = 3;
    var b = 5;

    // no message when pressed submit button
    $('form').submit(function() {
        $(window).off('beforeunload');
    });

    // confirm of the need to save
    $(window).on('beforeunload', function(e) {
        if (a != b)
            if (confirm('You changed data. Save?')) {
                $('form').submit();
                // alert('Your data is saved. (With alert submit() work only in FireFox!?)');
            }
    });
});

しかし、仕事を提出しないでください。alert()を使用する場合、FireFoxでのみ機能します。クロスブラウザソリューションを(おそらく遅滞なく)修正したいと思います。多分誰が根本的に別の方法の解決策を知っていますか。

PS最初の部分でここに説明されているアンロード前のいくつかの独創性について:https ://stackoverflow.com/a/6065085/1356425 、しかしこれは明らかに機能的な解決策ではありません。

4

3 に答える 3

0

同期AJAX(JAX)リクエストを使用し、イベントonUnloadまたはonBeforeUnloadのハンドラーをそれぞれのブラウザーで1回実行しました。このソリューションには、単一のほぼクロスブラウザーの動作があります。

例(jsfiddle上):

$(document).ready(function() {

    var form = $('form');
    var textareas = $('textarea');

    function array_compare(a_0, a_1) {
        if(a_0.length != a_1.length)
            return false;

        for(i = 0; i < a_0.length; i++)
            if(a_0[i] != a_1[i])
                return false;

        return true;
    }

    var flag = false; // flag to control the execution of the unloadHandler() once
    var a_open = []; // array with data before unload

    $('textarea').each(function(index) {
        a_open.push($(this).val());
    });

    function unloadHandler() {
        if (flag)
            return;

        var a_close = []; // array with data during unload
        $('textarea').each(function(index) {
            a_close.push($(this).val());
        });

        if (!array_compare(a_open, a_close)) {
            if (confirm('You changed the data, but not saved them. Save?')) {
                $.ajax({
                    type: 'POST',
                    url: '/echo/json/',
                    async: false,
                    data: form.serialize()/* {
                        json: JSON.stringify({
                            text: 'My test text.'
                        }),
                        delay: 3
                    } */,
                    success: function(data) {
                        if (data) {
                            console.log(data);
                            alert('All data is saved!');
                        }
                    }
                });
            }
        }

        flag = true;
    }

    // For FireFox, Chrome
    $(window).on('beforeunload', function () {
        unloadHandler();
    });

    // For Opera, Konqueror
    $(window).unload(function() {
        unloadHandler();
    });

    // Without message when pressed submit button
    $('form').submit(function() {
        $(window).off('beforeunload');
        $(window).off('unload');
    });

});
于 2013-03-11T14:55:53.387 に答える
0

ChromeとFirefoxのブロックは、onbeforeunload-eventの後に送信します。あなたは使用する必要があります

$(window).on('beforeunload', function(e) {
        if (a != b)
            return 'You\'ve changed the data. Leave page anyway?';
        }                
    });
于 2013-02-05T14:53:13.520 に答える
0

アンロード時にデータを送信する最良の方法は、データをlocalstorageに保存し、同じオリジンの他のページが要求されたときに次に送信することです。

  function sendBeacon(data) {

    data?dataArr.push(data):'';

    for (var i = 0, len = dataArr.length; i < len; i++) {
        $.getScript(dataArr[i], (function (index) {
            dataArr.splice(index, 1) //Updata dataArray on data submission
        }(i)))
    }
}

$(window).on('beforeunload', function () {
    localStorage.setItem('dataArr', JSON.stringify(dataArr));
})

var dataArr = JSON.parse(localStorage.getItem('dataArr'));

if (!dataArr) {
    dataArr = []; // Create Empty Array
} else {
    sendBeacon(dataArr); //Submit stored data
} 
于 2014-04-20T15:18:23.093 に答える