如何在元素上的onclick和onfocus此同时使用?(How to use both oncli

2019-07-21 19:35发布

我有我的网页上,我需要的onclick和onfocus此事件处理函数附加到一个元素。 当一个单一的点击情况,它应该做的事比双击不同。 当我第一次开始尝试,使这项工作,我的头开始旋转。 显然,将的onclick总是火的时候,你双击。 所以,我尝试使用基于超时结构是这样的...

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  el.onclick = function() {
    timer = setTimeout(function() { alert('Single'); }, 150);        
  }

  el.ondblclick = function() {
    clearTimeout(timer);
    alert('Double');
  }
}

但我得到了不一致的结果(使用IE8)。 它不能正常工作,很多次,但有时我会得到“单次”警告两次。

有没有人这样做过? 有没有更有效的方法?

Answer 1:

马特一样,我有一个更好的经验,当我稍有增加超时值。 此外,为了减轻单一的点击触发的问题的两倍(这点我是无法重现与反正较高的定时器),我添加了一行到单一的点击处理程序:

el.onclick = function() {
    if (timer) clearTimeout(timer);
    timer = setTimeout(function() { alert('Single'); }, 250);        
}

这样,如果点击已经设置为火,它会清除自身,以避免重复的“单”警报。



Answer 2:

如果您收到2个警报,似乎你的detecing双击门槛太小。 尝试增加150至300毫秒。

而且 - 我不知道你是保证在点击DBLCLICK的启动顺序。 所以,当您DBLCLICK被炒鱿鱼,它清除了第一个 click事件,但如果它的第二个“点击”事件之前触发,这第二个事件仍会触发自身,你会同时具有双击事件结束射击和一个单一的点击事件触发。

我看到了这个潜在的问题,两种可能的解决方案:

1)设置其他超时实际发射双击事件。 马克在你的代码是,双击事件是向其射击。 然后,当第二个“单点击”事件触发,它可以检查在这种状态下,并说:“哎呀,DBL单击挂起,所以我会什么都不做”

2)第二个选项是基于点击的事件来交换你的目标函数了。 它可能是这个样子:

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  var firing = false;
  var singleClick = function(){
    alert('Single');
  };

  var doubleClick = function(){ 
    alert('Double');
  };

  var firingFunc = singleClick;

  el.onclick = function() {
    // Detect the 2nd single click event, so we can stop it
    if(firing) 
      return;

    firing = true;
    timer = setTimeout(function() { 
       firingFunc(); 

       // Always revert back to singleClick firing function
       firingFunc = singleClick;
       firing = false;
    }, 150);

  }

  el.ondblclick = function() {
    firingFunc = doubleClick; 
    // Now, when the original timeout of your single click finishes, 
    // firingFunc will be pointing to your doubleClick handler        
  }
}

基本上,这里发生的一切是你让你设置的原始超时继续。 它总是会调用firingFunc(); 唯一改变的事情是什么firingFunc()实际上是指向。 一旦检测到双击,将其设置到DoubleClick。 然后我们始终一旦超时恢复到singleClick。

我们也有一个“炒”变量在那里,所以我们知道拦截第二张单曲点击事件。

另一种方法是完全忽略DBLCLICK事件,并且只与单个点击和计时器检测它:

window.onload = function() {
  var timer;
  var el = document.getElementById('testButton');

  var firing = false;
  var singleClick = function(){
    alert('Single');
  };

  var doubleClick = function(){ 
    alert('Double');
  };

  var firingFunc = singleClick;

  el.onclick = function() {
    // Detect the 2nd single click event, so we can set it to doubleClick
    if(firing){
      firingFunc = doubleClick; 
      return;
    }

    firing = true;
    timer = setTimeout(function() { 
       firingFunc(); 

       // Always revert back to singleClick firing function
       firingFunc = singleClick;
       firing = false;
    }, 150);

  }
}

这是未经测试的:)



Answer 3:

简单:

obj.onclick=function(e){
   if(obj.timerID){
          clearTimeout(obj.timerID);
          obj.timerID=null;
          console.log("double")
         }
       else{
          obj.timerID=setTimeout(function(){
                                            obj.timerID=null;
                                            console.log("single")
                                            },250)}
}//onclick


Answer 4:

小修复

       if(typeof dbtimer != "undefined"){
            dbclearTimeout(timer);
            timer = undefined;
            //double click
        }else{
            dbtimer = setTimeout(function() { 
            dbtimer = undefined;
            //single click
            }, 250);
        }


Answer 5:

,   cellclick   :   
        function(){
            setTimeout(function(){
                if (this.dblclickchk) return;
                setTimeout(function(){
                    click event......                   
                },100);
            },500);
        }

,   celldblclick    :   
        function(){
            setTimeout(function(){
                this.dblclickchk    =   true;
                setTimeout(function(){
                                          dblclick event.....
                },100);
                setTimeout(function(){
                    this.dblclickchk = false;
                },3000);
            },1);
        }


文章来源: How to use both onclick and ondblclick on an element?