我正在为网页设置一个使用跟踪系统,当用户单击页面的某些元素时,该系统会将一些信息发送回服务器。我使用信标而不是传统的 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)