Safari在页面卸载前不让功能完成?

时间:2011-09-15 08:41:00

标签: javascript dom safari osx-snow-leopard

function log(name, value)
{
    mylog.push({'name':name, 'value':value});
}

function flush()
{   
    for (i = 0 ; i < mylog.length ; i++){
        url_str += '&n[]=' + mylog[i].name + '&v[]=' + mylog[i].value;
    }
    url_str += '&r='+Math.floor(Math.random() * 100000);

    var img = new Image();
    var url = 'http://somedomain.com/pixel.php?' + url_str;
    img.src = url;
}

if (window.attachEvent) 
    window.attachEvent('onunload', flush);
else if (window.addEventListener) 
    window.addEventListener('unload', flush, false);

我正在研究一些跟踪用户交互以在页面上查找热点的代码。大部分已经完成,并且可以在大多数浏览器上运行,但我目前难倒在Safari 5.0.5 / Mac 10.6上(顺便说一句,它也可以在Windows XP上与Safari 5.0.1一起复制)。给我带来困难的部分是页面传输期间的链接点击。例如,下面的代码将我带到someotherpage.html:

<form onclick="log('LINK_CLICKED', 'some other page'); this.submit();" action="someotherpage.html">Some other page</form>

该网站将我带到所有浏览器中的someotherpage.html,但只有Safari 5.0.5 / Mac 10.6在日志中不显示LINK_CLICKED。在Safari检查器中进行一些控制台检查后,我发现Safari有“无法加载资源”错误。我怀疑这是因为虽然可以调用URL,但浏览器已决定继续(?)。

在任何情况下,我都尝试过beforeunload事件并使用setTimeout来延迟页面卸载。我 考虑完全改变HTML形式,但这将是一个相当大的努力。尽管如此,除非有人的想法引起我的注意,否则我会对此持开放态度。关于它如何在Safari 5.0.5(Mac 10.6)上运行的任何建议?

1 个答案:

答案 0 :(得分:1)

我认为你只是遇到一种竞争条件,可以通过增加像素负载的回调来缓解这种情况。

function log(name, value, callback)
{
    mylog.push({'name':name, 'value':value, 'callback':callback});
}


function flush()
{   
    for (i = 0 ; i < mylog.length ; i++){
        url_str += '&n[]=' + mylog[i].name + '&v[]=' + mylog[i].value;
    }
    url_str += '&r='+Math.floor(Math.random() * 100000);

    var img = new Image();
    img.onload = logReady;
    var url = 'http://somedomain.com/pixel.php?' + url_str;
    img.src = url;
}

function logReady()
{
  for (i = 0 ; i < mylog.length ; i++){
       mylog[i].callback();
    }
}



<form onclick="log('LINK_CLICKED', 'some other page', function() { form.submit(); });" action="someotherpage.html">Some other page</form>