window.onbeforeunload iPad पर काम नहीं कर रहा है?


84

किसी को पता है कि क्या onbeforeunloadघटना आईपैड पर समर्थित है और / या यदि इसका उपयोग करने का कोई अलग तरीका है?

मैंने हर चीज की बहुत कोशिश की है, और ऐसा लगता है कि onbeforeunloadघटना आईपैड (सफारी ब्राउज़र) पर कभी ट्रिगर नहीं होती है।

विशेष रूप से, यह वही है जो मैंने कोशिश की है:

  • window.onbeforeunload = function(event) { event.returnValue = 'test'; }
  • window.onbeforeunload = function(event) { return 'test'; }
  • (उपरोक्त दोनों एक साथ)
  • window.onbeforeunload = function(event) { alert('test')'; }
  • (उपरोक्त कार्यों के सभी लेकिन अंदर <body onbeforeunload="...">

ये सभी पीसी पर एफएफ और सफारी पर काम करते हैं, लेकिन आईपैड पर नहीं।

इसके अलावा, मैंने पेज लोड करने के बाद निम्नलिखित काम किया है:

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

क्रमशः, परिणाम हैं:

  • true
  • object
  • null

तो, ब्राउज़र के पास संपत्ति है, लेकिन किसी कारण से इसे निकाल नहीं दिया जाता है।

पृष्ठ से दूर जाने के लिए मैं जिस तरह से नेविगेट करने की कोशिश कर रहा हूं, वह शीर्ष बार में एक Google खोज करके, पता बार में स्थान बदलकर, और बुकमार्क पर क्लिक करके किया जाता है।

किसी को क्या हो रहा है के बारे में कोई भी विचार है? मैं किसी भी इनपुट की बहुत सराहना करता हूं।

धन्यवाद


आपके इनपुट के लिए दोनों का धन्यवाद। यह आपके द्वारा बताए गए कारणों में से एक होना चाहिए। दुर्भाग्य से, इस और अन्य सीमाओं के संबंध में Apple से कोई आधिकारिक दस्तावेज नहीं है। उम्मीद है, वे इस सुविधा को सक्षम करने के अधिक रचनात्मक तरीके के साथ आएंगे, जबकि इसके दुर्भावनापूर्ण उपयोग को रोकेंगे। मैंने बहुत बार सुना है कि लोग गलती से पेज से दूर चले जाते हैं और एक फॉर्म में दर्ज किए गए सभी डेटा को खो देते हैं।
आर्ट ज़ांब्रानो

क्या आपने प्रयोग करने की कोशिश की है addEventListener()?
हैलो'१

2
मुझे पूरा यकीन beforeunloadहै कि यह iOS पर सफारी पर काम नहीं करता है। :-( शायद वह नहीं जिसे आप ढूंढ रहे हैं, लेकिन मेरे पास एक सुझाव है कि मज़बूती से कामbeforeunload
पीटर वी। मॉरिश

1
मार्च 3'16 को, window.onbeforeunload = function(event) { event.returnValue = 'test'; }आईओएस 9.2.1 के क्रोम और सफारी दोनों पर काम नहीं करता है। मुझे वास्तव में पसंद है onbeforeunloadक्योंकि रद्द करने पर क्लिक करने पर पृष्ठ नहीं बदलता है।
vanduc1102

इस समस्या की तरह सफारी और आईओएस 13 में
चालाकी से

जवाबों:


20

मैंने पाया है कि onunload () ईवेंट आग लगाता है। यह व्यवहार कुछ अजीब है; घटना से जुड़े आपके कॉलबैक फ़ंक्शन में जो कुछ भी है वह वास्तव में पृष्ठभूमि में नया पृष्ठ लोड होने के बाद चलाया जाता है (आप इसे अभी तक लोड नहीं बता सकते हैं, लेकिन सर्वर लॉगिंग दिखाएगा कि इसमें है)।

अधिक अजीब तरह से, यदि आपके पास आपके onunload () में एक पुष्टिकरण () कॉल है, और उपयोगकर्ता ने कहीं और जाने के लिए एक लिंक पर क्लिक किया है, तो आप व्यवसाय में हैं। यदि, हालांकि, उपयोगकर्ता iPad सफारी ब्राउज़र टैब को बंद कर देता है, तो ऑनऑनलोड () ईवेंट को आग लग जाएगी, लेकिन आपकी पुष्टि () में प्रतिक्रिया के रूप में निहित रद्द होगा।


हुह, लगता है कि यह पुष्टि क्विक है (पुष्टि संदेश से पहले दूसरा पेज हिट हो गया है) न केवल मोबाइल सफारी के लिए बल्कि फायरफॉक्स (और शायद अन्य) के लिए भी सही है। तुमने मेरा दिमाग उड़ा दिया।
अमलगोविनस

4
unloadघटना के पक्ष में पदावनत pagehideदेख developer.apple.com/library/ios/documentation/AppleApplications/...
sol0mka

1
@ sol0mka: यह बात है, यार! महान! मेरे मामले में निम्नलिखित कोड ने काम किया, अब तक मैं अपने सभी ब्राउज़रों और iOS के लिए देख सकता हूं: $ (विंडो) .on ('पहले पृष्ठ लोड करना', फ़ंक्शन () {// मेरा सामान जो पेज पर किया जाना है परिवर्तन } ); मेरी नजर में यह स्वीकृत उत्तर होना चाहिए।
गरवानी

18

जावास्क्रिप्ट का यह बिट मेरे लिए आईपैड और आईफोन, साथ ही डेस्कटॉप / लैपटॉप / अन्य ब्राउज़रों पर सफारी और क्रोम पर काम करता है:

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';सेशन के समान प्रयोग करना काम नहीं कर रहा है ..
user2335065

धन्यवाद मुझे याद है कि मूल प्रश्न में। मैंने विशेष रूप से iOS पर इसका परीक्षण नहीं किया है, लेकिन संभवतः इस अतिरिक्त लाइन को जोड़ने से काम होगा: window.event.cancelBubble = true; मैं
खतरे

2
धन्यवाद, लेकिन दुख की बात है कि यह काम नहीं करता है ... मैंने इसके अंदर अलर्ट () डालने की कोशिश की, लगता है कि अलर्ट से पहले नया पेज लोड होना शुरू हो गया है ()। इसे भी देखें: stackoverflow.com/questions/3239834/…
user2335065

@ user2335065 क्या आपको इसके लिए कोई समाधान नहीं मिला।
नीरज राठौड़

दोस्तों, क्या आपको पेज छोड़ने से पहले पुष्टिकरण संकेत दिखाने के लिए कोई समाधान मिला? यह आईओएस सफारी को छोड़कर हर ब्राउज़र में ठीक काम करता है। मैंने पेजहाइड इवेंट की भी कोशिश की, लेकिन मेरे लिए काम नहीं किया। अग्रिम में धन्यवाद।
राहुल

6

केवल Apple निश्चित रूप से जानता होगा, लेकिन मेरा अनुमान है कि उन्होंने जानबूझकर मोबाइल सफारी में उस कार्यक्षमता को सक्षम नहीं किया है क्योंकि यह अक्सर छायादार वर्णों द्वारा उपयोग किया जाता है ताकि आप उनकी साइट पर बने रहें या बहुत सारी पोर्न / विज्ञापन विंडो को पॉप अप कर सकें।


55
या, आप जानते हैं, अपने परिवर्तनों को स्वचालित रूप से सहेज लें ताकि वे केवल इसलिए खो न जाएं क्योंकि आपने गलती से गलत चीज़ का दोहन किया था।
जोएल म्यूलर

4
मैंने कहा कि वैध उपयोग नहीं थे, मैंने सिर्फ इतना कहा कि जो सबसे अधिक उपयोग किए जाते हैं।
चार्ल्स बॉयंग

3
@JoelMueller आपकी टिप्पणी का स्वीकृत उत्तर होना चाहिए :)
सांचेज़

1
@JoelMueller वास्तव में मेरा उपयोग मामला है। Grrr @ सेब
user2808054

@JoelMueller आप किसी भी आधिकारिक दस्तावेज़ को साझा कर सकते हैं जहां हम इस कथन को संबोधित कर सकते हैं कि मोबाइल सफारी स्वचालित रूप से परिवर्तनों को सहेजती है।
नीरज राठौड़

3

वहाँ onbeforeunload के साथ WebKit में एक ज्ञात बग है । मेरा मानना ​​है कि यह क्रोम 5 के नवीनतम बीटा में तय किया गया है, लेकिन यह काफी संभव है कि iPad का ब्राउज़र WebKit के एक संस्करण से बना है जिसमें फिक्स नहीं है।

संबंधित क्रोम बग रिपोर्ट


1
मैं भ्रमित हूं या क्या यह बग अभी भी iPad ब्राउज़र पर मौजूद है?
पीटर

3

पहले से लोड होने वाली घटना मोबाइल सफारी द्वारा समर्थित नहीं है। आप यहां सभी समर्थित घटनाओं की सूची देख सकते हैं: हैंडलिंग इवेंट्स Apple प्रलेखन

और पहले से लोड सूची में नहीं है!


2

https://code.google.com/p/chromium/issues/detail?id=97035

सुन लो।

पेज बर्खास्तगी की घटनाओं (पहले से लोड, अनलोड, पेजहाइड) के दौरान अलर्ट की अनुमति नहीं है।

मुझे लगता है कि अलर्ट, प्रॉम्प्ट, पुष्टि और इन जैसे अन्य कार्यों को भी अब अनुमति नहीं है।


1

यदि आपको केवल यह जानना है कि क्या पृष्ठ छोड़ा गया है तो आप उपयोग कर सकते हैं document.unload। यह ios ब्राउज़रों में ठीक काम करता है। यदि आप Apple प्रलेखन को देखते हैं, तो आप पाएंगे कि यह पदावनत है और वे document.pagehide का उपयोग करने की सलाह देते हैं


हां, यह कार्यक्रम सफारी में आग लगाता है, लेकिन क्रोम में जैसा कि पुष्टि संकेत नहीं आ रहा है।
राहुल

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दस्तावेज़ अनलोड होने पर कॉल नहीं किया जाता है। देखें: यहाँ

इसलिए, सभी परिदृश्यों को कवर करने के लिए दोनों घटनाओं को शामिल करना महत्वपूर्ण है।

एनबी

मैंने अपने उदाहरण के console.logबजाय उपयोग किया है alertक्योंकि alertकुछ ब्राउज़र से अवरुद्ध हो जाएगा जब से beforeunloadया कहा जाता है visibilitychange

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.