2015-12-11 6 views
8

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

कोई भी जानता है कि यह क्यों हो रहा है?

window.onbeforeunload = function() { 
 
    console.log("inside on before unload"); 
 
    var requestParam = new a.ListRequest(); 
 
    requestParam.setAction('set_delete'); 
 
    
 
    var callback = function(isSuccess, response) { 
 
    if (isSuccess) { 
 
     //do something 
 
    } else { 
 
     // do something else 
 
    } 
 
    }; 
 
    
 
    // Sends request to server 
 
    a.Fetch.list(requestParam, callback); 
 
    
 
}

+0

अपना कोड देखे बिना, एकमात्र अनुमान मैं दे सकता हूं .. आपके पास आपके कोड में एक बग है। –

+0

हालांकि यह क्रोम और फ़ायरफ़ॉक्स पर काम करता है। मैं कुछ नमूना कोड भी जोड़ूंगा – petranaya

+0

आप सर्वर पर क्या भेजते हैं? इसके अलावा आप इसे क्यों पहले से भेजना चाहते हैं? –

उत्तर

5

संभावना अनुरोध है कि लायें कॉल में होता है अतुल्यकालिक है और सफारी यह/अगले पृष्ठ पर जाने से टैब बंद करने से पहले खत्म करने के लिए के लिए इंतजार नहीं है। यदि आप कॉल सिंक्रोनस कर सकते हैं तो इसे काम करना चाहिए। ध्यान रखें कि सिंक्रोनस कॉल आमतौर पर कुछ उपकरणों में निराश और बहिष्कृत होते हैं। https://stackoverflow.com/a/11755262/1341437

+0

तुल्यकालिक अनुरोध बुरा है। उपयोगकर्ता I/O को कभी भी अवरुद्ध न करें। – Pinal

2

आप Beacon API (एफएफ, क्रोम, ओपेरा) का उपयोग कर सकते हैं::

window.addEventListener('unload', logData, false); 

function logData() { 
    navigator.sendBeacon("/log", analyticsData); 
} 

उपयोगकर्ता एजेंट आम तौर पर अतुल्यकालिक पर ध्यान नहीं देगा XMLHttpRequests में किए गए

यह Jquery से संबंधित जवाब तुल्यकालिक कॉल की एक अच्छी व्याख्या है एक अनलोड हैंडलर। इस समस्या को हल करने के लिए, डेटा सबमिट करने के लिए unload या beforeunload हैंडलर में आमतौर पर एक सिंक्रोनस XMLHttpRequest सिंक्रोनस बना देगा। सिंक्रोनस XMLHttpRequest उपयोगकर्ता एजेंट को दस्तावेज़ को उतारने में देरी करने के लिए मजबूर करता है, और अगली नेविगेशन धीमी लगती है। खराब पेज लोड प्रदर्शन की इस धारणा से बचने के लिए अगला पृष्ठ कुछ भी नहीं कर सकता है।

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

+1

मुझे लगता है कि आपको यह उल्लेख करना चाहिए कि "यह एक प्रयोगात्मक तकनीक है" – Louy

0

आप झूठी async:false

window.onbeforeunload = function() { 
    $.ajax({ 
     // Query to server 
     async:false, 
     method: "GET", 
     url: "your.page", 
     data: { param1 : "value1" } 
    }).done(function(jqXHR, textStatus) { 
     // Verify good data 
     // Do stuff 
     alert("Request done: " + textStatus); 
    }).fail(function(jqXHR, textStatus) { 
     alert("Request failed: " + textStatus); 
    }); 
} 
0

को async गुण सेट द्वारा jQuery.ajax साथ यह कर सकते हैं के रूप में @craigts कहा ajax कॉल वापस किया जा सकता से पहले, ब्राउज़र चला गया है। आपको उस पृष्ठ पर कुछ और सेकंड मिल सकते हैं।

window.onbeforeunload = function(e) { 
    return 'Dialog text here.'; 
}; 

हालांकि, अपने उपयोगकर्ताओं को इस कष्टप्रद मिल जाएगा।

दूसरा विकल्प, पृष्ठ अनलोड के इंतजार के बजाय एक और घटना ढूंढें। अपने डेटा को लगातार कैप्चर करें। इसे कैप्चर करें। क्या उपयोगकर्ता जारी रखने के लिए एक लिंक का उपयोग कर रहे हैं? यदि ऐसा है तो आप cancelEvent() के साथ लिंक को हाइजैक कर सकते हैं और फिर AJAX वापस लौटने के बाद जारी रख सकते हैं।

+0

मैंने बहस की कि क्या आपके दूसरे विकल्प की तरह एक वैकल्पिक समाधान प्रदान करना है, क्योंकि मैंने जिस साइट पर काम किया है, उस समस्या को हल करने का मुख्य तरीका यह है। – craigts

संबंधित मुद्दे