iPhone不一致地执行javascript

时间:2012-11-30 02:31:46

标签: javascript iphone ios

我有以下链接:

<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中我可以忽略的东西?

2 个答案:

答案 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杀死了它。

如果是外部网站,请将其打开到新窗口。保持您的网站开放。