2012-08-01 47 views
5

后点击事件我正在开发iOS应用程序,使用与jQuery Mobile 1.1.1绑定的Phonegap。我的网页上有一个div,用于监听tap和taphold事件。taphold joker Mobile 1.1.1

我面临的问题是,一旦我抬起手指,触发事件就会在taphold事件后被触发。我如何防止这种情况? 提供了一个解决方案here但这是唯一的方法来做到这一点?如果您需要使用布尔标志来区分这两种情况,那么可以使抽头& taphold具有两个不同事件的整个点。

以下是我的代码:

$('#pageOne').live('pageshow', function(event) { 
    $('#divOne').bind('taphold', function (event) { 
     console.log("TAP HOLD!!");  
    }); 

    $('#divOne').bind('tap', function() { 
     console.log("TAPPED!!"); 
    }); 
}); 

将不胜感激帮助。谢谢!

回答

2

[久经考验] 我检查了jQuery Mobile的的实现。他们每次在'vmouseup'后都会在'taphold'之后发射'tap'事件。

解决方法是如果'taphold'已被触发,则不触发'tap'事件。按您需要如下创建自定义事件或修改源:

$.event.special.tap = { 
    tapholdThreshold: 750, 

    setup: function() { 
     var thisObject = this, 
      $this = $(thisObject); 

     $this.bind("vmousedown", function(event) { 

      if (event.which && event.which !== 1) { 
       return false; 
      } 

      var origTarget = event.target, 
       origEvent = event.originalEvent, 
       /****************Modified Here**************************/ 
       tapfired = false, 
       timer; 

      function clearTapTimer() { 
       clearTimeout(timer); 
      } 

      function clearTapHandlers() { 
       clearTapTimer(); 

       $this.unbind("vclick", clickHandler) 
        .unbind("vmouseup", clearTapTimer); 
       $(document).unbind("vmousecancel", clearTapHandlers); 
      } 

      function clickHandler(event) { 
       clearTapHandlers(); 

       // ONLY trigger a 'tap' event if the start target is 
       // the same as the stop target. 
       /****************Modified Here**************************/ 
       //if (origTarget === event.target) { 
       if (origTarget === event.target && !tapfired) { 
        triggerCustomEvent(thisObject, "tap", event); 
       } 
      } 

      $this.bind("vmouseup", clearTapTimer) 
       .bind("vclick", clickHandler); 
      $(document).bind("vmousecancel", clearTapHandlers); 

      timer = setTimeout(function() { 
       tapfired = true;/****************Modified Here**************************/ 
       triggerCustomEvent(thisObject, "taphold", $.Event("taphold", { target: origTarget })); 
      }, $.event.special.tap.tapholdThreshold); 
     }); 
    } 
}; 
+0

我该如何使用它? – 2013-10-03 15:26:54

+0

@JeremieWeldin上面提到了jquery.mobile.js文件本身的修改。 – 2014-02-03 17:39:39

+0

我终于得到了。我本应该回到这样评论。谢谢! – 2014-02-03 21:13:51

0

你可以使用jquery的stopImmediatePropagation()方法来解决这个问题。根据jquery api,stopImmediatePropagation()的解释方法

“被执行保持的处理程序的其余部分,并防止 事件向上冒泡的DOM树。”

+1

感谢您的建议,但它并没有解决问题。 – ares05 2012-08-02 04:19:26

+0

这不适用于'活'处理程序。同一份文件提到它! – 2012-08-17 04:31:17

0

把这个在您的taphold事件处理程序......这个建议假定o是一个jQuery对象,打响了taphold

的jQuery( o).one('tap click',function(){return false;});

绑定到一个方法只会触发一次事件。如果它是一个< a>标签,则返回false将停止执行该事件。

3

只需将此设置为您的文档的顶部或定义之前的任何地方你甚至:

$.event.special.tap.emitTapOnTaphold = false; 

然后你可以使用它像这样:

$('#button').on('tap',function(){ 
    console.log('tap!'); 
}).on('taphold',function(){ 
    console.log('taphold!'); 
}); 
0

由于刷卡,触发taphold然后我能够保持简单:

$(c).bind("taphold",function(e){ 
     if(e.target.wait){ 
      e.target.wait = false; 
     }else{ 
      alert("fire the taphold"); 
     }//eo if not waiting 
    }); 
    $(c).bind("swipe",function(e){ 
      e.target.wait = true;//taphold will come next if I don't wave it off 
     alert(e.target.text+"("+e.target.attributes.dataId.value+") got swiped"); 
     return false; 
    }); 

为了支持自来水也我推迟等待清除,直到点击事件也会一直触发。

-1

$ .event.special.tap = { tapholdThreshold:750,

setup: function() { 
    var thisObject = this, 
     $this = $(thisObject); 

    $this.bind("vmousedown", function(event) { 

     if (event.which && event.which !== 1) { 
      return false; 
     } 

     var origTarget = event.target, 
      origEvent = event.originalEvent, 
      /****************Modified Here**************************/ 
      tapfired = false, 
      timer; 

     function clearTapTimer() { 
      clearTimeout(timer); 
     } 

     function clearTapHandlers() { 
      clearTapTimer(); 

      $this.unbind("vclick", clickHandler) 
       .unbind("vmouseup", clearTapTimer); 
      $(document).unbind("vmousecancel", clearTapHandlers); 
     } 

     function clickHandler(event) { 
      clearTapHandlers(); 

      // ONLY trigger a 'tap' event if the start target is 
      // the same as the stop target. 
      /****************Modified Here**************************/ 
      //if (origTarget === event.target) { 
      if (origTarget === event.target && !tapfired) { 
       triggerCustomEvent(thisObject, "tap", event); 
      } 
     } 

     $this.bind("vmouseup", clearTapTimer) 
      .bind("vclick", clickHandler); 
     $(document).bind("vmousecancel", clearTapHandlers); 

     timer = setTimeout(function() { 
      tapfired = true;/****************Modified Here**************************/ 
      triggerCustomEvent(thisObject, "taphold", $.Event("taphold", { target: origTarget })); 
     }, $.event.special.tap.tapholdThreshold); 
    }); 
} 

};

@Akash Budhia:谢谢你的解答。 这很棒,听起来很适合我!

0

我仍然遇到问题,用jquery-mobile的taphold,我解决了taphold之后调用的问题,在元素上放了一个超时。 JQM 1.4 with emitTapOnTaphold = false;

例子:

$(".element").on("taphold", function() { 
        // function her 

         setTimeout (function() { 
             $(this).blur(); 
         400); 
});