我有以下链接:
<a href='external-url' class='track' data-type='event' data-category='category'>
Link
</a>
单击链接时,将执行以下功能:
$('a.track').on('click', function(e){
e.preventDefault();
var type = $(this).data("type");
var category = $(this).data("category");
track(type, category);
window.location = $(this).attr("href");
});
track函数通过ajax发布数据并将其存储在数据库中。在桌面浏览器上,这完全有效。在Android上,这也完全正常。
在iPhone上,我看到不工作了大约10次(链接将我带到外部网站而没有添加到数据库中),然后它会神奇地开始工作大约10次倍!任何人都可以确定问题可能是什么,无论是在我的代码中,还是在iOS中我可以忽略的东西?
答案 0 :(得分:3)
可能是track()
是异步操作。
在其他浏览器中,也许它足够快(而且你很幸运)它在执行window.location
之前完成了所有任务。但是,这种行为很奇怪。
然而,在iPhone上,track()
执行速度太慢,执行window.location
已经取消了操作,因为页面正在退出到另一个页面。这是异步操作的正确行为。它应该在所有浏览器上也起到相同的作用。
尝试使用回调代替此顺序代码。传入一个在轨道执行完成后执行的函数:
function track(type,category,callback){
//track operations up here and your ajax setup
//execute callback when ajax operation replies
if(ajaxStatus === 200){
callback();
}
}
//using track, we pass in parameters and the callback
//which when executed, runs the code inside it
track(type,category,function(){
window.location = ...;
});
答案 1 :(得分:1)
你有竞争条件。你必须希望这个请求成功。
当页面退出时,它会终止打开的请求。我很惊讶它可以在桌面浏览器上工作,他们应该有同样的问题。把它放在慢速网络上的远程服务器上,我打赌它们不会成功。
在过去很容易让它与while循环一起工作,但chrome / firefox杀死了它。
如果是外部网站,请将其打开到新窗口。保持您的网站开放。