페이지를 떠날 때 발생하는 JavaScript 경고를 방지하는 방법은 무엇입니까?


12

탭을 닫거나 저장하지 않고 이동하면 많은 페이지에 알림이 표시됩니다. 예를 들어 "확인 하시겠습니까? 이 페이지에서 벗어나시겠습니까? "

이것은 일반적으로 onbeforeunload및 / 또는 onunload핸들러로 수행됩니다.

다음 은 예입니다.

해당 처리기에서 생성 된 경고 / 사용자 차단 이벤트를 방지 할 수있는 방법이 있습니까? 기본적으로 JS를 사용하도록 설정하고 추가 클릭이 발생하지 않고 페이지를 떠나지 못하게하는 것을 허용하지 않습니다.

onbeforeunload그리고 onunload핸들러는 여전히 발생한다 단지 사용자를 차단하는 일을해서는 안됩니다. 이는 경고가없고 몇 초 이상 걸리는 작업이 없음을 의미합니다.

특정 페이지의 자바 스크립트를 편집 / 그리스 몽키 패치하는 플러그인을 발견했으며 코드를 약간 사용하여 더 보편적으로 적용 할 수 있도록했습니다. 그러나 사용자 이탈을 차단하려는 모든 페이지에서 작동하는 솔루션을 찾고 싶습니다 .


그렇게하는 URL을 게시 할 수 있습니까?
golimar

편집하고 추가 한 예. 또한 왜이 동작이 바람직한 지, 많은 경우 우발적 인 데이터 손실을 방지하는 데 필요하다는 것을 알고 있습니다. 여전히 재정의 / 비활성화 방법을 알고 싶습니다.
Zac B

참고 : 모든 현재 답변 (수정 onbeforeunload)은 onbeforeunload이벤트를 첨부하기 위해 다른 방법 중 하나를 사용하는 페이지가 아닌을 사용하는 페이지에서만 작동 합니다.
Synetech

답변:


7

가장 간단한 방법은 페이지 스크립트를 직접 재정의하고 이벤트를에 다시 할당하는 것 null입니다.

window.onbeforeunload = null;

이것은 악의적 인 것이 아니라면 어디에서나 작동하며 계속해서 다시 할당해야합니다. 이 경우 설정을 유지하는 루프가 null작동합니다.

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}

이제 일부 페이지는 이것을 잘 사용합니다. YouTube 업로드 페이지 가져 오기 : 업로드 중에 탐색하면 시간이 많이 걸리는 것일 수 있습니다. 또는 다시 작성하고 싶지 않은 웹 양식 또는 다시 입력하고 싶지 않은 메시지 (포럼 / 이메일)가있을 수 있습니다. 이 기능을 사용하면 보호됩니다.

또 다른 문제는 AJAX로 데이터를 저장하는 것과 같은 보조 목적으로이 페이지를 사용하는 페이지입니다. 이 이벤트를 사용하여 저장 조치를 트리거 할 수 있으며 사용자가 요청을 처리하기 위해 단추를 클릭 할 때까지 시간이 오래 걸리기를 바랍니다. 다시 말하지만, 이것은 종종 자신을 구하기 위해 수행됩니다.

그러나 분명히 우리는 많은 페이지가 이것을 악용으로 사용한다는 것을 알고 있습니다. 따라서 작업하려는 페이지를 알고 있으면 항상 화이트리스트 시스템을 가질 수 있습니다. 완전히 차단하지 않고이 작업을 차단할 수있는 방법이 없으며 window.onbeforeunload취할 수있는 작업이 있습니다.

팝업 상자를 중지하는 동안 올바른 조치를 유지할 수있는 방법은 없습니다 (주어진 페이지 코드에 대한 사전 지식이 없음). 이 상자는 하지alert() . 상자는의 의도 된 동작으로 브라우저에 의해 생성됩니다 onbeforeunload. window.onbeforeunload문자열 을 반환하기 위해 할당 한 함수를 만들어서 만듭니다 . 해당 문자열이 팝업에 인쇄됩니다.

window.onbeforeunload = function() {
    //Whatever
    return "WARNING! You have unsaved changes that may be lost!";
}

따라서 기능을 지우지 않으면 팝업을 차단할 수 없습니다.

또한 방법을 찾으면 AJAX가 실패합니다. 팝업은 요청없이 데이터를 잃을 수있는 시간을줍니다.

에 관해서는 onunload, 이것을 막을 수 없습니다. 이 화재 때문에 후에 페이지 언로드합니다. 그러나 안전을 위해 항상 할 수 window.onunload = null;있으며 관리해야합니다.


그런 종류의 작품이지만 onbeforeunload핸들러가 다른 중요한 일을한다면 어떨까요? 예를 들어 간단한 AJAX 요청을하거나 로컬 HTML5 스토리지에 무언가를 커밋 한 경우 어떻게됩니까? onbeforeunload핸들러가 특정 호출 (예 :)을 alert()하거나 특정 기간 이상 실행 되지 못하게하는 방법이 있습니까? 그렇기 때문에 그리스 몽키 (Greasemonkey) 유형의 스크립트가 아닌 확장 기능에 대해 물어 보았습니다.
Zac B

1
더 많은 정보를 추가했습니다. 실제로 이것을 더 낮은 수준으로 수정하는 한 확장은 실제로 더 낮은 수준이 아닙니다. 더 높은 권한과 일부 특수 API가 있지만 브라우저의 핵심 기능을 변경할 수있는 기능이 없습니다. FF 플러깅이 얼마나 깊은 지 잘 모르겠습니다.이 분야에 경험이 없습니다. 분명히 오픈 소스이기 때문에 이러한 변경 작업을 수행 할 수 있습니다. 그러나 그것은 팝업을 수정하기 위해 조금 멀어졌습니다.
zeel

나를 위해 작동하지 않습니다 :(
Phuc Nguyen

0
    // ==/UserScript==

var th = document.getElementsByTagName('body')[0];
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.innerHTML = "window.onbeforeunload = function() {}";
th.appendChild(s);

1
왜 이런 스크립트를 만들겠습니까?
Brad

3
@anywho. 다른 사람들이 무엇을하고 있는지 알 수 있도록 스크립트를 설명하려고하면 도움이 될 수 있습니다. 또한 스크립트의 특정 부분이 스크립트를 개선하기 위해 변경 될 수 있거나 완전히 다른 스크립트에서 사용될 수 있기 때문에 많은 사람들이 대답 할 수 있습니다. 어쨌든 사람들이 자신의 질문에 어떻게 적용되는지 알 수 있도록 답변 해주는 것도 좋은 생각입니다. 답변을 게시 해 주셔서 감사합니다.
David

0

Windows 시스템에서 모든 성가신 팝업을 처리 할 수있는 유용한 도구가 있습니다 -ClickOff . 여기 에서 다운로드 할 수 있습니다 . 확인한 결과 SharePoint 사이트에 대한 "변경 내용이 저장되지 않았을 수 있습니다"경고와 함께 작동합니다.

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