21

質問を書き直します -

onbeforeunloadユーザーがページを離れた場合 (他のリンク/ウェブサイトまたはウィンドウ/タブを閉じた場合) にハンドラーに表示したいページを作成しようとしていますwe have a great offer for you?。提供ページにリダイレクトする必要があります。テストのためにリダイレクトしますleave the pagestay on the pageredirection is important, no compromisegoogle.com

私は次のようにプログラムを作りました -

var stayonthis = true;
  var a;
  function load() {
   window.onbeforeunload = function(e) {
        if(stayonthis){
         a = setTimeout('window.location.href="http://google.com";',100);
         stayonthis = false;    
         return "Do you really want to leave now?";
        }
        else {
            clearTimeout(a);
        }

    };
    window.onunload = function(e) {
         clearTimeout(a);
    };
  }
  window.onload = load;

しかし問題は、彼がリンクをクリックしてyahoo.com選択した場合leave the page、ヤフーではなくグーグルに行くことです:(

助けて !!前もって感謝します

ここにフィドルコードがあります

onbeforeunloadがiframeでうまく機能しないため、ここでテストする方法

4

6 に答える 6

8

このソリューションは、ブラウザの戻るボタンを使用する、アドレスバーに新しい URL を設定する、またはリンクを使用する、すべての場合に機能します。私が見つけたのは、onbeforeunload ハンドラーをトリガーしても、onbeforeunload ハンドラーに関連付けられたダイアログが表示されないことです。この場合 (トリガーが必要な場合)、確認ボックスを使用してユーザー メッセージを表示します。この回避策は、chrome/firefox および IE (7 から 10) でテストされています。

http://jsfiddle.net/W3vUB/4/show

http://jsfiddle.net/W3vUB/4/

編集: codepen に DEMO を設定します。どうやら jsFiddle はこのスニペット (?!) が気に入らないようです。Google がbing.comiframe 内にコンテンツを表示することを許可していないためです。

http://codepen.io/anon/pen/dYKKbZ

var a, b = false,
    c = "http://bing.com";

function triggerEvent(el, type) {
    if ((el[type] || false) && typeof el[type] == 'function') {
        el[type](el);
    }
}

$(function () {
    $('a:not([href^=#])').on('click', function (e) {
        e.preventDefault();
        if (confirm("Do you really want to leave now?")) c = this.href;


        triggerEvent(window, 'onbeforeunload');

    });
});

window.onbeforeunload = function (e) {
    if (b) return;
    a = setTimeout(function () {
        b = true;
        window.location.href = c;
        c = "http://bing.com";
        console.log(c);
    }, 500);
    return "Do you really want to leave now?";
}
window.onunload = function () {
    clearTimeout(a);
}
于 2013-05-29T21:46:05.727 に答える
1

この問題でしばらく遊んだ後、次のことを行いました。動作しているように見えますが、あまり信頼できません。最大の問題は、タイムアウト機能が、ブラウザがリンクの href 属性の URL に接続できるように、十分な期間をブリッジする必要があることです。

jsfiddle をデモンストレーションします。google.com の代わりに bing.com を使用した理由は次のとおりです。X-Frame-Options: SAMEORIGIN

var F = function(){}; // empty function
var offerUrl = 'http://bing.com';
var url;


var handler = function(e) {
    timeout = setTimeout(function () {
        console.log('location.assign');
        location.assign(offerUrl);

    /*
     * This value makes or breaks it.
     * You need enough time so the browser can make the connection to
     * the clicked links href else it will still redirect to the offer url.
     */
    }, 1400);

    // important!
    window.onbeforeunload = F;

    console.info('handler');
    return 'Do you wan\'t to leave now?';
};

window.onbeforeunload = handler;
于 2013-05-29T23:36:46.833 に答える
-1
<script>
        function endSession() {
            // Browser or Broswer tab is closed
            // Write code here
            alert('Browser or Broswer tab closed');
        }
</script>

<body onpagehide="endSession();">
于 2016-06-15T11:04:46.480 に答える