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、ページが別のページに移動していたため、実行が既に操作をキャンセルしている可能性があります。これは、非同期操作の適切な動作です。すべてのブラウザでも同じように動作するはずです。

この順次コードの代わりに、コールバックを使用してみてください。トラックがその仕事を終えたら実行される関数を渡します。

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 に答える