1

我已经编写了一些代码,我试图用来追踪访问者的 ip,以及他们在网站上停留的时间。代码:

<script>
var startTime = new Date();
window.onbeforeunload = $(function() {
    /* var ip = (window.location != window.parent.location) ? document.referrer: document.location; */
    /* var ip = "192.168.1.1"; */
    var endTime = new Date();        //Get the current time.
    var timeSpent = (endTime - startTime);        //Find out how long it's been.
    var ip = (window.location != window.parent.location) ? document.referrer: document.location; 
    $(window).load(function(event) {
         $.post('ajax.php', {ip: ip, timeSpent: timeSpent});
    });            
});
</script>

我不明白的是,为什么这不会等到用户尝试离开站点后再运行此脚本。

谁能帮我让它等到那时运行?谢谢!

4

2 回答 2

6

我可以看到此代码存在一些问题。

首先,$(function(){})$(document).ready(function(){}). 这意味着它将在 DOM 准备好时运行该函数,然后返回一个 jQuery 对象 ( $(document))。

第二,$(window).load(function(){})不需要。我假设当用户离开页面时,DOM 已经被加载了。

第三,window.onbeforeunload(and window.onunload)不会等待您的 AJAX 调用完成。您可以尝试使用async:false让它等待(这可能不适用于所有浏览器)。

$.ajax({
    url: 'ajax.php',
    data: {ip: ip, timeSpent: timeSpent},
    async: false
});

(注意:window.onbeforeunload不适用于所有浏览器;我知道 Opera 不会触发它。)

此外,window.onbeforeunload用于询问用户是否要离开页面。如果您从将呈现给用户的事件中返回一个字符串(Firefox 除外)。

如果您想在用户离开页面时发送 AJAX 调用,我建议您window.onunload改用。

(function(){  // Anonymous function so startTime isn't global
    var startTime = new Date();
    window.onunload = function() { // set to a function
        var endTime = new Date();  //Get the current time.
        var timeSpent = (endTime - startTime);  //Find out how long it's been.
        var ip = (window.location != window.parent.location) ? document.referrer: document.location; 
        $.ajax({
            url: 'ajax.php',
            data: {ip: ip, timeSpent: timeSpent},
            async: false
        });
    };
}());
于 2013-03-12T20:59:14.813 回答
1

你把这整件事弄得一团糟。所有你需要的是:

var startTime = new Date();
window.onbeforeunload = function() {
    var endTime = new Date();        //Get the current time.
    var timeSpent = (endTime - startTime);        //Find out how long it's been.
    var ip = (window.location != window.parent.location) ? document.referrer: document.location; 
    $.post('ajax.php', {ip: ip, timeSpent: timeSpent});
};
于 2013-03-12T20:57:14.787 回答