ユーザーがページの特定の要素をクリックすると、サーバーに情報を送り返すWebページの使用状況追跡システムを設定しています。クロスドメインを追跡するため、従来のajaxではなくビーコンを使用して情報を送信していますが、クリックされた要素がリンクである場合、Chrome/Safariで問題が発生します。
これは、問題を示す私のコードの簡略化されたバージョンです。
<!DOCTYPE html>
<head>
<title>Tracking Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div id="link">
<a href="">link</a>
</div>
<div id="nolink">
<div>nolink</div>
</div>
<script type="text/javascript">
function track(event){
var beacon = new Image();
var location = "http://www.mypage.com/tracking?element=";
if (event.target.parentNode.id =='link'){
beacon.src = location + '"link"';
} else if (event.target.parentNode.id == 'nolink'){
beacon.src = location + '"nolink"';
}
}
window.addEventListener('click', track, true);
</script>
</body>
</html>
Firefox、Chrome、Safariでは、「nolink」をクリックすると、期待どおりにメッセージがサーバーに返されます。「リンク」をクリックすると、Firefoxではメッセージが送信されますが、ChromeとSafariではメッセージは送信されません。(もちろん、IEでは何も機能しませんが、これはイベントリスナーのせいであると思うので、後で説明します)。
次のページが読み込まれる前にメッセージが送信されるようにするために、他に何かする必要がありますか?
誰かが疑問に思っている場合は、ビーコンの反対側に次のようなdjangoビューがあります。
def listener(request):
logging.info(request.GET.get("element", "received a message but couldn't find an element"))
return HttpResponse(status=200)