"이 페이지에서 벗어나시겠습니까?"를 표시하는 방법 언제 변경 사항이 커밋됩니까?


267

여기에서 스택 오버플로에서 변경을 시작한 다음 페이지에서 벗어나려고하면 자바 스크립트 확인 버튼이 나타나고 "이 페이지에서 벗어나시겠습니까?" 블레 블러 블 ...

누구든지 전에 이것을 구현 했습니까? 변경 사항이 커밋되었음을 어떻게 추적합니까? 나는 이것을 스스로 할 수 있다고 믿습니다. 전문가들로부터 좋은 관행을 배우려고 노력하고 있습니다.

다음을 시도했지만 여전히 작동하지 않습니다.

<html>
<body>
    <p>Close the page to trigger the onunload event.</p>
    <script type="text/javascript">
        var changes = false;        
        window.onbeforeunload = function() {
            if (changes)
            {
                var message = "Are you sure you want to navigate away from this page?\n\nYou have started writing or editing a post.\n\nPress OK to continue or Cancel to stay on the current page.";
                if (confirm(message)) return true;
                else return false;
            }
        }
    </script>

    <input type='text' onchange='changes=true;'> </input>
</body>
</html>

누구나 예를 게시 할 수 있습니까?


3
예제 작업을 수행하려면 함수를 다음과 같이 변경하십시오. myFunction () {window.onbeforeunload = "message"; } 다음 입력을 변경하십시오. <input type = 'text'onchange = 'myFunction ();'> </ input>
— Keith

답변:


367

업데이트 (2017)

최신 브라우저는 이제 사용자 지정 메시지를 보안 위험 요소로 표시하는 것을 고려하여 모든 메시지에서 제거 되었습니다 . 브라우저는 이제 일반 메시지 만 표시합니다. 더 이상 메시지 설정에 대해 걱정할 필요가 없으므로 다음과 같이 간단합니다.

// Enable navigation prompt
window.onbeforeunload = function() {
    return true;
};
// Remove navigation prompt
window.onbeforeunload = null;

레거시 브라우저 지원에 대해서는 아래를 읽으십시오.

업데이트 (2013)

원래 답변은 IE6-8 및 FX1-3.5 (2009 년에 작성되었을 때 다시 타겟팅 한 것)에 적합하지만 지금은 구식이 아니며 대부분의 최신 브라우저에서 작동하지 않습니다. 아래 참조하십시오.

는 window.onbeforeunload모든 브라우저에서 일관되게 처리되지 않습니다. 문자열은 아닌 함수 참조 여야하지만 (원래 답변이 명시되어 있음) 이전 브라우저 onbeforeunload에서 작동합니다 null.

window.onbeforeunload함수 참조로 설정 했지만 이전 브라우저 returnValue에서는 문자열을 반환하는 대신 이벤트 를 설정해야 합니다.

var confirmOnPageExit = function (e) 
{
    // If we haven't been passed the event get the window.event
    e = e || window.event;

    var message = 'Any text will block the navigation and display a prompt';

    // For IE6-8 and Firefox prior to version 4
    if (e) 
    {
        e.returnValue = message;
    }

    // For Chrome, Safari, IE8+ and Opera 12+
    return message;
};

confirmOnPageExit사용자가 메시지없이 계속하려면 검사 를 수행하고 null을 반환 할 수 없습니다 . 이벤트를 안정적으로 켜고 끄려면 여전히 이벤트를 제거해야합니다.

// Turn it on - assign the function that returns the string
window.onbeforeunload = confirmOnPageExit;

// Turn it off - remove the function entirely
window.onbeforeunload = null;

원래 답변 (2009 년에 작업)

켜려면 :

window.onbeforeunload = "Are you sure you want to leave?";

끄려면 :

window.onbeforeunload = null;

이것은 정상적인 이벤트가 아니라는 것을 명심하십시오. 표준 방식으로 묶을 수는 없습니다.

값을 확인하려면? 이는 유효성 검사 프레임 워크에 따라 다릅니다.

jQuery에서 이것은 (매우 기본적인 예)와 같을 수 있습니다 :

$('input').change(function() {
    if( $(this).val() != "" )
        window.onbeforeunload = "Are you sure you want to leave?";
});

4
$ ( 'input : text'). change (function () {window.onbeforeunload = $ ( 'input : text [value! = ""]'). length> 0? "warning": null ;});
— Keith

1
간단한 확인을 위해 또는 각 변경에 대해 더 복잡한 검증을 추가 할 수 있습니다
— Keith

1
'returnValue'방법은 표준에 지정된 유일한 방법이므로 IE6-8뿐만 아니라 모든 표준 호환 브라우저 (이 경우 Chrome, Safari 및 Opera는 포함하지 않음)에 대한 것입니다.
— rmcclellan 2016 년

3
양식 제출시 경고를 중지하기 위해을 사용했습니다 $("#submit_button").click(function() { window.onbeforeunload = null; });. 원래 버튼의 onclick 이벤트를 사용했지만 좋지는 않았지만 IE8에서도 작동하지 않았습니다.
— Andy Beverley

1
@ AlikElzin-kilaka는 할 수 없습니다. 팝업 텍스트를 변경하려면 고유 한 사용자 정의 팝업을 작성해야하지만 window.onbeforeunload이벤트를 차단할 수는 없습니다 .
— Keith

38

onbeforeunload마이크로 소프트주의는 우리가 표준 용액을 가지고 있지만, 브라우저 지원이 고르지 알고 있어야 가장 가까운 것입니다; 예를 들어 Opera의 경우 버전 12 이상에서만 작동합니다 (여전히 작성중인 베타 버전).

또한 호환성 을 극대화 하려면 Mozilla Developer Network 에 설명 된대로 단순히 문자열을 반환하는 것 이상의 작업을 수행해야합니다 .

예 : 탐색 프롬프트를 활성화 / 비활성화하기 위해 다음 두 기능을 정의하십시오 (MDN 예 참조).

function enableBeforeUnload() {
    window.onbeforeunload = function (e) {
        return "Discard changes?";
    };
}
function disableBeforeUnload() {
    window.onbeforeunload = null;
}

그런 다음 다음과 같은 양식을 정의하십시오.

<form method="POST" action="" onsubmit="disableBeforeUnload();">
    <textarea name="text"
              onchange="enableBeforeUnload();"
              onkeyup="enableBeforeUnload();">
    </textarea>
    <button type="submit">Save</button>
</form>

이런 식으로, 사용자는 텍스트 영역을 변경 한 경우 탐색에 대한 경고 만 받고 실제로 양식을 제출할 때 프롬프트되지 않습니다.


1
Mozill 사이트를 기반으로하는 최신 데스크톱 브라우저는 현재이를 지원합니다. developer.mozilla.org/en/DOM/window.onbeforeunload
— Hengjie

Microsoft-ism은 훌륭한 용어입니다.
— Luke Taylor


18

JQuery를 사용하면 이 작업을 매우 쉽게 수행 할 수 있습니다. 세트에 바인딩 할 수 있기 때문입니다.

온로드를 수행하기에는 충분하지 않으며 누군가 편집을 시작한 경우에만 탐색을 트리거하려고합니다.


2
@jonstjohn 님의 블로그 게시물을 찾을 수 없습니다. 그는 친구가되어 올바른 방향으로 우리를 가리킬까요? : D
— FLGMwt 2018 년

14
=> 500 내부 오류. 이것이 SO에서 링크가 더 이상 사용되지 않는 이유입니다. 고정 될 때까지 공감.
— Loïc

이 웹 페이지는 사용할 수 없습니다
— Mateusz

2
이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
— bwest

2
Jon St John 의 원본 링크 가 손상되어 Wayback Machine 버전으로 업데이트 했습니다. 링크의 내용은 다른 많은 사이트에서 복사 된 것으로 볼 수 있지만, Sam이 추가 한 것을 "보존"하는 것이 낫습니다
— Alvaro Montoro

14

jquerys 'beforeunload'가 저에게 효과적이었습니다.

$(window).bind('beforeunload', function(){
    if( $('input').val() !== '' ){
        return "It looks like you have input you haven't submitted."
    }
});

바인드는 더 이상 사용되지
— 않으며이


11

이는 양식에 데이터가 입력 된 경우 메시지를 표시하고 양식이 제출 된 경우 메시지를 표시하지 않는 쉬운 방법입니다.

$(function () {
    $("input, textarea, select").on("input change", function() {
        window.onbeforeunload = window.onbeforeunload || function (e) {
            return "You have unsaved changes.  Do you want to leave this page and lose your changes?";
        };
    });
    $("form").on("submit", function() {
        window.onbeforeunload = null;
    });
})

8

Keith의 이미 놀라운 답변 을 확장하려면 :

맞춤 경고 메시지

사용자 정의 경고 메시지를 허용하려면 다음과 같은 기능으로 래핑 할 수 있습니다.

function preventNavigation(message) {
    var confirmOnPageExit = function (e) {
        // If we haven't been passed the event get the window.event
        e = e || window.event;

        // For IE6-8 and Firefox prior to version 4
        if (e)
        {
            e.returnValue = message;
        }

        // For Chrome, Safari, IE8+ and Opera 12+
        return message;
    };
    window.onbeforeunload = confirmOnPageExit;
}

그런 다음 사용자 정의 메시지로 해당 함수를 호출하십시오.

preventNavigation("Baby, please don't go!!!");

탐색을 다시 활성화

탐색을 다시 활성화하려면으로 설정 window.onbeforeunload하면 null됩니다. 다음은 어디에서나 호출 할 수있는 깔끔한 작은 함수로 싸여 있습니다.

function enableNavigation() {
    window.onbeforeunload = null;
}

jQuery를 사용하여 이것을 요소를 형성하기 위해 바인딩

jQuery를 사용하는 경우 다음과 같이 양식의 모든 요소에 쉽게 바인딩 될 수 있습니다.

$("#yourForm :input").change(function() {
    preventNavigation("You have not saved the form. Any \
        changes will be lost if you leave this page.");
});

그런 다음 양식을 제출할 수 있습니다.

$("#yourForm").on("submit", function(event) {
    enableNavigation();
});

동적으로 수정 된 양식 :

preventNavigation()및 enableNavigation()필요에 따라 동적으로 형태를 변경하거나, AJAX 요청을 전송하는 버튼을 클릭하는 것과, 다른 기능에 결합 될 수있다. 폼에 숨겨진 입력 요소를 추가 하여이 작업을 수행했습니다.

<input id="dummy_input" type="hidden" />

그런 다음 사용자가 탐색하지 못하게하려면 언제든지 해당 입력에서 변경 사항을 트리거하여 preventNavigation()실행 되도록하십시오 .

function somethingThatModifiesAFormDynamically() {

    // Do something that modifies a form

    // ...
    $("#dummy_input").trigger("change");
    // ...
}

3

여기서 시도해보십시오 .100 % 작동합니다.

<html>
<body>
<script>
var warning = true;
window.onbeforeunload = function() {  
  if (warning) {  
    return "You have made changes on this page that you have not yet confirmed. If you navigate away from this page you will lose your unsaved changes";  
    }  
}

$('form').submit(function() {
   window.onbeforeunload = null;
});
</script>
</body>
</html>

3

표준 상태 상쇄 제어 할 수 있습니다 메시지를 표시하지 않고 있음을 beforeunload의 이벤트 또는 반환 값을 설정하는 null 이외의 값 . 또한 작성자는 returnValue 대신 Event.preventDefault ()를 사용해야하며 사용자에게 표시되는 메시지는 사용자 정의 할 수 없습니다 .

69.0.3497.92 현재 Chrome은 표준을 충족하지 않습니다. 그러나 버그 보고서가 제출 되었으며 검토 가 진행 중입니다. Chrome에서는 핸들러가 반환 한 값이 아니라 이벤트 객체를 참조하여 returnValue를 설정해야합니다.

변경 여부를 추적하는 것은 저자의 책임입니다. 변수를 사용하거나 필요한 경우에만 이벤트가 처리되도록 할 수 있습니다.

window.addEventListener('beforeunload', function (e) {
    // Cancel the event as stated by the standard.
    e.preventDefault();
    // Chrome requires returnValue to be set.
    e.returnValue = '';
});
    
window.location = 'about:blank';


2

사용자가 양식을 변경하기 시작하면 부울 플래그가 설정됩니다. 그런 다음 사용자가 페이지에서 벗어나려고하면 window.onunload 이벤트 에서 해당 플래그를 확인합니다 . 플래그가 설정되면 메시지를 문자열로 반환하여 메시지를 표시합니다. 메시지를 문자열로 반환하면 메시지가 포함 된 확인 대화 상자가 나타납니다.

변경 사항을 커밋하기 위해 ajax를 사용하는 경우 변경 사항이 커밋 된 false후 (즉, ajax 성공 이벤트)로 플래그를 설정할 수 있습니다 .


1

onchangeJS에서 변수를 설정하는 텍스트 영역 (또는 다른 필드)에 이벤트를 추가 할 수 있습니다 . 사용자가 페이지를 닫으려고하면 (window.onunload) 해당 변수의 값을 확인하고 이에 따라 경고를 표시합니다.


1
-이 작업을 수행 할 수 alert및 confirm시 차단 window.onbeforeunload하고 window.onunload(내 PC에 크롬의 버전에서 적어도하지만, 아마도 모든 브라우저에서 이제까지 그 핸들러를 지원하기 위해).
— Mark Amery

1

이 스레드의 모든 답변을 바탕으로 다음 코드를 작성했으며 저에게 효과적이었습니다.

onunload 이벤트를 확인해야하는 일부 입력 / 텍스트 영역 태그 만있는 경우 HTML5 데이터 속성을 다음과 같이 지정할 수 있습니다. data-onunload="true"

예를 들어.

<input type="text" data-onunload="true" />
<textarea data-onunload="true"></textarea>

Javascript (jQuery)는 다음과 같습니다.

$(document).ready(function(){
    window.onbeforeunload = function(e) {
        var returnFlag = false;
        $('textarea, input').each(function(){
            if($(this).attr('data-onunload') == 'true' && $(this).val() != '')
                returnFlag = true;
        });

        if(returnFlag)
            return "Sure you want to leave?";   
    };
});

2
MDN의 사전로드 해제 문서 에서 "어떤 이유로 Webkit 기반 브라우저는 대화 상자의 스펙을 따르지 않습니다"를 참조하십시오 .
— Arjan

1

여기 내 HTML입니다

<!DOCTYPE HMTL>
<meta charset="UTF-8">
<html>
<head>
<title>Home</title>
<script type="text/javascript" src="script.js"></script>
</head>

 <body onload="myFunction()">
    <h1 id="belong">
        Welcome To My Home
    </h1>
    <p>
        <a id="replaceME" onclick="myFunction2(event)" href="https://www.ccis.edu">I am a student at Columbia College of Missouri.</a>
    </p>
</body>

그래서 이것은 자바 스크립트에서 비슷한 것을 수행 한 방법입니다

var myGlobalNameHolder ="";

function myFunction(){
var myString = prompt("Enter a name", "Name Goes Here");
    myGlobalNameHolder = myString;
    if (myString != null) {
        document.getElementById("replaceME").innerHTML =
        "Hello " + myString + ". Welcome to my site";

        document.getElementById("belong").innerHTML =
        "A place you belong";
    }   
}

// create a function to pass our event too
function myFunction2(event) {   
// variable to make our event short and sweet
var x=window.onbeforeunload;
// logic to make the confirm and alert boxes
if (confirm("Are you sure you want to leave my page?") == true) {
    x = alert("Thank you " + myGlobalNameHolder + " for visiting!");
}
}

0

TextArea의 onChange 이벤트 에서 ChangeFlag 를 true 로 설정하면 쉽게 수행 할 수 있습니다 . javascript를 사용 하여 ChangeFlag 값을 기반으로 확인 대화 상자 를 표시하십시오 . 경우 요청 된 페이지의 형태와 탐색을 폐기 확인이 true를 돌려주는 사람, 하지 않는다 - 아무것도 .



-1

body 태그에는 "onunload"매개 변수가 있으며 여기에서 javascript 함수를 호출 할 수 있습니다. false를 리턴하면 내비게이션을 방지합니다.


13
다행히도 이것은 실제로 작동하지 않습니다. 그렇지 않으면가 포함 된 페이지를 방문하는 것이 싫습니다 <body onunload="return false;">.
— Søren Løvborg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.