在离开页面之前执行onbeforeunload上的JavaScript操作

在离开页面之前执行onbeforeunload上的JavaScript操作,javascript,onbeforeunload,Javascript,Onbeforeunload,我写了一些代码,我试图用它来锁定访问者的ip,以及他们在网站上停留的时间。 代码: var startTime=新日期(); window.onbeforeunload=$(函数(){ /*var ip=(window.location!=window.parent.location)?document.referer:document.location*/ /*var ip=“192.168.1.1”*/ var endTime=new Date();//获取当前时间。 var timesp

我写了一些代码,我试图用它来锁定访问者的ip,以及他们在网站上停留的时间。 代码:


var startTime=新日期();
window.onbeforeunload=$(函数(){
/*var ip=(window.location!=window.parent.location)?document.referer:document.location*/
/*var ip=“192.168.1.1”*/
var endTime=new Date();//获取当前时间。
var timespunt=(endTime-startTime);//了解它已经运行了多长时间。
var ip=(window.location!=window.parent.location)?document.referer:document.location;
$(窗口)。加载(函数(事件){
$.post('ajax.php',{ip:ip,timeSpent:timeSpent});
});            
});
我不明白的是,为什么不等到用户试图离开站点后再运行这个脚本

有人能帮我让这个等到那时再运行吗?
谢谢大家!

你把这整件事搞得一团糟。您所需要的只是:

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

你把整件事搞得一团糟。您所需要的只是:

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

我可以看到这段代码有一些问题

首先,
$(function(){})
$(document.ready(function(){})
的缩写。这意味着它将在DOM就绪时运行函数,然后返回jQuery对象(
$(document)

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

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

(注意:
window.onbeforeunload
不能在所有浏览器中工作;我知道Opera不会启动它。)

另外,
window.onbeforeuload
用于询问用户是否要离开页面。如果您从事件中返回一个字符串,该字符串将显示给用户(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
        });
    };
}());

我可以看到这段代码有一些问题

首先,
$(function(){})
$(document.ready(function(){})
的缩写。这意味着它将在DOM就绪时运行函数,然后返回jQuery对象(
$(document)

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

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

(注意:
window.onbeforeunload
不能在所有浏览器中工作;我知道Opera不会启动它。)

另外,
window.onbeforeuload
用于询问用户是否要离开页面。如果您从事件中返回一个字符串,该字符串将显示给用户(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
        });
    };
}());


您正在将
window.onbeforeunload
设置为一个jQuery对象,而不是一个函数。这可以修改为工作吗?为什么要使用
$(window.load)(
在里面?我假设当用户离开页面时,DOM已经准备好了。这是一个问题,你真的不知道这段代码在做什么,是吗?我试图在站点上获得时间。首先,通过获取开始时间,然后,当用户离开时,获取新时间,父窗口的url(这是在100多个站点上构建的),并使用ajax发布到php页面,在没有用户提示的情况下运行更多php。您正在将
window.onbeforeunload
设置为jQuery对象,而不是函数。这可以修改为工作吗?为什么要使用
$(window)。加载(
在里面?我假设当用户离开页面时,DOM已经准备好了。这是一个问题,你真的不知道这段代码在做什么,是吗?我试图在站点上获得时间。首先,通过获取开始时间,然后,当用户离开时,获取新时间,父窗口的url(这是在100多个站点上构建的),并使用ajax发布到php页面,在没有用户提示的情况下运行更多的php。浏览器不会等待ajax调用完成,因为这可能不起作用。100%很好。谢谢。@RocketHazmat无需等待它完成,据我所知,触发请求就足够了。@ShadowWizard:但页面不能在ajax调用完成之前卸载吗?我发现,与全国各地的朋友一起测试时,这种方法大约有效8/10次如果失败,它就不能工作。我确实确保我测试过的每个人都有Javscript,并且可以工作。浏览器不会等待AJAX调用完成,因为这可能不起作用。100%很好。谢谢。@RocketHazmat无需等待它完成,据我所知,触发请求就足够了。@ShadowWizard:但是页面不能解锁吗在AJAX调用完成之前,我发现在与全国各地的朋友进行测试时,这种方法大约可以工作8/10次。出于某种原因(在我上面)out fail不起作用。我确实确保与我一起测试的每个人都有Javscript,并且都正常工作。感谢
窗口。onunload
建议。感谢
窗口。onunload
建议。