ヒートマップを構築するクリック追跡アプリを作成しています。トラッキングを機能させるために、ユーザーが自分のページに挿入するスクリプトを作成しています。
リダイレクトやフォーム送信を必要としない要素でうまく機能します。たとえば、h1
またはその他をクリックするp
と、完全に正しく機能します。しかし、をクリックするとa
、通常のリダイレクトの前にサーバーへのリクエストが発生することはありません。
ここ数日、私はそれを行うために多くの方法を試しました。まず、JSONP を使用する必要があったクロスドメイン リクエストだったので、通常の AJAX 呼び出しを試みましたが、その AJAX 呼び出しはリダイレクトの前に実行する時間がありませんでした。追加async: false
すれば問題は解決しますが、JSONP リクエストでは機能しません。そのため、リダイレクトを使用しても安全であることを示すフラグ変数を追加し、空の while ループを使用して ajax コールバックで try になるまで待機することにしました。しかし、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;
});
次に試したのは、unload
ページ イベントを使用して、進行中の ajax 呼び出しの合計がゼロになるまで待機し (カウンターを実装しました)、リダイレクトを続行することです。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
関数は実行フローもブロックしているように見え、リクエストは発生しません。
false
残っている唯一のアイデアは、イベント ハンドラーから戻り、クリックされた要素に手動でリダイレクトするhref
か、フォームを呼び出すsubmit()
ことですが、これは非常に複雑であり、このスクリプトを別の場所でデバッグするのは非常に面倒なことだと思います。ブラウザ。
他のアイデアはありますか?