ヒートマップを構築するクリックトラッキングアプリを作成しています。私は、ユーザが自分のページに挿入して追跡するためのスクリプトを作成しています。リダイレクトする前にサーバーにクリックされたリンクに関する情報を送信
これは、リダイレクトやフォーム送信を必要としない要素でうまく動作します。たとえば、h1
またはp
などをクリックすると、完全に正しく動作します。しかし、私がa
をクリックした場合、私たちのサーバーへのリクエストは、通常のリダイレクトの前には起こりません。
最後の数日間、私はそれを行うために多くの方法を試しました。まず、JSONPを使用しなければならないクロスドメイン要求だったので、通常のAJAX呼び出しを試みましたが、AJAX呼び出しはリダイレクト前に実行する時間がありませんでした。 async: false
を追加すると問題は解決しましたが、JSONPリクエストでは機能しません。そこで、リダイレクトで移動するのが安全であることを示すフラグ変数を追加し、ajaxコールバックで試行されるまで空のwhileループを使用しました。しかし、whileループは実行フローをブロックしていたので、コールバックはその変数をtrue
に設定する機会を得られませんでした。ここではいくつかの単純化されたコードは次のとおりです。私が試した
$(document).on('click', function (e) {
//part of the code is omitted
$.ajax({
url: baseUrl,
data: data,
type: "get",
dataType: "jsonp",
crossDomain: true,
complete: function (xhr, status,) {
itsSafeToMoveOn = true;
}
});
while(!itsSafeToMoveOn){}
return true;
});
次のことは、進行中の総AJAX呼び出しがゼロになるまで待機する(私はカウンターが実装されていた)、その後、リダイレクトで上に移動するunload
ページイベントを使用することです。これは、FirefoxとIEで働いていたが、WebKitの中で、このエラーが発生しました:
Error: Too much time spent in unload handler
私は、サーバーの応答を気にしないと、要求のためのimg.src
を使用すると、このような場合のための理想的なフィット感になることに気づいた後。この時点で、コードは次のようになります。
$(document).click(function (e) {
//part of the code is ommited
(new Image).src = baseUrl + '?' + data;
if (tag === "a" || clickedElement.parents().has("a")) {
sleep(100);
}
return true;
});
こうして私は全体的なスクリプトのパフォーマンスを少し向上させましたが、リンクの問題は変わりません。 sleep
関数も実行フローをブロックしており、要求は発生しません。それはすでに巨大な痛みだ
だけのアイデアの左側には、イベントハンドラからと、クリックされた要素のhref
に手動でリダイレクトまたはフォーム上のsubmit()
を呼び出すことよりも、false
を返すことですが、それは非常にに物事を複雑にし、私を信じますさまざまなブラウザでこのスクリプトをデバッグしてください。
誰にも他のアイデアはありますか?
あなたはpreventDefaultを試しましたか? –
あなたの 'itsSafeToMoveOn' varはどこに宣言されていますか? – sp00m
@ JibiAbraham私はリダイレクトが発生する必要があります、preventDefaultはそれをキャンセルします。 –