2010-06-29 20 views
31

असल में, जब कोई उपयोगकर्ता मेरे एप्लिकेशन में कोई वेबपृष्ठ छोड़ देता है, तो मुझे AJAX के साथ एक PHP स्क्रिप्ट कॉल करने की आवश्यकता होती है, जो वेबपृष्ठ पर बिताए गए समय को सम्मिलित करेगा डेटाबेस में और फिर पेज छोड़ दें।

AJAX अनुरोध को समाप्त करने के लिए प्रतीक्षा करना महत्वपूर्ण है क्योंकि मेरे आवेदन में वेबपृष्ठ उपयोगकर्ताओं तक पहुंच योग्य नहीं हैं जब तक कि वे पिछले पृष्ठ पर एक निश्चित समय नहीं बिताते हैं (मान लें कि दो मिनट)।

यहाँ मेरी jQuery कोड है:

$(document).ready(function() { 

    var teid = TEID; 
    var startTime = new Date().getTime(); 

    $(window).unload(function() { 
     var timeSpentMilliseconds = new Date().getTime() - startTime; 
     var t = timeSpentMilliseconds/1000/60; 

     $.ajax({ 
      type: 'POST', 
      url: '/clientarea/utils/record-time', 
      data: 'teid=' + teid + '&t=' + t 
     }); 
    }); 

}); 

मैं इसे कैसे बदलना चाहिए AJAX अनुरोध वेबपेज रवाना होने से पहले समाप्त करने के लिए के लिए तो यह इंतजार करेंगे?

संपादित करें:

या यह बेहतर (आसान) हो सकता है सिर्फ AJAX अनुरोध हर मिनट बार-बार या तो किया जा जाने के लिए। क्या यह संभव है?

उत्तर

30

ठीक है, आप अपने AJAX कॉल पर async: false सेट कर सकते हैं ताकि ब्राउजर कुछ और करने से पहले पूरा करने के अनुरोध को प्रतीक्षा कर सके, लेकिन ध्यान दें कि यह अनुरोध की अवधि के लिए ब्राउज़र को 'लटका' देगा।

$.ajax({ 
    type: 'POST', 
    async: false, 
    url: '/clientarea/utils/record-time', 
    data: 'teid=' + teid + '&t=' + t 
}); 

मैनुअल से:

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

+0

हम्म। धन्यवाद। मैंने अपना प्रश्न अपडेट किया है। एजेक्स अनुरोध को हर मिनट के दो मिनट के दोहराने के लिए बस इतना आसान हो सकता है। मुझे यह कैसे करना है? –

+12

मैं 'अनलोड' पर ** especialy ** से बचने की दृढ़ता से अनुशंसा करता हूं। – jAndy

+0

मैंने पाया है कि समस्या के बावजूद, 'async: false' करने से हमेशा बेहतर समाधान होता है। –

4
मेरे लिए

, तुम्हारा ब्राउज़र बंद करने से पहले प्रतीक्षा करने के लिए ... के लिए एक अच्छा विचार नहीं है
बस क्योंकि क्या हुआ अगर मैं वास्तव में इसे बंद करना चाहते? ...

एक पेज परेशान करता है, तो एक उपयोगकर्ता, यह अच्छा नहीं है ...

मेरा सुझाव है, पृष्ठ में, आप 2 मिनट (यदि 2 मिनट की आवश्यकताएं हैं) की प्रतीक्षा करें, तो एक AJAX भेजें जिसे उपयोगकर्ता ने 2 मिनट किया है ...

तो आप इसे सर्वर की तरफ देख सकते हैं यदि कोई उसके 2 मिनट या नहीं ...

0

jQuery.ajax() विधि में async विकल्प है। यदि आप इसे false पर सेट करते हैं तो कॉल तब तक अवरुद्ध हो जाएगा जब तक प्रतिक्रिया वापस आती है (या यह समय समाप्त हो जाती है)। मैं बहुत शर्मिंदा हूं, जो इसे कॉल कर रहा है, ब्राउज़र को अनलोड हैंडलर में बुनाई करने के लिए रोक देगा।

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

यदि आपको केवल यह जानने की आवश्यकता है कि उपयोगकर्ता पृष्ठ पर एक्स सेकंड था या नहीं, तो आप केवल ऑनलोड हैंडलर में टाइमआउट सेट कर सकते हैं (setTimeout(function, ms) का उपयोग करके) यदि उपयोगकर्ता आवश्यक समय व्यतीत करता है तो कॉल करता है। तो एक अनलोड हैंडलर की कोई ज़रूरत नहीं होगी।

1

उपयोग onbeforeunload:

$(document).ready(function(){ 
    window.onbeforeunload = function(){ 
    // $.ajax stuff here 
    return false; 
    } 
}); 

यह कम से कम उपयोगकर्ता एक messagebox अगर वह वर्तमान विंडो/टैब को बंद करना चाहता है जो उसे पूछता लाएगा।

1

मुझे लगता है कि आपके द्वारा सुझाए गए मतदान तकनीक का उपयोग करना बेहतर होगा, हालांकि यह वेब सर्वर पर कुछ लोड का कारण बन जाएगा।

$(document).ready(function() { 

    var teid = TEID; 
    var startTime = new Date().getTime(); 

    var ajaxFunc = function() { 
     var timeSpentMilliseconds = new Date().getTime() - startTime; 
     var t = timeSpentMilliseconds/1000/60; 

     $.ajax({ 
      type: 'POST', 
      url: '/clientarea/utils/record-time', 
      data: 'teid=' + teid + '&t=' + t 
     }); 
    }; 

    setInterval(ajaxFunc, 60000); 

}) 

आप WebSockets :)

+0

धन्यवाद। लेकिन यह केवल एक मिनट के बाद ही निष्पादित हो जाएगा? क्या यह बार-बार हर मिनट (60 सेकंड) निष्पादित कर सकता है? –

+2

सेटटाइमआउट – sje397

2

यह एक बुरा विचार कोशिश करते हैं और आपके उपयोगकर्ता ब्राउज़र का अपहरण, क्योंकि यह उन्हें बुरा विचार देने के लिए और उन्हें दूर भेज देंगे करने के लिए है का उपयोग कर सकते हैं जब खुशी होगी।

यदि किसी कारण से आप एक नया पृष्ठ नहीं बनाना चाहते हैं, जब तक उपयोगकर्ता ने पिछले एक समय पर न्यूनतम समय नहीं बिताया है, तो सबसे अच्छा काम सर्वर पक्ष को पायलट करना है, यानी अनुरोधित समय तक वर्तमान पृष्ठ पर रीडायरेक्ट करना बीत चूका है।

आपको AJAX कॉल करने की भी आवश्यकता नहीं है, केवल सत्र में स्टोर करें जब पृष्ठ पर सेवा की गई थी, और कुछ निश्चित समय बीतने तक निम्नलिखित पृष्ठ न दिखाएं।

उपयोगकर्ताओं को बताना सुनिश्चित करें कि उन्हें एक नए पृष्ठ के लिए तैयार होने की प्रतीक्षा करनी है, शायद एक साधारण जावास्क्रिप्ट उलटी गिनती के साथ।

यदि आप चाहते हैं कि उपयोगकर्ता वास्तव में एक निश्चित समय के लिए सक्रिय पृष्ठ (यानी दो मिनट के लिए प्रतीक्षा करने के लिए दूसरी टैब/विंडो पर स्विच न करें), ठीक है, मैं एक प्रभावी समाधान का प्रस्ताव नहीं दे सकता।

6

अनलोड हैंडलर में कुकी सेट करने के बारे में कैसे? सर्वर को बाद के अनुरोधों पर इसे देखना चाहिए।

<script> 
    $(window).unload(function(){document.cookie='left_on='+(new Date())}) 
</script> 
7

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

var navigator.sendBeacon = navigator.sendBeacon || function (url, data) { 
    var client = new XMLHttpRequest(); 
    client.open("POST", url, false); // third parameter indicates sync xhr 
    client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); 
    client.send(data); 
}; 

आशा इस मदद करता है!

+0

के विपरीत सेटइंटरवाल क्या करता है, मुझे लगता है कि यह सुरुचिपूर्ण है, मैंने ऐप बंद होने पर डेटा भेजने के लिए इलेक्ट्रॉन में इसका इस्तेमाल किया – furiel

+0

2018 में, यह जाने का तरीका है। – Baishu

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

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