1

我正在从我们公司内部网的各个页面实现点击跟踪,以添加一些急需的众包流行链接功能(“过去 24 小时内您部门中最流行的链接”等)

我正在使用 jQuery 的 .live() 绑定到页面上所有链接元素的 mousedown 事件,过滤事件,然后在返回 true 之前向后端服务器发出带有各种数据的伪 ajax 请求,这样链接动作触发:

$("#contentarea a").live("mousedown", function(ev) {
    //
    // detect event, find closest link, process it  here
    //
    $.ajax({
        url: 'my-url',
        cache: false,
        dataType: 'jsonp',
        jsonp: 'cb',
        data: myDataString,
        success: function() {
            // silence is golden -- server does send success JSONP but 
            // regardless of success or failure, we allow the user to continue
        }
    });

    return true; // allow event to continue, user leaves the page.
}

正如您可能从上面猜到的那样,我有几个限制条件:

  • 后端跟踪服务器与调用页面位于不同的子域中。我无法解决这个问题。这就是为什么我使用 JSONP(和 GET)而不是正确的 AJAX 和 POST。我无法实现 AJAX 代理,因为 Web 服务器没有脚本的出站网络访问权限。
  • 这可能不相关,但为了全面披露,内容和脚本位于“主要内容”iframe 内(这不会改变。我可能最终会将事件侦听器移动到父框架以监视它链接和所有子内容,但第 1 步是让它在“1 个子窗口”的简化情况下正常工作)。父母和孩子是同一个域。
  • 后端是 IIS/ASP(同样是一个约束——别问!),所以我不能立即分叉后端进程或以其他方式终止响应,而是像在更好的平台上一样继续处理

尽管如此,在大多数情况下,系统都可以正常工作——我单击页面上的链接,它们会非常无缝地出现在数据库中。

然而,它并不可靠——对于大量链接,尤其是目标设置为“_top”的非站点链接,它们不会出现。如果链接在新选项卡或新窗口中打开,则注册成功。

我已经排除了脚本错误——似乎是:

(a) 请求从未及时到达后端;或者

(b) 请求正在发出,但 ASP 检测到客户端在不久之后断开连接,并且由于它是 GET 请求,因此没有处理它。

我怀疑(b),因为服务器的延迟非常快,并且许多链接注册正常。如果我在事件触发后弹出警报,或者将返回值设置为 false,则单击已注册 OK。

关于如何解决这个问题的任何建议(在我无法更改约束的情况下)?我不能使 GET 请求同步,因为它不是真正的 AJAX。

:如果我向 ASP 发出 POST 请求会更好吗?如果 (b) 是罪魁祸首,那么 POST 与 GET 的行为会有所不同吗?如果是这样,我可以使用隐藏的 iframe/form 来发布数据。但是,我怀疑这会更慢,更笨重,并且可能仍然无法及时完成。我无法收听请求是否完成,因为它是跨域的。

:我可以在 GET 请求触发后向脚本添加延迟吗?如何以单线程方式执行此操作?我需要从我的函数中返回 true,以确保最终触发默认事件,所以我不能使用 setTimeout()。等待“成功”触发并设置一些变量的紧密循环会起作用吗?我担心这会使事情冻结太多,响应速度会变慢。我假设 jQuery delay() 插件也只是一个循环?

还是我没想到的其他东西可能是罪魁祸首?

我不需要万无一失的可靠性。如果所有链接在 95% 的时间里都是同样可捕获的,那就没问题了。但是现在,有些链接在 100% 的时间里都是可捕获的,而另一些则是不可捕获的——这并不能满足我想要实现的目标。

提前致谢。

4

3 回答 3

0

我会尝试从链接事件处理程序返回 false,记住 URL 并仅在 JSONP 请求成功时导航离开。希望它不应该增加太多的延迟。考虑到您在 Inranet 上,可能没问题。

于 2010-07-17T03:39:03.423 回答
0

我会尝试不同的方法。您可以绑定到不同的事件,例如:

$(window).unload(function(event) {
  // tracking code here
});
于 2010-07-17T03:39:55.230 回答
0

解决了!

简短的回答是:没有可靠的方法可以通过 GET 请求进行跨域。我尝试了各种方法,包括存储事件并尝试稍后重播事件,以及各种黑客尝试让它发挥作用。

然后我尝试了紧密的循环,它们也不可靠。

最后,我只是放弃并使用了一个动态创建的表单来发布结果,目标设置为隐藏的 iFrame。

很可靠——似乎浏览器在继续之前暂停以完成其 POST 请求,并且 ASP 尊重 POST。事实证明,它一点也不“笨拙”。当然,由于浏览器安全模型,我看不到结果……但在这种情况下没关系。

我现在在踢自己,因为我没有先尝试那个选项。

于 2010-07-19T06:49:05.637 回答