2010-11-29 16 views
5

मैं यह जानना चाहता हूं कि विज़िटर किसी निश्चित पृष्ठ पर कितना समय व्यतीत करते हैं और इसे मेरे MySQL डीबी में संग्रहीत करते हैं।जेएस ऑननलोड ईवेंट हमेशा काम नहीं करेगा

मैं सिर्फ इस तरह window.onload पर एक टाइमर शुरू करने के बारे में सोचा:

window.onload= startCount; 
window.onunload= sendCount; 

var b=0; 
var y; 
function startCount() { 
    document.getElementById('livecount').innerHTML=b; 
    b=b+1; 
    y=setTimeout("startCount()",1000); 
} 

और आगंतुक के बाद पेज (window.onunload), मैं एक PHP के लिए एक XMLHttpRequest के माध्यम से समय भेज रहा छोड़ देता है फ़ाइल, जो इसे मेरे डीबी में स्टोर करेगी:

function sendCount() { 
    clearTimeout(y);  
if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.open("GET","count.php?q="+b,true); 
xmlhttp.send(); 
} 

समस्या यह हमेशा काम नहीं करती है। मैं कहूंगा कि यह 10 बार से 3 बार की तरह काम करता है। क्या यह हो सकता है कि PHP और SQL को पूरी तरह से निष्पादित करने के लिए पर्याप्त समय शेष नहीं है?

उत्तर

0

ऑननलोड ट्रैक करने का एक विश्वसनीय तरीका नहीं है ... अच्छा, बहुत कुछ भी। उदाहरण के लिए http://www.google.com/support/forum/p/Google+Analytics/thread?tid=6496cd5d4b627c0e&hl=en

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

+0

ठीक है, मैं देख रहा हूँ ... तो यह और भी काम नहीं करता है जब आप एक अलग URL में टाइप करके पृष्ठ को छोड़ :(ठीक है, और कैसे मैं मेरी समस्या (गिनती का समाधान कर सकता है और समय एक पर खर्च की दुकान कुछ पेज)? – LightDark

4

ऑनलोड लोड अविश्वसनीय है, इसलिए मैं एक AJAX समाधान पर विचार करूंगा। मैं इस में एक विशेषज्ञ नहीं हूं, लेकिन विचार जो दिमाग में आता है वह आपके काउंटर पर हर बार एक पिंग है। मैं हर दूसरे काउंटर को पिंग नहीं करूँगा, क्योंकि यह अत्यधिक लगता है।

मैं अवधियों, जैसे < 5 सेकंड, 30 सेकंड <, < 1 मिनट, < 5 मिनट, 5 + मिनट आप ध्यान में बार टूट जाएगा।

तो मैं तो जैसे जावास्क्रिप्ट का एक टुकड़ा लिखते थे:

window.onload = soCounter; 

var iter=0; 
var times=[0,5,30,60,300]; // Your duration choices 

function doCounter() { 

    sendCountPing(times(iter)); 

    iter++; 

    if(iter < times.length) { 
     setTimeout(doCounter, times[iter]*1000); 
    } 
} 

function sendCountPing(dur) { 
    if (window.XMLHttpRequest) 
    { // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    } 
    else 
    { // code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 

    xmlhttp.open("GET","count.php?q="+b,true); 
    xmlhttp.send(); 

} 

चाल है कि हर count.php?q=30 भेज दिया जाता है कि के लिए, आप count.php?q=5 गिनती से एक घटाना करने की जरूरत है। यह प्रोग्रामेटिक नहीं होना चाहिए, यह आसानी से बाद में संसाधित किया जा सकता है।

0: 3 // 3 people spent at least 0 seconds 
    5: 2 // 2 people spent at least 5 seconds 
30: 1 
60: 1 
300: 1 // 1 person spent at least 5 minutes 

मेक भावना:

स्पष्ट करने के लिए, अगर आप 3 आगंतुकों, एक खर्च 3 सेकंड, एक खर्च 20 सेकंड, और एक खर्च 30 मिनट था, तो आपको निम्न मायने रखता है देखना होगा?

+0

आपके व्यापक उत्तर के लिए बहुत बहुत धन्यवाद। हाँ, यह निश्चित रूप से समझ में आता है, लेकिन यह काफी नहीं है जो मैं करना चाहता हूं। मेरा लक्ष्य उपयोगकर्ताओं को पृष्ठ पर खर्च करने के लिए हर समय जोड़ना है (इसलिए कोई आंकड़े जरूरी नहीं हैं)। मैंने सोचा कि डीबी को हर 5 सेकंड में एजेक्स के साथ समय भेजना है, लेकिन क्या यह सर्वर कंप्यूटिंग शक्ति का एक बड़ा अपशिष्ट नहीं है? – LightDark

+2

जैसा कि कहीं और कहा जाता है, यदि यह लक्ष्य है , आप हल्के सर्वर स्क्रिप्ट में 30 सेकंड पिंग करने से सबसे अच्छे हैं। पिंग्स की आवृत्ति आपके पास साइट के प्रकार पर निर्भर करती है, लेकिन सामान्य साइटों पर, बहुत सी विज़िट लेस होती हैं 30 सेकंड से अधिक है। शायद आप 5 सेकंड पिंग कर सकते हैं, और फिर इसे 30 सेकंड पिंग में धीमा कर सकते हैं। किसी भी तरह से, आपको कभी भी सही संख्या नहीं मिलेगी। –

1

ऑनलोड हैंडलर के समय तक, पृष्ठ नीचे ले जाने की प्रक्रिया में है। मुझे यकीन नहीं है कि आपके पास डीओएम या अन्य सेवाओं की स्थिति के लिए क्या गारंटी है, लेकिन आप निश्चित रूप से एसिंच घटनाओं या समय-समय पर आग लगने की उम्मीद नहीं कर सकते हैं। हालांकि मानक का हिस्सा नहीं है, अधिकांश (सभी?) ब्राउज़र आज onbeforeunload हुक प्रदान करते हैं जो अन्य ईवेंट हैंडलर के समान ही काम करता है, सिवाय इसके कि आप चुनने पर अनलोड को रद्द करने के लिए झूठी वापसी भी कर सकते हैं।

+0

उत्तर के लिए धन्यवाद, मैंने कोशिश की कोशिश की और यह क्रोम के साथ बिल्कुल काम नहीं किया:/ – LightDark

+0

दिलचस्प। कार्य करना चाहिए? http://stackoverflow.com/questions/803887/can-i-pop-up-a-confirmation-dialog-when-the-user-is-closing-the-window-in-safari – peller

1

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

+0

आपके उत्तर के लिए धन्यवाद। जो मैं करने की कोशिश कर रहा हूं वह बस एक निश्चित पृष्ठ पर सभी आगंतुकों द्वारा व्यतीत समय का योग प्राप्त करता है और डेटाबेस में इस जानकारी को संग्रहीत करता है (उपयोगकर्ता को दिखाई नहीं देना चाहिए)। साथ ही यह जानकारी यथासंभव सटीक होनी चाहिए और उसे बहुत से डीबी अनुरोधों की आवश्यकता नहीं होनी चाहिए (मैं समय को प्रत्येक सेकेंड की तरह भेजने और सहेजना नहीं चाहता)। – LightDark

+1

ऐसा करने का कोई भरोसेमंद तरीका नहीं है कि मुझे सर्वर पर नियमित AJAX कॉल के बिना पता है, जो स्वाभाविक रूप से आपको उचित आवृत्ति को रखने की आवश्यकता होगी। यदि उस कॉल का अंत बिंदु बहुत हल्का है तो यह सौदा का बड़ा नहीं होना चाहिए। वास्तव में, कोई भी विधि बहुत सटीक नहीं होगी, इसलिए मुझे लगता है कि 30 सेकंड या उससे अधिक का संकल्प उतना ही उतना ही है जितना आप उम्मीद कर सकते हैं। यहां तक ​​कि अगर अनलोड ईवेंट ठीक से काम करता है, तो डेटा को उनके कंप्यूटर से दूर चलने वाले लोगों के साथ प्रदूषित किया जाएगा, फिर भी वेबपृष्ठ के साथ टैब स्विच करना, अन्य साइटों पर टैब स्विच करना इत्यादि। –

0

दूसरा विकल्प स्थानीय स्टोरेज/कुकी में डेटा को सहेजना है और अगली बार जब उपयोगकर्ता वेबसाइट पर आता है तो उसे भेजना; यह मानते हुए कि उपयोगकर्ता आपकी वेबसाइट पर रहता है या कभी वापस आ जाता है।

समय की गणना करने के लिए setInterval/setTimeout के बजाय Date() कैल्क का उपयोग करना बेहतर है।
onload = func के बजाय addEventListener का उपयोग करना बेहतर है।

sendPreviousStats(); 
window.addEventListener('load',loadFunc); 
window.addEventListener('unload',leaveFunc); 

function loadFunc() { 
    window.startTime = new Date(); 
} 

function leaveFunc() { 
    var msec = new Date().getTime()-window.startTime.getTime(); 
    var seconds = Math.round(msec/1000); 
    localStorage.setItem('leaveSeconds',seconds); 
} 

function sendPreviousStats() { 
    var duration = localStorage.getItem('leaveSeconds'); 
    if (duration !== null && duration !== undefined) { 
     localStorage.removeItem('leaveSeconds'); 
     sendCountPing(duration); 
    } 
} 
संबंधित मुद्दे