简介
jQuery Mobile 的工作方式与经典网络应用程序不同。根据您每次访问提到的页面时如何绑定事件,它会一遍又一遍地绑定事件。这不是错误,这只是 jQuery Mobile 处理其页面的方式。
您的问题有多种解决方案。每个解决方案都有优点和缺点。
解决方案 1
最好的解决方案是使用 pageinit 来绑定事件。如果您查看官方文档,您会发现 pageinit 将触发 ONLY 一次,就像文档准备好一样,因此无法再次绑定事件.这是最好的解决方案,因为您没有像使用 off 方法删除事件那样的处理开销。
工作jsFiddle示例:http://jsfiddle.net/Gajotres/AAFH8/
解决方案 2
在绑定之前移除事件:
$('#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/
解决方案 3
使用 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.
要好得多
解决方案 4
一个新的,可能是其中最简单的一个。
$(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/
最后说明
如果您想了解有关页面事件、它们如何工作以及如何使用它们来防止多个事件绑定的更多信息,请查看此 ARTICLE,要透明,这是我的个人博客。或者也可以找到HERE。