복붙노트

[JQUERY] 브라우저 또는 탭 폐쇄 감지

JQUERY

브라우저 또는 탭 폐쇄 감지

해결법


  1. 1.내가 정확하게 당신을 얻을 경우, 당신은 탭 / 창을 효과적으로 닫을 때 알고 싶어요. 음, AFAIK 식료품의 종류를 감지하는 자바 스크립트의 유일한 방법으로 onUnload & onbeforeunload 이벤트입니다.

    내가 정확하게 당신을 얻을 경우, 당신은 탭 / 창을 효과적으로 닫을 때 알고 싶어요. 음, AFAIK 식료품의 종류를 감지하는 자바 스크립트의 유일한 방법으로 onUnload & onbeforeunload 이벤트입니다.

    당신이 링크를 통해 사이트를 떠나거나 브라우저 버튼을 다시 불행하게도 (또는 다행스럽게도?), 그 이벤트는 해고된다. 이것이 내가 줄 수있는 최선의 대답은 그래서, 난 당신이 기본적으로 자바 스크립트에서 순수한 가까이 감지 할 수 있다고 생각하지 않습니다. 내가 잘못 여기있어 경우에 저를 수정합니다.


  2. 2.MDN 문서에서

    MDN 문서에서

    몇 가지 이유를 들어, 웹킷 기반 브라우저는 대화 상자에 대한 사양을 따르지 않습니다. 거의 상호 동작하는 예제는 아래의 예에서 가까운 것이다.

    window.addEventListener("beforeunload", function (e) {
      var confirmationMessage = "\o/";
    
      (e || window.event).returnValue = confirmationMessage; //Gecko + IE
      return confirmationMessage;                            //Webkit, Safari, Chrome
    });
    

    모든 브라우저를 처리하기위한이 예.


  3. 3.간단한 솔루션

    간단한 솔루션

    window.onbeforeunload = function () {
        return "Do you really want to close?";
    };
    

  4. 4.

    <body onbeforeunload="ConfirmClose()" onunload="HandleOnClose()">
    
    var myclose = false;
    
    function ConfirmClose()
    {
        if (event.clientY < 0)
        {
            event.returnValue = 'You have closed the browser. Do you want to logout from your application?';
            setTimeout('myclose=false',10);
            myclose=true;
        }
    }
    
    function HandleOnClose()
    {
        if (myclose==true) 
        {
            //the url of your logout page which invalidate session on logout 
            location.replace('/contextpath/j_spring_security_logout') ;
        }   
    }
    

    // 이렇게하면 하나 개의 탭 탭 또는 브라우저를 종료하는 경우, IE7에서 작업이다


  5. 5.나는 때 자동으로 브라우저 또는 탭 닫히고 사용자가 로그 아웃 할 필요하지만,하지 않을 경우 다른 링크에 대한 사용자 이동합니다. 나 또한 그렇게되면 프롬프트 확인이 표시 싶지 않았다. 특히 IE와 가장자리로, 잠시 동안 고민 한 후, 여기에 내가이 대답하여 접근 떨어져 내놓고 후 (IE 11, 가장자리, 크롬, 파이어 폭스와 함께 작동 확인)하고 끝난거야.

    나는 때 자동으로 브라우저 또는 탭 닫히고 사용자가 로그 아웃 할 필요하지만,하지 않을 경우 다른 링크에 대한 사용자 이동합니다. 나 또한 그렇게되면 프롬프트 확인이 표시 싶지 않았다. 특히 IE와 가장자리로, 잠시 동안 고민 한 후, 여기에 내가이 대답하여 접근 떨어져 내놓고 후 (IE 11, 가장자리, 크롬, 파이어 폭스와 함께 작동 확인)하고 끝난거야.

    먼저, JS에서 beforeunload 이벤트 핸들러 서버 카운트 다운 타이머를 시작한다. 아약스 호출은 IE 및 에지 제대로 작동하려면 동기화 할 필요가있다. 또한 사용 반환해야; 이처럼 보여주는에서 확인 대화 상자를 방지하기 위해 :

        window.addEventListener("beforeunload", function (e) {        
          $.ajax({
              type: "POST",
              url: startTimerUrl,
              async: false           
          });
          return;
        });
    

    타이머 세트 false로 cancelLogout 플래그를 시작. 사용자 새로 고침 다른 내부 링크 페이지 나 이동했을 경우, 서버의 cancelLogout 플래그가 true로 설정됩니다. 타이머 이벤트 경과 후에는 로그 아웃 이벤트가 취소되었는지 여부를 확인하기 위해 cancelLogout 플래그를 검사한다. 타이머가 취소 된 경우는 타이머를 정지합니다. 브라우저 또는 탭이 닫힌 경우, cancelLogout 플래그는 거짓 남아있을 것입니다 및 이벤트 핸들러는 사용자가 로그 아웃 할 것입니다.

    구현상의주의 : 나는 ASP.NET MVC 5를 사용하고 있는데 내가 재정의 Controller.OnActionExecuted () 메소드에서 로그 아웃을 취소하고있다.


  6. 6.유사한 작업의 경우, 브라우저 탭을 닫을 때까지 로컬에 데이터를 저장하는 sessionStorage를 사용할 수 있습니다.

    유사한 작업의 경우, 브라우저 탭을 닫을 때까지 로컬에 데이터를 저장하는 sessionStorage를 사용할 수 있습니다.

    하나의 세션 (브라우저 탭을 닫을 때 데이터가 삭제됩니다)에 대한 sessionStorage 오브젝트 데이터를 저장합니다. (W3 스쿨)

    이건 내 펜이야.

    <div id="Notice">
        <span title="remove this until browser tab is closed"><u>dismiss</u>.</span>
    </div>
    <script>
        $("#Notice").click(function() {
         //set sessionStorage on click
            sessionStorage.setItem("dismissNotice", "Hello");
            $("#Notice").remove();
        });
        if (sessionStorage.getItem("dismissNotice"))
        //When sessionStorage is set Do stuff...
            $("#Notice").remove();
    </script>
    

  7. 7.이벤트 - 미안 해요, 난 기존의 답변 중 하나에 댓글을 추가 할 수 없습니다 만, 경우에 당신이 경고 대화 상자의 종류를 구현하고 싶었, 난 그냥 어떤 이벤트 핸들러 함수 인수를 가지고 언급하고 싶었다. 귀하의 경우에 당신은, 자동으로 페이지를 떠나 허용 자신의 대화를 발행에서는 event.preventDefault ()를 호출 할 수 있습니다. 나는 표준 추한 안전하지 않은 경고를 사용하는 것보다이 방법이 더 나은 옵션을 고려 (). 나는 개인적으로 kendoWindow 객체 기반 대화 상자 내 자신의 세트를 구현 (거의 완벽하다 Telerik의 검도 UI, kendoGrid 및 kendoEditor의 제외, 오픈 소스 화). 또한 jQuery를 UI에서 대화 상자를 사용할 수 있습니다. 제발 참고 그런 일이 비동기, 당신은 모든 버튼의 onclick 이벤트 핸들러를 바인딩해야합니다, 그러나 이것은 아주 쉽게 구현하기 위해 모든 것을,하지만.

    이벤트 - 미안 해요, 난 기존의 답변 중 하나에 댓글을 추가 할 수 없습니다 만, 경우에 당신이 경고 대화 상자의 종류를 구현하고 싶었, 난 그냥 어떤 이벤트 핸들러 함수 인수를 가지고 언급하고 싶었다. 귀하의 경우에 당신은, 자동으로 페이지를 떠나 허용 자신의 대화를 발행에서는 event.preventDefault ()를 호출 할 수 있습니다. 나는 표준 추한 안전하지 않은 경고를 사용하는 것보다이 방법이 더 나은 옵션을 고려 (). 나는 개인적으로 kendoWindow 객체 기반 대화 상자 내 자신의 세트를 구현 (거의 완벽하다 Telerik의 검도 UI, kendoGrid 및 kendoEditor의 제외, 오픈 소스 화). 또한 jQuery를 UI에서 대화 상자를 사용할 수 있습니다. 제발 참고 그런 일이 비동기, 당신은 모든 버튼의 onclick 이벤트 핸들러를 바인딩해야합니다, 그러나 이것은 아주 쉽게 구현하기 위해 모든 것을,하지만.

    그러나, 나는 할 실제 close 이벤트의 부족 끔찍한 동의 : 당신은, 예를 들어, 단지 실제 가까운 경우에 백 엔드에서 세션 상태를 재설정하려는 경우, 그것이 문제입니다.


  8. 8.이벤트는 없지만,이 글을 쓰는 시점의 모든 주요 브라우저에서 지원됩니다 window.closed 속성이있다. 당신이 정말로 알 필요가 따라서 경우 해당 속성을 확인하기 위해 창을 폴링 할 수있다.

    이벤트는 없지만,이 글을 쓰는 시점의 모든 주요 브라우저에서 지원됩니다 window.closed 속성이있다. 당신이 정말로 알 필요가 따라서 경우 해당 속성을 확인하기 위해 창을 폴링 할 수있다.

    경우 (myWindow.closed) {일을}

    노트 : 폴링 아무것도 일반적으로 가장 좋은 방법이 아닙니다. 가능하면 window.onbeforeunload 이벤트는 멀리 이동 한 경우에만주의는 또한 화재 있다는 것을 사용해야합니다.


  9. 9.

    $(window).unload( function () { alert("Bye now!"); } );
    

  10. 10.나는 나의 모든 브라우저에서 작동하는 방법을 발견했다.

    나는 나의 모든 브라우저에서 작동하는 방법을 발견했다.

    버전을 다음에서 테스트 : 파이어 폭스 57, 인터넷 익스플로러 11, 에지 (41), 최신 크롬 중 하나 (내 버전이 표시되지 않습니다)

      $(document).ready(function(){         
    
            var validNavigation = false;
    
            // Attach the event keypress to exclude the F5 refresh (includes normal refresh)
            $(document).bind('keypress', function(e) {
                if (e.keyCode == 116){
                    validNavigation = true;
                }
            });
    
            // Attach the event click for all links in the page
            $("a").bind("click", function() {
                validNavigation = true;
            });
    
            // Attach the event submit for all forms in the page
            $("form").bind("submit", function() {
              validNavigation = true;
            });
    
            // Attach the event click for all inputs in the page
            $("input[type=submit]").bind("click", function() {
              validNavigation = true;
            }); 
    
            window.onbeforeunload = function() {                
                if (!validNavigation) {     
                    // ------->  code comes here
                }
            };
    
      });
    

  11. 11.그것을 사용하려고 :

    그것을 사용하려고 :

    window.onbeforeunload = function (event) {
        var message = 'Important: Please click on \'Save\' button to leave this page.';
        if (typeof event == 'undefined') {
            event = window.event;
        }
        if (event) {
            event.returnValue = message;
        }
        return message;
    };
    
    $(function () {
        $("a").not('#lnkLogOut').click(function () {
            window.onbeforeunload = null;
        });
        $(".btn").click(function () {
            window.onbeforeunload = null;
    });
    });
    

  12. 12.아무도 (8+ 년 후) 아직 언급되지 않았기 때문에, • 웹 소켓이 닫힌 탭을 감지하는 또 다른 효과적인 방법이 될 수 있습니다. 만큼 탭이 호스트에서 열려 뾰족으로, 클라이언트는 호스트에 대한 활성 웹 소켓 연결을 유지할 수 있습니다.

    아무도 (8+ 년 후) 아직 언급되지 않았기 때문에, • 웹 소켓이 닫힌 탭을 감지하는 또 다른 효과적인 방법이 될 수 있습니다. 만큼 탭이 호스트에서 열려 뾰족으로, 클라이언트는 호스트에 대한 활성 웹 소켓 연결을 유지할 수 있습니다.

    주의하십시오 웹 소켓이 이미하고있는 일에서 추가 상당한 오버 헤드를 필요로하지 않는 경우이 솔루션은 정말 프로젝트 만 가능한 것을 바랍니다 참고.

    합리적인 제한 시간 (예를 들면, 2- 분) 내에서, 서버 측은 웹 소켓이 분리 된 후, 클라이언트가 사라진 것을 확인할 수 및 업로드 임시 파일을 삭제로서 요구되는 어떤 동작을 수행. (내 매우 전문 사용-경우, 내 목표는 세 초 웹 소켓 연결 방울 모든 CGI / FastCGI를 활동 종료 후 로컬 호스트 애플리케이션 서버를 종료하는 것이 었습니다 -. 다른 연결 유지 연결이 나에게 영향을주지 않습니다)

    나는 문제 (이 답변에서 권장하는대로)으로 onUnload 이벤트 핸들러가 비콘 제대로 작동 점점 있었다. 탭을 닫으면 비콘을 트리거 표시하고 열려있는 탭이 방법으로 할 수 잠재적 원인이 문제에 트리거하지 않았다. 웹 소켓 연결이 대략 주변의 응용 프로그램 내에서 탭 닫히고 전환 페이지는 단순히 잘 지연 창에서 새 웹 소켓 연결을 엽니 다 것과 같은 시간을 닫기 때문에 좀 더 깨끗하게으로 실행 된 문제를 해결했다.


  13. 13.

    window.onbeforeunload = function() {
      console.log('event');
      return false; //here also can be string, that will be shown to the user
    }
    

  14. 14.

    window.addEventListener("beforeunload", function (e) {
     var confirmationMessage = "tab close";
    
     (e || window.event).returnValue = confirmationMessage;     //Gecko + IE
     sendkeylog(confirmationMessage);
     return confirmationMessage;                                //Webkit, Safari, Chrome etc.
    }); 
    

  15. 15.

    //Detect Browser or Tab Close Events
    $(window).on('beforeunload',function(e) {
      e = e || window.event;
      var localStorageTime = localStorage.getItem('storagetime')
      if(localStorageTime!=null && localStorageTime!=undefined){
        var currentTime = new Date().getTime(),
            timeDifference = currentTime - localStorageTime;
    
        if(timeDifference<25){//Browser Closed
           localStorage.removeItem('storagetime');
        }else{//Browser Tab Closed
           localStorage.setItem('storagetime',new Date().getTime());
        }
    
      }else{
        localStorage.setItem('storagetime',new Date().getTime());
      }
    });
    

    JSFiddle 링크

    모두 안녕하세요, 저는 브라우저 로컬 스토리지와 타임 스탬프를 사용하여 클릭 '브라우저 및 탭 닫기 이벤트 감지'을 달성 할 수 있었다. 여러분 모두가이 솔루션을 사용하여 문제를 해결 얻을 것이다 바랍니다.

    나의 초기 연구 후에 나는 우리가 브라우저를 닫을 때, 브라우저가 완전히 닫 브라우저에 의해 모든 탭 하나를 닫습니다 것을 발견했다. 따라서, 난 탭 폐쇄 간의 약간의 시간 지연이있을 수있을 뿐이다는 것을 알았다. 내 주요 검증 포인트로이 시간 지연을 촬영하고 브라우저 및 탭 닫기 이벤트 감지를 달성 할 수 있도록.

    나는 크롬 브라우저 버전 76.0.3809.132에 그것을 테스트 작업 발견

    : 당신이 내 대답은 도움이되었다고 투표까지하면 ....


  16. 16.나는 그들 중 누구도 정말 팝업 창에 '닫기'버튼이 내 프로젝트의 일부 Telerik 구성 요소가 특수하기 때문에, 저를 위해 일하지, 위의 모든 솔루션을 시도, 그것은 'beforeunload'이벤트를 호출합니다. 당신이 당신의 페이지에 Telerik 그리드 (격자 내부 I 평균 버튼) 그래서, 제안 위 중 하나를 사용할 수없는이있을 때 또한, 버튼 선택이 제대로 작동하지 않습니다. 마지막으로이 나를 위해 일한 솔루션입니다. 나는 _Layout.cshtml의 body 태그에으로 onUnload 이벤트를 추가했습니다. 이 같은:

    나는 그들 중 누구도 정말 팝업 창에 '닫기'버튼이 내 프로젝트의 일부 Telerik 구성 요소가 특수하기 때문에, 저를 위해 일하지, 위의 모든 솔루션을 시도, 그것은 'beforeunload'이벤트를 호출합니다. 당신이 당신의 페이지에 Telerik 그리드 (격자 내부 I 평균 버튼) 그래서, 제안 위 중 하나를 사용할 수없는이있을 때 또한, 버튼 선택이 제대로 작동하지 않습니다. 마지막으로이 나를 위해 일한 솔루션입니다. 나는 _Layout.cshtml의 body 태그에으로 onUnload 이벤트를 추가했습니다. 이 같은:

    <body onUnload="LogOff()">
    

    다음입니다 계정 / 로그 오프로 리디렉션 로그 오프 기능을 추가 내장 Asp.Net MVC의 방법. 나는 브라우저 또는 탭을 닫으면, 그것은 반환 할 때 로그인에 로그 오프 방법과 사용자에게 있습니다 리디렉션합니다. 나는 크롬 및 파이어 폭스 모두를 테스트했습니다. 그리고 그것은 작동한다!

      function LogOff() {
            $.ajax({
                url: "/Account/LogOff",
                success: function (result) {
    
                                            }
                   });
           }
    

  17. 17.

    window.onbeforeunload = function ()
    {       
    
        if (isProcess > 0) 
        {
            return true;       
        }   
    
        else
        { 
            //do something      
        }
    }; 
    

    모든 browsers.You에서 browser.This 기능 작업의 모든 과정을 진행하는 동안 창 닫기 또는 새로 고침 페이지가 아약스 과정에서 설정 isProcess의 VAR에있는 경우이 함수는 확인 대화 상자를 표시합니다.


  18. 18.이 같은 '언로드'이벤트에 대한 이벤트 처리기에서 window.closed의 도움으로 그것을 확인하는 것이 가능하지만 (결과가 떨어지게 지연하는 경우 보증 또는 폐쇄에서 창을 방지 할 수 있도록) 시간 초과 사용이 필요합니다 :

    이 같은 '언로드'이벤트에 대한 이벤트 처리기에서 window.closed의 도움으로 그것을 확인하는 것이 가능하지만 (결과가 떨어지게 지연하는 경우 보증 또는 폐쇄에서 창을 방지 할 수 있도록) 시간 초과 사용이 필요합니다 :

    JSFiddle의 예는 (lates을 사파리, FF, 크롬, 에지 및 IE11에서 테스트)

    var win = window.open('', '', 'width=200,height=50,left=200,top=50');
    win.document.write(`<html>
       <head><title>CHILD WINDOW/TAB</title></head>
       <body><h2>CHILD WINDOW/TAB</h2></body>
    </html>`);
    win.addEventListener('load',() => {
        document.querySelector('.status').innerHTML += '<p>Child was loaded!</p>';
    });
    win.addEventListener('unload',() => {
        document.querySelector('.status').innerHTML += '<p>Child was unloaded!</p>';
        setTimeout(()=>{
            document.querySelector('.status').innerHTML +=  getChildWindowStatus();
        },1000);
    });
    win.document.close()
    document.querySelector('.check-child-window').onclick = ()=> {
        alert(getChildWindowStatus());
    }
    function getChildWindowStatus() {
      if (win.closed) { 
          return 'Child window has been closed!';
      } else {
          return 'Child window has not been closed!';
      }
    }
    

  19. 19.@jAndy가 언급 한 바와 같이, 윈도우 존재가 폐쇄 감지하는 자바 스크립트 코드는 더 제대로 없다. 나는 @Syno 제안했던 것에서 시작했다.

    @jAndy가 언급 한 바와 같이, 윈도우 존재가 폐쇄 감지하는 자바 스크립트 코드는 더 제대로 없다. 나는 @Syno 제안했던 것에서 시작했다.

    그 같은 상황을 통해 패스를했고, 당신은 당신이 그것을 감지 할 수 있습니다 다음과 같이 제공했다. 나는 크롬 67+와 파이어 폭스에서 61에 그것을 테스트.

    var wrapper = function () { //ignore this
    
    var closing_window = false;
    $(window).on('focus', function () {
        closing_window = false; 
       //if the user interacts with the window, then the window is not being 
       //closed
    });
    
    $(window).on('blur', function () {
    
        closing_window = true;
        if (!document.hidden) { //when the window is being minimized
            closing_window = false;
        }
        $(window).on('resize', function (e) { //when the window is being maximized
            closing_window = false;
        });
        $(window).off('resize'); //avoid multiple listening
    });
    
    $('html').on('mouseleave', function () {
        closing_window = true; 
        //if the user is leaving html, we have more reasons to believe that he's 
        //leaving or thinking about closing the window
    });
    
    $('html').on('mouseenter', function () {
        closing_window = false; 
        //if the user's mouse its on the page, it means you don't need to logout 
        //them, didn't it?
    });
    
    $(document).on('keydown', function (e) {
    
        if (e.keyCode == 91 || e.keyCode == 18) {
            closing_window = false; //shortcuts for ALT+TAB and Window key
        }
    
        if (e.keyCode == 116 || (e.ctrlKey && e.keyCode == 82)) {
            closing_window = false; //shortcuts for F5 and CTRL+F5 and CTRL+R
        }
    });
    
    // Prevent logout when clicking in a hiperlink
    $(document).on("click", "a", function () {
        closing_window = false;
    });
    
    // Prevent logout when clicking in a button (if these buttons rediret to some page)
    $(document).on("click", "button", function () {
        closing_window = false;
    
    });
    // Prevent logout when submiting
    $(document).on("submit", "form", function () {
        closing_window = false;
    });
    // Prevent logout when submiting
    $(document).on("click", "input[type=submit]", function () {
        closing_window = false;
    });
    
    var toDoWhenClosing = function() {
    
        //write a code here likes a user logout, example: 
        //$.ajax({
        //    url: '/MyController/MyLogOutAction',
        //    async: false,
        //    data: {
    
        //    },
        //    error: function () {
        //    },
        //    success: function (data) {
        //    },
        //});
    };
    
    
    window.onbeforeunload = function () {
        if (closing_window) {
            toDoWhenClosing();
        }
    };
    

    };


  20. 20.이 시도, 나는이 당신을 위해 작동 확신합니다.

    이 시도, 나는이 당신을 위해 작동 확신합니다.

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type='text/javascript'>
        $(function() {
    
            try{
                opera.setOverrideHistoryNavigationMode('compatible');
                history.navigationMode = 'compatible';
            }catch(e){}
    
            function ReturnMessage()
            {
                return "wait";
            }
    
            function UnBindWindow()
            {
                $(window).unbind('beforeunload', ReturnMessage);
            }
    
            $(window).bind('beforeunload',ReturnMessage );
        });
    </script>
    

  21. 21.이 시도. 그것은 작동합니다. JQuery와 언로드 방법은 depreceted된다.

    이 시도. 그것은 작동합니다. JQuery와 언로드 방법은 depreceted된다.

    window.onbeforeunload = function(event) {
        event.returnValue = "Write something clever here..";
    };
    
  22. from https://stackoverflow.com/questions/3888902/detect-browser-or-tab-closing by cc-by-sa and MIT license