কোনও ব্যবহারকারী কখন কোনও ওয়েব পৃষ্ঠা ছেড়ে যায় তা সনাক্ত করার সর্বোত্তম উপায়?


195

যদি কোনও ব্যবহারকারী কোনও ওয়েব পৃষ্ঠা ছেড়ে যায় তবে সনাক্ত করার সর্বোত্তম উপায় কী?

onunloadজাভাস্ক্রিপ্ট ঘটনা প্রত্যেক সময় কাজ করে না (HTTP অনুরোধ বেশী সময় লাগে চেয়ে সময় ব্রাউজার বিনষ্ট প্রয়োজন)।

একটি তৈরি করা সম্ভবত বর্তমান ব্রাউজারগুলি দ্বারা অবরুদ্ধ করা হবে।

উত্তর:


219

onbeforeunloadইভেন্টটি চেষ্টা করে দেখুন : পৃষ্ঠাটি লোড হওয়ার ঠিক আগে এটি বহিস্কার করা হয়। এটি ব্যবহারকারীকে সত্যিই ছেড়ে যেতে চায় কিনা তা আপনাকে জিজ্ঞাসা করার অনুমতি দেয়। ডেমোটি পুনরায় ডাউনলোড ডেমোটি দেখুন ।

বিকল্পভাবে, তিনি চলে গেলে আপনি একটি অজ্যাক্স অনুরোধটি প্রেরণ করতে পারেন ।


3
ব্যবহারকারীর পক্ষে যদি আপনার ফর্মটি পরিবর্তিত হয় এবং যদি তা প্রম্পট করে তবেই তা ট্র্যাক করে রাখলে এটি খুব সুন্দর হবে - তাই এটি বিরক্তিকর নয়।
adam0101

3
এছাড়াও নোট করুন যে বিভিন্ন মোবাইল ব্রাউজারগুলি ইভেন্টটির ফলাফল উপেক্ষা করে (এটি তারা ব্যবহারকারীকে নিশ্চিতকরণের জন্য জিজ্ঞাসা করে না)। ফায়ারফক্সের প্রায় একইরকম: কনফিগারে একটি গোপন পছন্দ রয়েছে। সংক্ষেপে এর অর্থ এটি ব্যবহারকারী সর্বদা নিশ্চিত করে যে দস্তাবেজটি লোড করা হতে পারে।
এমজেবি

2
নোট করুন যে ব্যবহারকারী যখন পৃষ্ঠাটি রিফ্রেশ করে বা কোনও ফর্ম জমা দেয় তখন এই পদ্ধতিটিও ডাকে।
জায়টসেভ দিমিত্রি

@ আন্ড্রেয়াস পিটারসন, ব্যবহারকারীর অধিবেশন বাদ দেওয়ার লক্ষ্য নিয়ে আমারও একই চ্যালেঞ্জ রয়েছে। প্রকল্পটির সাথে সম্পর্কিত কিনা তা পরীক্ষা করতে আমি কীভাবে টাইপ করা url ক্যাপচার করব?
জেসিসি.সানাবরিয়া

21

মোজিলা বিকাশকারী নেটওয়ার্কে অনবিতর ডাউনলোডের একটি দুর্দান্ত বর্ণনা এবং উদাহরণ রয়েছে ।

আপনার পৃষ্ঠাটি নোংরা থাকলে পৃষ্ঠাটি ছাড়ার আগে আপনি যদি ব্যবহারকারীকে সতর্ক করতে চান (যেমন যদি ব্যবহারকারী কোনও ডেটা প্রবেশ করে থাকে):

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
});

10

এখানে একটি বিকল্প সমাধান করা হয়েছে - যেহেতু সবচেয়ে ব্রাউজারে নেভিগেশন নিয়ন্ত্রণ (এনএভি বার, ট্যাব ইত্যাদি) অবস্থিত হয় উপরে পাতা কন্টেন্ট এলাকায়, আপনি উপরের মাধ্যমে পৃষ্ঠা রেখে মাউস পয়েন্টার সনাক্ত এবং প্রদর্শন করতে পারেন একটি " আপনার বেরোনোর আগে ' ডায়ালগ। এটি সম্পূর্ণরূপে আপত্তিহীন এবং এটি ব্যবহারকারীর সাথে প্রকৃতপক্ষে চলে যাওয়ার আগে কার্য সম্পাদন করার আগে এটি আপনাকে ইন্টারঅ্যাক্ট করার অনুমতি দেয় ।

$(document).bind("mouseleave", function(e) {
    if (e.pageY - $(window).scrollTop() <= 1) {    
        $('#BeforeYouLeaveDiv').show();
    }
});

খারাপ দিকটি অবশ্যই এটি এমন একটি অনুমান যা ব্যবহারকারী প্রকৃতপক্ষে চলে যেতে চান তবে বেশিরভাগ ক্ষেত্রেই এটি সঠিক it's


আমি এরকম কিছু দেখতে পাচ্ছি, আমি আমার ব্যবহারকারীর কাছে কিছুটা আপত্তিজনক কিছু দেখাতে চাই, আমার পৃষ্ঠাটি ছাড়ার আগে, আমি পিছনের বোতামে হোভার ইভেন্টের মতো কিছু দেখতে পাচ্ছি, কারণ ব্যবহারকারীরা ফিরে যাওয়ার আগে আমাকে ইভেন্টটি ছড়িয়ে দিতে হবে। আমি বিশ্বাস করি যে সর্বোত্তম উপায় হ'ল মাউস ছেড়ে দেহের নথিটি সনাক্ত করা এবং ব্যবহারকারী পৃষ্ঠার সাথে ইন্টারেক্ট করেছেন কিনা তা নির্ধারণ করার জন্য কিছু যুক্তি প্রদর্শন করুন do
লিওনার্দো সুজা পাইভা

8

এর জন্য আমি ব্যবহার করছি:

window.onbeforeunload = function (e) {

}

পৃষ্ঠাটি লোড হওয়ার ঠিক আগে এটি ফায়ার করা হয়।


1
অপেরা 12 এবং পুরানো সংস্করণগুলি এটি সমর্থন করে না ... zachleat.com/web/…
সাইরাস

এটি আগের দুটি উত্তরগুলির চেয়ে আরও ভাল যা একই সমাধান দেয় onbeforeunload,?
ড্যান ড্যাসক্লেস্কু

5

আমি জানি এই প্রশ্নের উত্তর দেওয়া হয়েছে, তবে আপনি যখন সত্যিকারের ব্রাউজারটি বন্ধ থাকবে কেবল তখনই ট্রিগার করার জন্য কিছু চান, এবং কেবলমাত্র যখন কোনও পৃষ্ঠা লোড হয় না, আপনি এই কোডটি ব্যবহার করতে পারেন:

window.onbeforeunload = function (e) {
        if ((window.event.clientY < 0)) {
            //window.localStorage.clear();
            //alert("Y coords: " + window.event.clientY)
        }
};

আমার উদাহরণস্বরূপ, আমি স্থানীয় স্টোরেজ সাফ করে দিচ্ছি এবং মাউসওয়াই কর্ডগুলি সহ ব্যবহারকারীকে সতর্ক করছি, কেবল যখন ব্রাউজারটি বন্ধ থাকে তবে প্রোগ্রামের মধ্যে থেকে সমস্ত পৃষ্ঠা লোডে এটিকে উপেক্ষা করা হবে।


উইন্ডো.সভেন্ট আমার জন্য অপরিজ্ঞাত
কার্ল গ্লেজার

Merr leader এর উদাহরণটি ভুল, উইন্ডো.সভেন্টটি কেবল আই-এর পুরানো সংস্করণগুলির উদাহরণ হিসাবে ফ্যালব্যাক হিসাবে ব্যবহার করা উচিত, অন্য ক্ষেত্রে ইভেন্টের প্যারামিটার ( eএই ক্ষেত্রে ভেরিয়েবল) ব্যবহার করা উচিত: stackoverflow.com/questions/9813445/ …
Sk8erPeter

আমি ভুল বলে যতদূর যেতে চাই না। আমার উদাহরণগুলি IE এবং Chrome এ আমার জন্য কাজ করে। আমার উদাহরণটি সেই দৃশ্যের জন্য যা ব্যবহারকারী ওয়েব ব্রাউজারে এক্স (নিকট) ক্লিক করে। বা সম্ভবত সবচেয়ে সুন্দর উপায় না, কিন্তু এটি কাজ করে।
Merr লিডার

এমডিএন থেকে: 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. ডেভেলপার.মোজিলা.আর.ইন-
রবিন নিল

3

এটি করার একটি (সামান্য হ্যাকি) উপায় হ'ল প্রতিস্থাপন এবং লিঙ্কগুলি যা আপনার সাইট থেকে অ্যাজেএক্স কল দিয়ে সার্ভার-সাইডে সরিয়ে নিয়ে যাচ্ছে, যা ব্যবহারকারী ইঙ্গিত করছে তা বোঝাচ্ছে, তারপরে ব্যবহারকারীকে বহিরাগত সাইটে নিয়ে যেতে একই জাভাস্ক্রিপ্ট ব্লক ব্যবহার করুন তারা অনুরোধ করা হয়েছে।

অবশ্যই যদি ব্যবহারকারী ব্রাউজার উইন্ডোটি বন্ধ করে দেয় বা কোনও নতুন ইউআরএল টাইপ করে তবে এটি কাজ করবে না।

এটি পেতে, আপনাকে সম্ভাব্যভাবে পৃষ্ঠাটিতে জাভাস্ক্রিপ্টের সেটটাইমআউট () ব্যবহার করতে হবে, প্রতি কয়েক সেকেন্ডে একটি এজেএক্স কল করা হবে (ব্যবহারকারী কতটা দ্রুত রেখেছেন তা জানতে আপনি কত দ্রুত জানতে চান) তার উপর নির্ভর করে।


4
আপনি যদি প্রতিবেদনের হোম পদ্ধতির ব্যবহার করেন তবে পৃষ্ঠার প্রতিটি লিঙ্ককে সংশোধন করার দরকার নেই।
ভিঙ্কো ভার্সালভিক

3

সার্ভিস ওয়ার্কার্সকে ধন্যবাদ , ক্লায়েন্টের পক্ষে অ্যাডামের খাঁটি অনুরূপ একটি সমাধান কার্যকর করা সম্ভব , ব্রাউজার এটি সমর্থন করে 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)?
ড্যান ড্যাসক্লেস্কু

পুনঃটুইট জেএস কোড একটি নেটওয়ার্ক অনুরোধ / হৃদস্পন্দন থেকে বেরিয়ে আসে এবং পরিষেবা কর্মী এটি বাধা দেয়।
জেফরি সুইনি

2

সেক্ষেত্রে আপনাকে কিছু অ্যাসিক্রোনাস কোড করা দরকার (যেমন সার্ভারে একটি বার্তা প্রেরণ যে ব্যবহারকারী এখনই আপনার পৃষ্ঠায় ফোকাস করছে না), ইভেন্টটি অ্যাসিঙ্ক কোডটি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
    }  
})


0

এর মূল্য কী, তার জন্য আমি এটি করেছি এবং নিবন্ধটি পুরাতন হওয়া সত্ত্বেও এটি অন্যকে সহায়তা করতে পারে।

পিএইচপি:

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 ব্যবহারকারী হিসাবে নিবন্ধভুক্ত না হন।

সম্ভবত সবচেয়ে দক্ষ সমাধান নয় তবে এটি কাজটি করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.