代码之家  ›  专栏  ›  技术社区  ›  caiocpricci2

是否可以拦截/覆盖页面中的所有点击事件?

  •  8
  • caiocpricci2  · 技术社区  · 12 年前

    我已经编写了一个html5应用程序,它应该可以在移动设备上工作。90%的时间它工作正常,但在某些设备(大多数是机器人4.0+)中,点击事件会触发两次。

    我知道为什么会这样,我正在使用 iScroll 4 模拟原生滚动,并处理滚动中发生的事件。(如果你感兴趣,第533行会调度事件)大多数时候它工作正常,但在某些设备中,iScroll调度的事件和附加到元素的原始onClick事件都会被触发,所以点击会发生两次。我找不到发生这种情况的设备的模式,所以我正在寻找防止双击的替代方案。

    我已经想出了一个丑陋的解决方案来解决这个问题。我已经将所有的点击都封装在一个“handleClick”方法中,该方法的运行频率不允许超过200ms。这变得很难维持。如果我有动态生成的内容,它会变得一团糟,当我试图将对象作为参数传递时,情况会变得更糟。

    var preventClick = false;
    
    function handleClick(myFunction){
    
       if (preventClick)
          return;
       setTimeout(function(){preventClick = true;},200);
    
       myFunction.call():
    }
    
     function myFunction(){
    
      ...
    
     }
    
    <div onclick='handleClick(myfunction)'> click me </div>
    

    我一直在试图找到一种方法来拦截整个页面中的所有点击事件,并以某种方式确定是否应该触发该事件。有可能做这样的事情吗?

    在单击时设置myFunction,但在调用之前,请触发 handleClick() ? 我在玩 custom events 目前,它看起来很有希望,但我不想改变整个应用程序中的每个事件。

    <div onclick='myfunction()'> click me </div>
    
    2 回复  |  直到 9 年前
        1
  •  8
  •   Community Mohan Dere    9 年前

    你可以用以下方法做到这一点(不过我不建议这样做):

    $('body').on('click', function(event){
      event.preventDefault();
      // your code to handle the clicks
    });
    

    这将阻止浏览器中的默认点击功能,如果你想知道点击的目标,只需使用 event.target . 提到 this 回答如何在preventDefault()之前添加点击检查的想法;

        2
  •  1
  •   SparK    12 年前

    我不喜欢属性上的事件,但那只是我自己。

    思考jquery: $(selector).click(function(){ <your handler code> } 你可以这样做:

    $(selector).click(function(event){
        handleClick(window[$(this).attr("onclick")]);
    };
    

    当然,不会有任何参数。。。