1

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

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

谢谢。

(我在出差,无法立即回复,但非常感谢您的建议,并会在适当的时候回复)

编辑:我最好添加以下内容: 我在卸载时进行的 AJAX 调用只会将一些数据(用户在页面上停留的时间)发送到 PHP-MySQL 服务器

4

2 回答 2

1

我不知道这里发生了什么,但 Firefox 4 对卸载的工作方式进行了显着更改:例如,如果您在链接单击事件期间执行 alert(),它将不再冻结页面,而是加载新的反正位置。也许这是类似的事情。

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

首先尝试使用同步请求,如下所述:jQuery 的同步 AJAX 请求如何工作?

这通常会保证请求返回。但是,非常谨慎地使用它 - 页面卸载时的阻塞行为可能会让用户非常恼火,甚至冻结浏览器。

于 2011-04-23T08:20:25.367 回答
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;

    }

});
于 2011-04-23T08:21:24.223 回答