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)上运行的任何建议?
答案 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>