উত্তর:
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();
}
});
খারাপ দিকটি অবশ্যই এটি এমন একটি অনুমান যা ব্যবহারকারী প্রকৃতপক্ষে চলে যেতে চান তবে বেশিরভাগ ক্ষেত্রেই এটি সঠিক it's
এর জন্য আমি ব্যবহার করছি:
window.onbeforeunload = function (e) {
}
পৃষ্ঠাটি লোড হওয়ার ঠিক আগে এটি ফায়ার করা হয়।
onbeforeunload,?
আমি জানি এই প্রশ্নের উত্তর দেওয়া হয়েছে, তবে আপনি যখন সত্যিকারের ব্রাউজারটি বন্ধ থাকবে কেবল তখনই ট্রিগার করার জন্য কিছু চান, এবং কেবলমাত্র যখন কোনও পৃষ্ঠা লোড হয় না, আপনি এই কোডটি ব্যবহার করতে পারেন:
window.onbeforeunload = function (e) {
if ((window.event.clientY < 0)) {
//window.localStorage.clear();
//alert("Y coords: " + window.event.clientY)
}
};
আমার উদাহরণস্বরূপ, আমি স্থানীয় স্টোরেজ সাফ করে দিচ্ছি এবং মাউসওয়াই কর্ডগুলি সহ ব্যবহারকারীকে সতর্ক করছি, কেবল যখন ব্রাউজারটি বন্ধ থাকে তবে প্রোগ্রামের মধ্যে থেকে সমস্ত পৃষ্ঠা লোডে এটিকে উপেক্ষা করা হবে।
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. ডেভেলপার.মোজিলা.আর.ইন-
এটি করার একটি (সামান্য হ্যাকি) উপায় হ'ল প্রতিস্থাপন এবং লিঙ্কগুলি যা আপনার সাইট থেকে অ্যাজেএক্স কল দিয়ে সার্ভার-সাইডে সরিয়ে নিয়ে যাচ্ছে, যা ব্যবহারকারী ইঙ্গিত করছে তা বোঝাচ্ছে, তারপরে ব্যবহারকারীকে বহিরাগত সাইটে নিয়ে যেতে একই জাভাস্ক্রিপ্ট ব্লক ব্যবহার করুন তারা অনুরোধ করা হয়েছে।
অবশ্যই যদি ব্যবহারকারী ব্রাউজার উইন্ডোটি বন্ধ করে দেয় বা কোনও নতুন ইউআরএল টাইপ করে তবে এটি কাজ করবে না।
এটি পেতে, আপনাকে সম্ভাব্যভাবে পৃষ্ঠাটিতে জাভাস্ক্রিপ্টের সেটটাইমআউট () ব্যবহার করতে হবে, প্রতি কয়েক সেকেন্ডে একটি এজেএক্স কল করা হবে (ব্যবহারকারী কতটা দ্রুত রেখেছেন তা জানতে আপনি কত দ্রুত জানতে চান) তার উপর নির্ভর করে।
সার্ভিস ওয়ার্কার্সকে ধন্যবাদ , ক্লায়েন্টের পক্ষে অ্যাডামের খাঁটি অনুরূপ একটি সমাধান কার্যকর করা সম্ভব , ব্রাউজার এটি সমর্থন করে granted হৃদস্পন্দনের অনুরোধগুলি কেবল নিষ্ক্রিয় করুন:
// 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 চালানোর জন্য সময় দেবে না। অ্যাসিঙ্কের ক্ষেত্রে আমি দেখতে পেয়েছি যে 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);
সক্রিয় ইউজার.এফপি তে অ্যাজাক্স কল
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 সেকেন্ডে জেএস একটি পিএইচপি ফাইলে পোস্ট করবে যা ব্যবহারকারী এবং ব্যবহারকারীদের আইপি ঠিকানা ট্র্যাক করবে। সক্রিয় ব্যবহারকারীরা কেবল একটি ডাটাবেস রেকর্ড যা 5 সেকেন্ডের মধ্যে ডাটাবেস টাইম স্ট্যাম্পের আপডেট থাকে। পুরানো ব্যবহারকারীরা ডাটাবেসে আপডেট করা বন্ধ করে দেন। আইপি ঠিকানাটি কোনও ব্যবহারকারী অনন্য কিনা তা নিশ্চিত করতে ব্যবহার করা হয় যাতে একই সময়ে 2 জন লোক 1 ব্যবহারকারী হিসাবে নিবন্ধভুক্ত না হন।
সম্ভবত সবচেয়ে দক্ষ সমাধান নয় তবে এটি কাজটি করে।