1

我有以下链接:

<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 中?

4

2 回答 2

3

这可能track()是一个异步操作。

在其他浏览器中,也许它足够快(而且你很幸运)它在window.location执行之前完成了所有任务。但是,这种行为很奇怪。

但是,在 iPhone 上,track()可能执行太慢以至于执行window.location已经取消操作,因为页面正在退出到另一个页面。这是异步操作的正确行为。它也应该在所有浏览器上都具有相同的作用。

而不是这个顺序代码,尝试使用回调。你传入一个函数,一旦 track 完成它的工作就会执行:

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  = ...;
});
于 2012-11-30T02:44:10.580 回答
1

你有一个竞争条件。您必须希望请求能够实现。

当页面退出时,它会终止打开的请求。我很惊讶它可以在桌面浏览器上运行,它们应该有同样的问题。将它放在网络速度较慢的远程服务器上,我打赌他们不会成功。

在过去,很容易让它与 while 循环一起工作,但 chrome/firefox 杀死了它。

如果是外部站点,请在新窗口中打开它。保持您的网站开放。

于 2012-11-30T02:43:53.190 回答