【发布时间】:2019-08-30 00:38:51
【问题描述】:
我们正在创建一个用于构建热图的点击跟踪应用。我正在编写一个脚本,用户应该将其插入到他们的页面中以进行跟踪。
它适用于不需要重定向或表单提交的元素。例如,如果我点击h1 或p 或其他任何东西,它会完全正确。但是,如果我点击a,对我们服务器的请求永远不会在正常重定向之前发生。
在过去的几天里,我尝试了很多方法来做到这一点。首先,我尝试了一个普通的 AJAX 调用,因为它是一个跨域请求,我必须使用 JSONP,但同样,该 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(),但这会使事情复杂化,相信我已经在不同的浏览器中调试此脚本非常痛苦。
还有人有其他想法吗?
【问题讨论】:
-
你试过 preventDefault 吗?
-
你的
itsSafeToMoveOnvar 声明在哪里? -
@JibiAbraham 我需要重定向,preventDefault 会取消它。
-
@sp00m 它是在该点击处理程序中声明的
标签: javascript jquery