我将一个 taphold 事件绑定到表的 td 元素,但是当我点击并按住以触发该事件时,它会以某种方式被多次触发。我的示例代码:
$("td").on("taphold", function(){
alert("taphold fired!");
});
如果我按住水龙头,我会一次收到至少 6 条警报消息。我怎样才能让事件在举行时只触发一次?我在带有 safari 和 chrome 浏览器的 Ipad 上测试了代码
我将一个 taphold 事件绑定到表的 td 元素,但是当我点击并按住以触发该事件时,它会以某种方式被多次触发。我的示例代码:
$("td").on("taphold", function(){
alert("taphold fired!");
});
如果我按住水龙头,我会一次收到至少 6 条警报消息。我怎样才能让事件在举行时只触发一次?我在带有 safari 和 chrome 浏览器的 Ipad 上测试了代码
jQuery Mobile
与经典 Web 应用程序的工作方式不同。根据您每次访问提到的页面时如何绑定事件,它会一遍又一遍地绑定事件。这不是错误,它只是如何jQuery Mobile
处理其页面。
您的问题有几种解决方案。每个解决方案都有优点和缺点。
最好的解决方案是使用pageinit
绑定事件。如果您查看官方文档,您会发现它pageinit
只会触发一次,就像文档准备好一样,因此事件不会再次被绑定。这是最好的解决方案,因为您没有像使用 off 方法删除事件时那样的处理开销。
工作jsFiddle
示例:http: //jsfiddle.net/Gajotres/AAFH8/
在绑定之前删除事件:
$('#index').on('pagebeforeshow',function(e,data){
$(document).off('click', '#test-button').on('click', '#test-button', function(e) {
alert('Button click');
});
});
工作jsFiddle
示例:http: //jsfiddle.net/Gajotres/K8YmG/
使用jQuery Filter
选择器,如下所示:
$('#carousel div:Event(!click)').each(function(){
//If click is not bind to #carousel div do something
});
因为事件过滤器不是官方jQuery
框架的一部分,所以可以在这里找到:http: //www.codenothing.com/archives/2009/event-filter/
简而言之,如果速度是您主要关心的问题,那么Solution 3
会好得多Solution 2.
一个新的,可能是最简单的。
$(document).on('pagebeforeshow', '#index', function(){
$(document).on('click', '#test-button',function(e) {
if(e.handled !== true) // This will prevent event triggering more then once
{
alert('Clicked');
e.handled = true;
}
});
});
工作jsFiddle
示例:http: //jsfiddle.net/Gajotres/Yerv9/
如果您想了解更多关于页面事件、它们如何工作以及如何使用它们来防止多个事件绑定的信息,请查看这篇文章,为了透明,这是我的个人博客。或者也可以在这里找到。
也尝试使用off:
$("td").off("taphold");
$("td").on("taphold", function(){alert("taphold fired!");});
您需要确保一次只有一个用于 taphold 的事件处理程序。这也触发了许多点击事件。