Javascript 如何在不影响网站的情况下捕获对浏览器页面的点击';什么是健壮性?

Javascript 如何在不影响网站的情况下捕获对浏览器页面的点击';什么是健壮性?,javascript,Javascript,我的javascript代码被添加到随机网站。我希望能够在点击网站上的(特定)链接/按钮时向我的服务器报告。但是,我希望在任何情况下(如代码错误或服务器id关闭等)都不会中断网站的执行。换句话说,我希望站点执行其默认操作,而不考虑我的代码 简单的方法是将事件侦听器添加到click事件中,同步调用服务器以确保调用已注册,然后执行click。但我不希望我的网站和代码能够导致点击无法完成 关于如何做到这一点还有其他想法吗?只要你不返回false;在你的回调中,你的AJAX是异步的我认为你的链接不工作不

我的javascript代码被添加到随机网站。我希望能够在点击网站上的(特定)链接/按钮时向我的服务器报告。但是,我希望在任何情况下(如代码错误或服务器id关闭等)都不会中断网站的执行。换句话说,我希望站点执行其默认操作,而不考虑我的代码

简单的方法是将事件侦听器添加到click事件中,同步调用服务器以确保调用已注册,然后执行click。但我不希望我的网站和代码能够导致点击无法完成


关于如何做到这一点还有其他想法吗?

只要你不返回false;在你的回调中,你的AJAX是异步的我认为你的链接不工作不会有任何问题

$("a.track").mousedown(function(){ $.post("/tools/track.php") })

我还建议您将整个logyc封装在一个try{}catch()块中,这样所包含的任何错误都不会阻止正常的单击行为继续。

应该正常处理单击

1) 如果javascript代码有错误,页面可能会在状态栏中显示错误图标,但它将继续处理,不会挂起


2) 如果您的ajax请求是异步的,页面将发出该请求并同时处理单击。如果您的服务器关闭,并且在后台发生的ajax请求超时,则不会导致单击事件无法处理。

可能是这样的情况?我没有测试过它,所以它可能包含一些打字错误,但想法是一样的

<script type="text/javascript">
function mylinkwasclicked(id){
    try{
        //this function is called asynchronously
        setTimeOut('handlingfunctionname('+id+');',10);
    }catch(e){
        //on whatever error occured nothing was interrupted
    }
    //always return true to allow the execution of the link
    return true;
}
</script>

函数MyLink已单击(id){
试一试{
//此函数是异步调用的
setTimeOut('handlingfunctionname('+id+');',10);
}捕获(e){
//无论发生什么错误,都没有中断
}
//始终返回true以允许执行链接
返回true;
}
然后,您的链接可能如下所示:

<a id="linkidentifier" href="somelink.html" onclick="mylinkwasclicked(5)" >click me!</a>

或者可以动态添加onclick:

<script type="text/javascript">
    var link = document.getElementById('linkidentifier');
    link.onclick=function(){mylinkwasclicked(5);};
</script>

var link=document.getElementById('linkidentifier');
link.onclick=function(){mylinkwasclicked(5);};

如果同步向服务器发出请求,则会阻止原始事件处理程序的执行,直到收到响应。如果异步执行,则链接或按钮的原始行为可能是执行表单发布或更改文档的url,这将中断您的异步请求。

附加此功能:

(new Image()).src = 'http://example.com/track?url=' + escape(this.href)
    + '&' + Math.random();
  • 它是异步的(在后台加载“伪映像”)
  • 它可以是跨域的(与ajax不同)
  • 它使用最基本的Javascript功能

  • 但是,由于在图像请求完成之前卸载站点,它可能会错过一些单击。

    将页面退出延迟到ping服务器url的时间

    function link_clicked(el)
    {
      try {
        var img = new Image();
        img.src = 'http://you?url=' + escape(el.href) + '&rand=' + math.random();
        window.onbeforeunload = wait;
      }catch(e){}
      return true;
    }
    
    function wait()
    {
      for (var a=0; a<100000000; a++){}
      // do not return anything or a message window will appear
    }
    
    功能链接\u点击(el)
    {
    试一试{
    var img=新图像();
    img.src=http://you?url='+escape(el.href)+'&rand='+math.random();
    window.onbeforeunload=等待;
    }捕获(e){}
    返回true;
    }
    函数wait()
    {
    
    for(var a=0;a您的代码(标识符)需要JQuery,如果他的链接显示在random网站的页面上,当他们没有JQuery框架时,它将不起作用,您自己添加它可能不会受到欢迎。@Peter您是对的,但我认为可以放心地假设大多数Javascript程序员都知道$function及其泛型函数。当然,您可以随时使用它getElementByTagName/Id,我认为在本例中,我提供的代码是非常自我的explanatory@duckyflip,我不认为你应该做出这样的假设。我说的是Prototype,但不是JQuery-我知道JQuery使用$,但我不知道它的意思。在这个简单的例子中,它看起来与Prototype$非常相似,所以目的是c李尔:但总的来说,我认为你的假设是不明智的。谢谢你的回答。不幸的是,在这种情况下我不能使用jQuery。看起来很好,但我能做些什么来避免错过对服务器的调用,因为实际点击链接会切换页面。你不能-因为页面无法改变它的行为。我想你必须使用一些统计来衡量错过了多少次点击。例如,如果你跟踪97次点击和100个登录页面(在一些随机的人群/网站上),这意味着统计上你的准确率为97%:)你必须相应地调整测量的数字。是的,这正是问题所在。哦,是的,别忘了不同的计算机运行循环需要不同的时间。使用setTimeout通过全局变量解锁循环可能更好。亲爱的匿名混蛋,这怎么“没有帮助”呢?它准确地回答了问题,并改进了以前的解决方案。您能否详细说明您的问题,并说明您喜欢当前答案的哪些方面,以及您不喜欢的方面,以便我们可以修改我们的答案或添加新的答案?您的问题确实让我感兴趣。