ページを閉じる(離れない)ときにjquery beforeunload?


83

「ページを離れてもよろしいですか?」を表示するにはどうすればよいですか?ユーザーが実際にページを閉じようとしたとき(ブラウザウィンドウまたはタブの[X]ボタンをクリックしたとき)ではなく、ページから移動しようとしたとき(別のリンクをクリック)。

クライアントは、ユーザーがページを閉じようとしたときに「ページを離れてもよろしいですか?ショッピングカートにまだ商品があります」というメッセージが表示されることを望んでいます。

残念ながら$(window).bind('beforeunload')、ユーザーがページを閉じたときにのみ起動しません。

jQuery:

function checkCart() { 
  $.ajax({
    url : 'index.php?route=module/cart/check',
    type : 'POST',
    dataType : 'json',
    success : function (result) {
       if (result) {
        $(window).bind('beforeunload', function(){
          return 'leave?';
        });
       }
    }
  })
}


1
できません。ブラウザを閉じるか、ユーザーがページから移動するかをプログラムで区別することはできません。
–meagar

@CrisWhatsエラーが発生しましたか?
Padmanathan J 2013

メッセージには、Ajax操作が実行されていることを示すコードが含まれています。考慮しなければならないものはありますか?(そのコードを除いて、明示的に言及しなかったため)
Cyril N.

ウィンドウが閉じているか、別のURLに移動しているかはわかりません。マルチタブブラウザを使用している場合は違いはありませんが、ハッシュナビゲーションを使用している場合(例:yourdomain.com/#path=/index) / news&id = 1)、ナビゲーション時にjavascriptをスローするように管理できます
alphakevin

回答:


145

これは、JQueryを使用して行うことができます。

以下の場合の例

<a href="your URL" id="navigate"> click here </a>

あなたJQueryは、

$(document).ready(function(){

    $('a').on('mousedown', stopNavigate);

    $('a').on('mouseleave', function () {
           $(window).on('beforeunload', function(){
                  return 'Are you sure you want to leave?';
           });
    });
});

function stopNavigate(){    
    $(window).off('beforeunload');
}

そして、Leaveメッセージアラートを取得するには、

$(window).on('beforeunload', function(){
      return 'Are you sure you want to leave?';
});

$(window).on('unload', function(){

         logout();

});

このソリューションはすべてのブラウザで機能し、私はそれをテストしました。


2
これは良い方法ですが(おそらく注意する必要がありonsubmitます)、ブラウザの[戻る]ボタンと[進む]ボタンでは機能しません。これに対する理想的な解決策はないと思います。
noseratio 2013

コードは問題ありません。ユーザーが「このページを離れる」ポップボタンをクリックした場合にlogout()関数を実行したい。しかし、ユーザーが「このページを離れる」をクリックしたかどうかをどのように検出できますか?
bit_hunter 2015

1
これ$(window).on('unload', function()はSafariでは実行されません。
Aarohi Kulkarni

1
ウィルbeforeunloadブラウザがOSのシャットダウンが原因で閉じている場合に発生?
techie_28 2016

4
(彼らは詐欺を防ぎたいので)あなたはクロームやFirefoxでもうカスタムメッセージを提供することはできません。developers.google.com/web/updates/2016/04/...
アダム

12

あなたのAjaxにjavascriptを試してください

window.onbeforeunload = function(){
  return 'Are you sure you want to leave?';
};

参照リンク

例2:

document.getElementsByClassName('eStore_buy_now_button')[0].onclick = function(){
    window.btn_clicked = true;
};
window.onbeforeunload = function(){
    if(!window.btn_clicked){
        return 'You must click "Buy Now" to make payment and finish your order. If you leave now your order will be canceled.';
    }
};

ここでは、ユーザーがボタンをクリックするまで、ページを離れるたびにユーザーに警告します。

デモ:http//jsfiddle.net/DerekL/GSWbB/show/


12

クレジットはここに行く必要があります: window.onbeforeunloadがトリガーされたときにリンクがクリックされたかどうかを検出する方法は?

基本的に、このソリューションは、リンクまたはウィンドウがアンロードイベントを発生させたかどうかを検出するリスナーを追加します。

var link_was_clicked = false;
document.addEventListener("click", function(e) {
   if (e.target.nodeName.toLowerCase() === 'a') {
      link_was_clicked = true;
   }
}, true);

window.onbeforeunload = function(e) {
    if(link_was_clicked) {
        return;
    }
    return confirm('Are you sure?');
}

2

ここhttps://stackoverflow.com/a/1632004/330867に示されているように、このページの出口を発信しているものを「フィルタリング」することで実装できます。

コメントで述べたように、これは他の質問のコードの新しいバージョンです。これには、質問で行うajaxリクエストも含まれています。

var canExit = true;

// For every function that will call an ajax query, you need to set the var "canExit" to false, then set it to false once the ajax is finished.

function checkCart() {
  canExit = false;
  $.ajax({
    url : 'index.php?route=module/cart/check',
    type : 'POST',
    dataType : 'json',
    success : function (result) {
       if (result) {
        canExit = true;
       }
    }
  })
}

$(document).on('click', 'a', function() {canExit = true;}); // can exit if it's a link
$(window).on('beforeunload', function() {
    if (canExit) return null; // null will allow exit without a question
    // Else, just return the message you want to display
    return "Do you really want to close?";
});

重要:グローバル変数を定義するべきではありません(ここcanExit)。これは、より単純なバージョンのためにここにあります。

確認メッセージを完全にオーバーライドすることはできないことに注意してください(少なくともクロムでは)。返されるメッセージは、Chromeから提供されたメッセージの前にのみ追加されます。理由は次のとおりです。OnBeforeUnloadダイアログをオーバーライドして自分のダイアログに置き換えるにはどうすればよいですか?


3
現在、jQuery1.7 .liveは非推奨です。代わりにを$(document).on('click', 'a', ...) 使用する必要があります。.on一般的にオーバー好ましい方法である古いのためのような機能.bind、それは次のようになります$('form').on('submit', ...)
t.niese 2013

この答えはもはやクロスブラウザではないと確信しています。誰かがそれをテストしましたか?
A. Wolff

述べたように、私はコードをコピー/貼り付けしただけです。私は最新バージョンで答えを編集します
シリル・N.

ありがとうございますが、残念ながらタブを閉じても確認が表示されません。
クリス2013

..そして私が作った大きなエラー(ドキュメントイベントとしてunloadを実行する代わりにクリックしてください)。
シリルN.

-1

これを試して、ajaxreturnステートメントを介してデータをロードして表示します。

<script type="text/javascript">
function closeWindow(){

    var Data = $.ajax({
        type : "POST",
        url : "file.txt",  //loading a simple text file for sample.
        cache : false,
        global : false,
        async : false,
        success : function(data) {
            return data;
        }

    }).responseText;


    return "Are you sure you want to leave the page? You still have "+Data+" items in your shopping cart";
}

window.onbeforeunload = closeWindow;
</script>

1
ユーザーがサイト内のリンクをクリックするたびに、同期AJAX呼び出しの応答をユーザーに待たせることはお勧めできません。
mattalxndr 2015年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.