如何捕获浏览器页面上的单击而不会对网站的稳健性产生任何影响?

时间:2009-05-18 09:41:57

标签: javascript

我的javascript代码已添加到随机网站。我希望能够在点击网站上的(特定)链接/按钮时向我的服务器报告。但是我希望在任何情况下(例如我的代码中的错误,或者我的服务器ID等等)没有任何可能的网站执行中断。换句话说,无论我的代码如何,我都希望网站执行默认操作。

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

关于如何做到的任何其他想法?

6 个答案:

答案 0 :(得分:1)

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

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

我还建议你将整个logyc封装在 try {} catch()块中,这样任何被调用的错误都不会阻止正常的点击行为继续。

答案 1 :(得分:1)

也许是这样的?我没有测试它,所以它可能包含一些拼写错误,但想法是一样的......

<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>

那么您的链接可能如下所示:

<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>

答案 2 :(得分:1)

附上此功能:

(new Image()).src = 'http://example.com/track?url=' + escape(this.href)
    + '&' + Math.random();
  1. 它是异步的('伪图像'在后台加载)
  2. 它可以是跨域(与ajax不同)
  3. 它使用最基本的Javascript功能
  4. 但是,由于在图像请求完成之前网站已卸载,可能会错过点击

答案 3 :(得分:0)

点击应该正常处理。

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

延迟页面退出的时间足以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
}

所以我们所做的就是在页面出口处添加一个小延迟,以便为出站ping提供足够的时间进行注册。您也可以在单击处理程序中调用wait(),但这会为不退出页面的链接添加不必要的延迟。将延迟设置为能够提供良好结果的延迟,而不会显着降低用户速度。超过一秒的任何事情都会很粗鲁,但是第二次是请求往返很长时间没有返回任何数据。只需确保您的服务器不再需要处理请求,或者只是转储到日志并稍后处理。