在Firefox 4中无法使卸载事件触发

时间:2011-04-23 07:55:54

标签: ajax firefox onunload

我已经在卸载事件上运行 ajax-calls约一年了。 它一般在FF和IE中工作但不是100%,我不能说它什么时候失败了。 我通过写下bodytag注册活动:
    onunload的= “....”
我在FF4中收到错误消息,因为卸载事件也想在刚刚卸载的页面的div标签中写入。通过使ajax例程在目标div的id为'dummy'时不写入任何内容来解决此问题 我不是AJAX的专家,但以下代码有效: http://yorabbit.info/e-dog.info/tmp/ajax_ex.php(链接是文本页面)
(使用以下参数调用ajaxfunction2:filename,PHP的queryString,更新期间在目标div中显示的字符串,目标div的名称)

我没有在FF错误控制台中收到任何错误消息,并且IE9正常工作。 有什么方法可以让它在FF中运行吗?我刚开始尝试FF4,但我的印象是它的效果不如FF3。

感谢。

(我正在旅行,而且没有可能立即回复,但我非常感谢建议并会在适当的时候回复)

编辑: 我更好地补充一下: 我在卸载时进行的AJAX调用仅发送一些数据(用户在页面上停留的时间)到PHP-MySQL服务器

2 个答案:

答案 0 :(得分:1)

我不知道这里发生了什么,但Firefox 4对卸载的工作方式做了显着的改变:例如,如果你在链接点击事件期间做一个alert(),它将不再冻结页面,但是无论如何加载新位置。也许这是类似的。

但是,如果Ajax调用在任何浏览器中无法同步,则无法保证完成Ajax调用 - 在页面关闭之前,请求可能会也可能不会返回响应。这是否有效,以及用户的网络速度。

首先尝试使用同步请求,如下所示:How does jQuery's synchronous AJAX request work?

这通常可以保证请求回来。但是,谨慎使用非常 - 页面卸载时的阻塞行为对用户来说非常烦人,甚至冻结浏览器。

答案 1 :(得分:1)

我建议使用jQuery而不是自己跟踪浏览器更改。

<强>解决方案:
在此处查找工作示例:http://jsfiddle.net/ezmilhouse/4PMcc/1/

假设您的内部链接是相对设置的,因此您的外部链接以“http”开头:

<a href="http://google.com">Leave ...</a>
<a href="/home.html">Stay ...</a>

你可以通过jQuery事件劫持'a'标签并要求用户确认离开(如果是外部链接)。在'ok'的情况下,您启动'onleave'ajax调用(async = true)并将用户重定向到外部链接:

$('a').live('click', function(event){

    // cache link
    var link = $(this).attr('href');

    // check if external link (assuming that internal links are relative)
    if (link.substr(0,4) === "http") {

        // prevent default a tag event
        event.preventDefault();

        // popup confirm message
        var reply = confirm('Do you really want to leave?');
        if (reply) {

            var url = 'http:mydomain.com/ajax.php';
            var data = {'foo': 'bar', 'fee':'bo'};

            // kick off your 'onleave' ajax call
            // forced to be synchronous
            $.ajax({ 
                type: "POST",
                async: false,
                url: url,
                data: data,
                success: function( data ) { 

                   // ok case: leave page, cached link
                   window.location.href = link;

                }
            });

        }

        return false;

    }

});