Best way to detect when a user leaves a web page?

前端 未结 8 2147
太阳男子
太阳男子 2020-11-22 01:57

What is the best way to detect if a user leaves a web page?

The onunload JavaScript event doesn\'t work every time (the HTTP request takes longer than t

8条回答
  •  渐次进展
    2020-11-22 02:13

    For What its worth, this is what I did and maybe it can help others even though the article is old.

    PHP:

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

    JS

    window.setInterval(function(){
                var userid = '';
                var ipaddress = '';
                var action = 'data';
    
                $.ajax({
                    url:'activeUser.php',
                    method:'POST',
                    data:{action:action,userid:userid,ipaddress:ipaddress},
                    success:function(response){
                         //alert(response);                 
                    }
                });
              }, 5000);
    

    Ajax call to 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);
            }
        }
    }
    

    Database:

    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;
    

    Basically every 5 seconds the js will post to a php file that will track the user and the users ip address. Active users are simply a database record that have an update to the database time stamp within 5 seconds. Old users stop updating to the database. The ip address is used just to ensure that a user is unique so 2 people on the site at the same time don't register as 1 user.

    Probably not the most efficient solution but it does the job.

提交回复
热议问题