페이지를 닫을 때 (떠나지 않을 때) 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

@Cris 무슨 오류가 발생 했습니까 ??
Padmanathan J 2013 년

메시지에는 Ajax 작업이 실행 중임을 나타내는 코드가 포함되어 있습니다. 고려해야 할 몇 가지 사항이 있습니까? (그 코드를 제외하고, 당신이 explicitily을 했나요하지 않았기 때문에)
시릴 N.

창이 닫혀 있는지 또는 다른 URL로 이동하는지 알 수 없습니다. 멀티탭 브라우저를 사용하는 경우 차이가 없지만 해시 탐색을 사용하는 경우 (예 : yourdomain.com/#path=/index / 뉴스 & ID = 1 ), 당신은 navagiting 때 자바 스크립트를 던져 관리 할 수 있습니다
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');
}

그리고 얻을 남기기 메시지 알림이 될 것입니다,

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

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

         logout();

});

이 솔루션은 모든 브라우저에서 작동하며 테스트했습니다.


2
이것은 좋은 것입니다 (아마도 관찰해야합니다 onsubmit). 그러나 브라우저의 뒤로 및 앞으로 버튼에서는 작동하지 않습니다. 나는 이것에 대한 이상적인 해결책이 없을 것으로 예상합니다.
noseratio

코드는 괜찮습니다. 사용자가 "이 페이지에서 나가기"팝업 버튼을 클릭하면 logout () 함수를 실행하고 싶습니다. 하지만 사용자가 "이 페이지에서 나가기"를 클릭했는지 여부를 어떻게 알 수 있습니까?
Bit_hunter

1
이것은 $(window).on('unload', function()Safari에서 실행되지 않습니다.
Aarohi Kulkarni

1
beforeunload브라우저가 OS 종료로 인해 폐쇄되는 경우에 발생?
techie_28 apr.

4
사기를 방지하기 위해 Chrome 또는 Firefox에서 더 이상 맞춤 메시지를 제공 할 수 없습니다. developers.google.com/web/updates/2016/04/…
Adam

12

Ajax에 자바 스크립트 사용해보기

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
현재 jQuery 1.7 .live는 더 이상 사용되지 않습니다. 대신 $(document).on('click', 'a', ...) 사용되어야합니다. .on일반적으로 이상 선호하는 방법입니다 대한 있도록 기능 .bind이 될 것이다 $('form').on('submit', ...).
t.niese 2013-09-13

이 답변은 더 이상 크로스 브라우저가 아니라고 확신합니다. 누군가 테스트 했나요?
A. Wolff

언급했듯이 코드 만 복사 / 붙여 넣기했습니다. 나는 최신 버전으로 대답을 편집 할 수 있습니다
시릴 N.에게

감사합니다.하지만 안타깝게도 탭을 닫을 때 확인이 표시되지 않습니다.
크리스

.. 큰 오류가 발생했습니다 (문서 이벤트로 beforeunload 대신 클릭).
Cyril N.

-1

이것을 시도 ajax하고 return 문을 통해 데이터를로드 하고 표시합니다.

<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.