JavaScript를 사용하여 웹 페이지를 탐색하지 못하도록 방지


129

JavaScript를 사용하여 웹 페이지를 탐색하지 못하게하는 방법은 무엇입니까?


이 페이지를 탐색하는 이유는 무엇입니까?
Niyaz

9
질문에 따르면, 자바 스크립트를 통해 탐색 할 수 있습니다 ...
Shog9


@ Shog9 탭을 닫으면 탐색 할 수 있습니다. 내 집게 손가락이 –...
Bob Stein

답변:


159

를 사용 onunload하면 메시지를 표시 할 수 있지만 탐색이 중단되지는 않습니다 (너무 늦었 기 때문에). 그러나를 사용 onbeforeunload하면 탐색이 중단됩니다.

window.onbeforeunload = function() {
  return "";
}

참고 : 최신 브라우저는 재정의 할 수없는 "저장되지 않은 변경 내용이 손실됩니다"와 같은 메시지를 제공하므로 빈 문자열이 반환됩니다.

이전 브라우저에서는 프롬프트에 표시 할 메시지를 지정할 수 있습니다.

window.onbeforeunload = function() {
  return "Are you sure you want to navigate away?";
}

11
브라우저에 적절한 프롬프트가 표시됩니다. 간단히 사용window.onbeforeunload = function() { return ""; }
KIM Taegyoon

그러나 충분하지 않습니다. 양식 내부의 컨트롤은 어떻습니까? 그들은 이것을 촉발시킵니다.
Fandango68

1
최신 브라우저에서는 피싱 자 등이 악용 했으므로 사용자 지정 메시지를 프롬프트에 표시 할 수 없습니다.
Flimm

@Flimm에게 감사드립니다. 현재 답변을 업데이트 했으므로 현재 브라우저에서 정확합니다.
Jimmie R. Houts

@Flimm 온라인 사용자가 브라우저 탭이나 브라우저를 닫을 때 사용자 온라인 상태를 업데이트하고 싶습니다. 솔루션에서 코드를 사용했지만 작동하지 않습니다.
Nasimba

23

여기에 제시된 다른 방법들과 달리,이 비트 는 브라우저가 사용자에게 떠나고 싶은지를 묻는 경고를 표시 하지 않습니다 . 대신, 브라우저가 메모리에서 메모리를 언로드하기 전에 DOM의 이벤트 특성을 이용하여 현재 페이지로 다시 리디렉션하여 탐색을 취소합니다.

탐색을 직접 단락시켜 작동하므로 페이지가 닫히는 것을 막을 수 없습니다. 그러나 프레임 버스 팅을 비활성화하는 데 사용할 수 있습니다.

(function () {
    var location = window.document.location;

    var preventNavigation = function () {
        var originalHashValue = location.hash;

        window.setTimeout(function () {
            location.hash = 'preventNavigation' + ~~ (9999 * Math.random());
            location.hash = originalHashValue;
        }, 0);
    };

    window.addEventListener('beforeunload', preventNavigation, false);
    window.addEventListener('unload', preventNavigation, false);
})();

면책 조항 : 당신은 이것을해서는 안됩니다. 페이지에 프레임 버스 팅 코드가있는 경우 작성자의 희망을 존중하십시오.


사용자가 브라우저를 닫으려면 어떻게 모달을 표시합니까? 정말?

15

이 약간 다른 버전으로 끝났습니다.

var dirty = false;
window.onbeforeunload = function() {
    return dirty ? "If you leave this page you will lose your unsaved changes." : null;
}

다른 곳에서는 폼이 더러워지면 dirty 플래그를 true로 설정했습니다 (또는 다른 방법으로 탐색을 방지하고 싶습니다). 이를 통해 사용자에게 탐색 확인 프롬프트가 표시되는지 여부를 쉽게 제어 할 수 있습니다.

선택한 답변의 텍스트와 함께 중복 프롬프트가 표시됩니다.

여기에 이미지 설명을 입력하십시오


3
IE에서 dirty가 false이면 문자열 'null'이 표시됩니다. if 문 안에 넣으십시오. 참조 : stackoverflow.com/questions/11793996/...
야곱 반 Lingen의

@JacobvanLingen이 합의,이 여기에 가장 좋은 대답이 될 것 세 가지 다른 질문 이 끝난 경우 undefinedNULL 대신. (1) 조건부입니다. (2) 탐색을 방해하는 가장 일반적인 합법적 인 이유 인 "더러운"을 언급하며 (3) 스크린 샷이 있습니다.
밥 스타

null이 아닌 undefined로 끝나는 경우 모든 브라우저에서 작동합니까?
위험


7

Ayman의 예제에서 false를 반환하면 브라우저 창 / 탭이 닫히지 않습니다.

window.onunload = function () {
  alert('You are trying to leave.');
  return false;
}

2
브라우저가 Opera가 아닌 한 탭 / 창 / 프로그램이 닫히면 onunload 이벤트를 건너 뜁니다.
Powerlord

5

jQuery 1.11에서 허용되는 답변과 동일합니다.

$(window).on("beforeunload", function () {
    return "Please don't leave me!";
});

JSFiddle 예제

altCognito의 답변 unload은 JavaScript를 사용하여 탐색을 중단하기에 너무 늦은 이벤트를 사용했습니다 .


3

onunload를 사용하십시오 .

jQuery의 경우 다음과 같이 작동한다고 생각합니다.

$(window).unload(function() { 
  alert("Unloading"); 
  return falseIfYouWantToButBeCareful();
});

false를 반환해도 언로드가 언로드되지 않게 취소되지는 않습니다 unload. 사용자가 페이지를 떠날 때 발생 하는 이벤트 beforeunload(사전 발생하고 취소 될 수 있음)와 달리
Jimbo

@altCognito : falseIfYouWantToButBeCareful ()으로 나에게 좋은 아이디어를주었습니다. 이제 IE 또는 FF가 제공하는 기본 팝업을 피할 수 있습니다. 그러나 크롬의 경우 작동하지 않습니다. 그것을 찾고 있습니다.
user367134

3

제안 된 오류 메시지는 브라우저가 이미 표시 한 오류 메시지를 복제 할 수 있습니다. 크롬에서는 두 개의 유사한 오류 메시지가 동일한 창에 하나씩 표시됩니다.

크롬에서 맞춤 메시지 다음에 표시되는 텍스트는 "이 페이지를 나가시겠습니까?"입니다. 파이어 폭스에서는 사용자 정의 오류 메시지가 전혀 표시되지 않지만 여전히 대화 상자가 표시됩니다.

더 적절한 오류 메시지는 다음과 같습니다.

window.onbeforeunload = function() {
    return "If you leave this page, you will lose any unsaved changes.";
}

또는 stackoverflow 스타일 : "게시물을 쓰거나 편집하기 시작했습니다."


2

브라우저의 뒤로 / 앞으로 버튼을 잡고 있고 멀리 이동하지 않으려면 다음을 사용할 수 있습니다.

window.addEventListener('popstate', function() {
    if (window.location.origin !== 'http://example.com') {
        // Do something if not your domain
    } else if (window.location.href === 'http://example.com/sign-in/step-1') {
        window.history.go(2); // Skip the already-signed-in pages if the forward button was clicked
    } else if (window.location.href === 'http://example.com/sign-in/step-2') {
        window.history.go(-2); // Skip the already-signed-in pages if the back button was clicked
    } else {
        // Let it do its thing
    }
});

그렇지 않으면 beforeunload 이벤트를 사용할 수 있지만 메시지가 브라우저 간 작동하거나 작동하지 않을 수 있으며 내장 프롬프트를 강제로 실행하는 항목을 리턴해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.