जवाबों:
onbeforeunloadईवेंट को आज़माएं : पेज अनलोड होने से ठीक पहले इसे निकाल दिया जाता है। यह आपको वापस पूछने की अनुमति देता है यदि उपयोगकर्ता वास्तव में छोड़ना चाहता है। डेमो onbeforeunload डेमो देखें ।
वैकल्पिक रूप से, आप एक अजाक्स अनुरोध भेज सकते हैं जब वह निकल जाता है।
मोज़िला डेवलपर नेटवर्क का एक अच्छा विवरण है और उदाहरण के लिए onbeforeunload ।
यदि आप पृष्ठ छोड़ने से पहले उपयोगकर्ता को चेतावनी देना चाहते हैं कि क्या आपका पृष्ठ गंदा है (यानी यदि उपयोगकर्ता ने कुछ डेटा दर्ज किया है):
window.addEventListener('beforeunload', function(e) {
var myPageIsDirty = ...; //you implement this logic...
if(myPageIsDirty) {
//following two lines will cause the browser to ask the user if they
//want to leave. The text of this dialog is controlled by the browser.
e.preventDefault(); //per the standard
e.returnValue = ''; //required for Chrome
}
//else: user is allowed to leave without a warning dialog
});
यहां एक वैकल्पिक समाधान है - चूंकि अधिकांश ब्राउज़रों में नेविगेशन नियंत्रण (नौसेना बार, टैब, आदि) पृष्ठ सामग्री क्षेत्र के ऊपर स्थित हैं, तो आप माउस पॉइंटर को पृष्ठ के शीर्ष से बाहर निकलने का पता लगा सकते हैं और " आपके जाने से पहले " प्रदर्शित कर सकते हैं । संवाद। यह पूरी तरह से विनीत है और इससे पहले कि वे वास्तव में छोड़ने के लिए क्रिया करने से पहले आपको उपयोगकर्ता के साथ बातचीत करने की अनुमति दें।
$(document).bind("mouseleave", function(e) {
if (e.pageY - $(window).scrollTop() <= 1) {
$('#BeforeYouLeaveDiv').show();
}
});
नकारात्मक पक्ष यह है कि निश्चित रूप से यह अनुमान है कि उपयोगकर्ता वास्तव में छोड़ने का इरादा रखता है, लेकिन अधिकांश मामलों में यह सही है।
इसके लिए मैं उपयोग कर रहा हूं:
window.onbeforeunload = function (e) {
}
पृष्ठ को उतारने से ठीक पहले इसे निकाल दिया जाता है।
onbeforeunload?
मुझे पता है कि इस सवाल का जवाब दिया गया है, लेकिन अगर आप वास्तविक BROWSER बंद होने पर केवल ट्रिगर करना चाहते हैं, और यही नहीं जब पगेलोड होता है, तो आप इस कोड का उपयोग कर सकते हैं:
window.onbeforeunload = function (e) {
if ((window.event.clientY < 0)) {
//window.localStorage.clear();
//alert("Y coords: " + window.event.clientY)
}
};
मेरे उदाहरण में, मैं स्थानीय भंडारण को साफ कर रहा हूं और उपयोगकर्ता को m पति y कोर्ड्स के साथ अलर्ट कर रहा हूं, केवल जब ब्राउज़र बंद हो जाता है, तो इसे प्रोग्राम के भीतर से सभी पेज लोड पर ध्यान नहीं दिया जाएगा।
eइस मामले में चर) का उपयोग किया जाना चाहिए: stackoverflow.com/questions/9813445/ …
This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. developer.mozilla.org/en-US/docs/Web/API/Window/event
इसे करने के लिए एक (थोड़ा हैसी) तरीका प्रतिस्थापित और लिंक है जो आपकी साइट से दूर AJAX कॉल के साथ सर्वर-साइड पर जाता है, जो उपयोगकर्ता को छोड़ने का संकेत देता है, फिर उपयोगकर्ता को बाहरी साइट पर ले जाने के लिए उसी जावास्क्रिप्ट ब्लॉक का उपयोग करें 'अनुरोध किया है।
यदि उपयोगकर्ता केवल ब्राउज़र विंडो बंद कर देता है या नए URL में टाइप करता है तो निश्चित रूप से यह काम नहीं करेगा।
इसके चारों ओर पाने के लिए, आपको संभावित रूप से जावास्क्रिप्ट का सेटटाइमआउट () पृष्ठ पर उपयोग करना होगा, जिससे हर कुछ सेकंड में एक AJAX कॉल किया जा सकेगा (इसके आधार पर आप कितनी जल्दी जानना चाहते हैं कि उपयोगकर्ता छोड़ दिया है)।
सेवा श्रमिकों के लिए धन्यवाद , क्लाइंट-साइड पर एडम के विशुद्ध रूप से इसी तरह के समाधान को लागू करना संभव है , बशर्ते ब्राउज़र इसका समर्थन करता है। बस दिल की धड़कन अनुरोधों को दरकिनार करें:
// The delay should be longer than the heartbeat by a significant enough amount that there won't be false positives
const liveTimeoutDelay = 10000
let liveTimeout = null
global.self.addEventListener('fetch', event => {
clearTimeout(liveTimeout)
liveTimeout = setTimeout(() => {
console.log('User left page')
// handle page leave
}, liveTimeoutDelay)
// Forward any events except for hearbeat events
if (event.request.url.endsWith('/heartbeat')) {
event.respondWith(
new global.Response('Still here')
)
}
})
setInterval(() => fetch('/heartbeat'), 5000)?
मामले में आपको कुछ एसिंक्रोनस कोड करने की आवश्यकता होती है (जैसे कि सर्वर को संदेश भेजना कि उपयोगकर्ता अभी आपके पृष्ठ पर केंद्रित नहीं है), ईवेंट beforeunloadको चलाने के लिए async कोड को समय नहीं देगा। Async के मामले में मैंने पाया कि visibilitychangeऔर mouseleaveघटनाएँ सबसे अच्छा विकल्प हैं। जब उपयोगकर्ता टैब बदलते हैं, या ब्राउज़र छुपाते हैं, या विंडो स्कोप से बाहर आकर लेते हैं, तो ये घटनाएँ आग लगा देती हैं।
document.addEventListener('mouseleave', e=>{
//do some async code
})
document.addEventListener('visibilitychange', e=>{
if (document.visibilityState === 'visible') {
//report that user is in focus
} else {
//report that user is out of focus
}
})
इसके लायक क्या है, यह वही है जो मैंने किया और शायद यह दूसरों के लिए मदद कर सकता है भले ही लेख पुराना हो।
पीएचपी:
session_start();
$_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR'];
if(isset($_SESSION['userID'])){
if(!strpos($_SESSION['activeID'], '-')){
$_SESSION['activeID'] = $_SESSION['userID'].'-'.$_SESSION['activeID'];
}
}elseif(!isset($_SESSION['activeID'])){
$_SESSION['activeID'] = time();
}
जे एस
window.setInterval(function(){
var userid = '<?php echo $_SESSION['activeID']; ?>';
var ipaddress = '<?php echo $_SESSION['ipaddress']; ?>';
var action = 'data';
$.ajax({
url:'activeUser.php',
method:'POST',
data:{action:action,userid:userid,ipaddress:ipaddress},
success:function(response){
//alert(response);
}
});
}, 5000);
Ajax activeUser.php पर कॉल करें
if(isset($_POST['action'])){
if(isset($_POST['userid'])){
$stamp = time();
$activeid = $_POST['userid'];
$ip = $_POST['ipaddress'];
$query = "SELECT stamp FROM activeusers WHERE activeid = '".$activeid."' LIMIT 1";
$results = RUNSIMPLEDB($query);
if($results->num_rows > 0){
$query = "UPDATE activeusers SET stamp = '$stamp' WHERE activeid = '".$activeid."' AND ip = '$ip' LIMIT 1";
RUNSIMPLEDB($query);
}else{
$query = "INSERT INTO activeusers (activeid,stamp,ip)
VALUES ('".$activeid."','$stamp','$ip')";
RUNSIMPLEDB($query);
}
}
}
डेटाबेस:
CREATE TABLE `activeusers` (
`id` int(11) NOT NULL,
`activeid` varchar(20) NOT NULL,
`stamp` int(11) NOT NULL,
`ip` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
मूल रूप से हर 5 सेकंड में js एक php फाइल पर पोस्ट होता है जो उपयोगकर्ता और उपयोगकर्ताओं के आईपी पते को ट्रैक करेगा। सक्रिय उपयोगकर्ता केवल एक डेटाबेस रिकॉर्ड है जो 5 सेकंड के भीतर डेटाबेस समय टिकट के लिए एक अद्यतन है। पुराने उपयोगकर्ता डेटाबेस को अपडेट करना बंद कर देते हैं। आईपी पते का उपयोग केवल यह सुनिश्चित करने के लिए किया जाता है कि एक उपयोगकर्ता अद्वितीय है इसलिए साइट पर 2 लोग 1 उपयोगकर्ता के रूप में पंजीकरण नहीं करते हैं।
शायद सबसे कुशल समाधान नहीं है, लेकिन यह काम करता है।