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