window.onbeforeunload가 iPad에서 작동하지 않습니까?


84

onbeforeunload이벤트가 iPad에서 지원되는지 및 / 또는 사용하는 다른 방법이 있는지 아는 사람이 있습니까?

나는 거의 모든 것을 시도했고, onbeforeunload 이벤트가 iPad (Safari 브라우저)에서 트리거되지 않는 .

특히 이것은 내가 시도한 것입니다.

  • window.onbeforeunload = function(event) { event.returnValue = 'test'; }
  • window.onbeforeunload = function(event) { return 'test'; }
  • (위의 두 가지 모두 함께)
  • window.onbeforeunload = function(event) { alert('test')'; }
  • (위의 모든 기능이 있지만 내부 <body onbeforeunload="...">

이 모든 것이 PC의 FF 및 Safari에서 작동하지만 iPad에서는 작동하지 않습니다.

또한 페이지를로드 한 직후 다음을 수행했습니다.

alert('onbeforeunload' in window);
alert(typeof window.onbeforeunload);
alert(window.onbeforeunload);

각각의 결과는 다음과 같습니다.

  • true
  • object
  • null

따라서 브라우저에는 속성이 있지만 어떤 이유로 시작되지 않습니다.

페이지에서 벗어나려고하는 방법은 뒤로 및 앞으로 버튼을 클릭하고 상단 표시 줄에서 Google 검색을 수행하고 주소 표시 줄에서 위치를 변경하고 북마크를 클릭하는 것입니다.

무슨 일이 일어나고 있는지 아는 사람이 있습니까? 어떤 의견이든 대단히 감사하겠습니다.

감사


귀하의 의견에 감사드립니다. 당신이 언급 한 이유 중 하나임에 틀림 없다. 불행히도 이것과 다른 제한에 관한 Apple의 공식 문서는 없습니다. 바라건대, 그들은 악의적 인 사용을 방지하면서이 기능을 활성화하는보다 창의적인 방법을 제시 할 것입니다. 사람들이 실수로 페이지를 탭하여 양식에 입력 한 모든 데이터를 잃어버린다는 이야기를 자주 듣습니다.
Art Zambrano

사용해 보셨습니까 addEventListener()?
Hello71 2011 년

2
나는 확신 beforeunloadiOS에서 사파리에서 작동하지 않습니다. :-( 아마도 당신이 찾고있는,하지만 난에 대한 제안이없는 것을 어떻게 작동에 대한 신뢰성 테스트beforeunload
피터 V. Mørch

1
3'16에 The window.onbeforeunload = function(event) { event.returnValue = 'test'; }는 iOS 9.2.1의 Chrome 및 Safari에서 작동하지 않습니다. onbeforeunload취소를 클릭해도 페이지가 변경되지 않기 때문에 정말 마음에 듭니다 .
vanduc1102

이 문제는 Safari 및 iOS 13에서 해결 된 것 같습니다
Finesse

답변:


20

onunload () 이벤트가 발생한다는 것을 발견했습니다. 행동이 다소 이상합니다. 이벤트에 연결된 콜백 함수에있는 모든 항목은 새 페이지가 백그라운드에서로드 된 후에 실제로 실행됩니다 (아직로드되었음을 알 수 없지만 서버 로깅에 표시됨).

더 이상하게도 onunload ()에 confirm () 호출이 있고 사용자가 링크를 클릭하여 다른 곳으로 이동했다면 비즈니스에있는 것입니다. 그러나 사용자가 iPad Safari 브라우저 탭을 닫으면 onunload () 이벤트가 발생하지만 confirm ()은 응답으로 암시 적 취소를 갖습니다.


허, 이것은 확인 메시지 (확인 메시지 앞에 두 번째 페이지가 표시됨)가 모바일 사파리뿐만 아니라 파이어 폭스 (및 아마도 다른)에도 해당되는 것 같습니다. 당신은 내 마음을 날려 버렸습니다.
Amalgovinus 2011-08-03

4
unload이벤트는 추천되지 않게 pagehidedeveloper.apple.com/library/ios/documentation/AppleApplications/...
sol0mka

1
@ sol0mka : 그게 다야! 큰! 내 경우에는 모든 브라우저와 iOS에서 볼 수있는 한 다음 코드가 작업을 수행했습니다. $ (window) .on ( 'beforeunload pagehide', function () {// 페이지에서 수행해야하는 작업 변경}); 이것은 내 눈에 받아 들여지는 대답이어야합니다.
Garavani

18

이 자바 스크립트는 데스크톱 / 노트북 / 기타 브라우저뿐만 아니라 ipad와 iphone의 Safari와 Chrome에서도 작동합니다.

var isOnIOS = navigator.userAgent.match(/iPad/i)|| navigator.userAgent.match(/iPhone/i);
var eventName = isOnIOS ? "pagehide" : "beforeunload";

window.addEventListener(eventName, function (event) { 
    window.event.cancelBubble = true; // Don't know if this works on iOS but it might!
    ...
} );

1
이벤트를 잡을 수 있지만 어떻게 확인 프롬프트를 표시 할 수 있습니까? return 'test';op에 의해 유사한 사용 이 작동하지 않습니다 ..
user2335065

감사합니다. 원래 질문에서 놓쳤습니다. iOS에서 특별히 테스트하지는 않았지만 다음 줄을 추가하면 효과가있을 수 있습니다. window.event.cancelBubble = true; 내 대답에 추가하겠습니다
위험

2
감사합니다.하지만 슬프게도 작동하지 않습니다 ... alert ()를 내부에 넣으려고했는데 alert ()가 실행되기 전에 새 페이지가로드되기 시작한 것 같습니다. 참조 : stackoverflow.com/questions/3239834/…
user2335065

@ user2335065에 대한 해결책을 찾았습니까?
Neeraj Rathod

여러분, 페이지를 떠나기 전에 확인 메시지를 표시하는 해결책을 찾았습니까? 이것은 IOS safari를 제외한 모든 브라우저에서 잘 작동합니다. 페이지 숨기기 이벤트도 시도했지만 저에게 효과적이지 않았습니다. 미리 감사드립니다.
Rahul

6

Apple만이 확실히 알 수 있지만, 제 생각에는 모바일 Safari에서 해당 기능을 의도적으로 활성화하지 않은 것 같습니다.


55
또는 실수로 잘못된 것을 탭했기 때문에 손실되지 않도록 변경 사항을 자동으로 저장하십시오.
Joel Mueller

4
유효한 용도가 없다고 말한 것이 아니라 가장 자주 사용하는 용도 라고만 말했습니다.
Charles Boyung

3
귀하의 의견은 허용 대답 :)해야 @JoelMueller
산체스

1
@JoelMueller 정확히 내 사용 사례입니다. Grrr @ apple
user2808054

@JoelMueller는 모바일 사파리가 변경 사항을 자동으로 저장한다는이 진술을 해결할 수있는 공식 문서를 공유해 주시겠습니까?
Neeraj Rathod




1

페이지가 남아 있는지 여부 만 알고 싶다면를 사용할 수 있습니다 document.unload. iOS 브라우저에서 잘 작동합니다. Apple 문서 에 표시되면 더 이상 사용되지 않으며 document.pagehide를 사용하는 것이 좋습니다.


예,이 이벤트는 사파리에서 발생하지만 확인 메시지는 크롬 에서처럼 나오지 않습니다.
Rahul

1

모든 최신 브라우저에서 작동하는 솔루션은 다음과 같습니다.

var unloaded = false;
window.addEventListener("beforeunload", function(e)
{
    if (unloaded)
        return;
    unloaded = true;
    console.log("beforeUnload");
});
window.addEventListener("visibilitychange", function(e)
{
    if (document.visibilityState == 'hidden')
    {
        if (unloaded)
            return;
        unloaded = true;
        console.log("beforeUnload");
    }
});

모바일 브라우저는 지원하지 않는 경향이 있습니다. beforeunload 페이지를 언로드하지 않고 백그라운드로 들어간 다음 언제든지 운영 체제에 의해 종료 될 수 있기 때문에 있습니다.

대부분의 데스크탑 브라우저에는 visibilityState문서가 언로드 될 때 호출되지 않는 버그가 있습니다 . 참조 : 여기 .

따라서 모든 시나리오를 다루기 위해 두 이벤트를 모두 포함하는 것이 중요합니다.

NB

또는 에서 호출 될 때 일부 브라우저에서 차단 되기 때문에 내 예제에서 console.log대신 사용 했습니다 .alertalertbeforeunloadvisibilitychange

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