【发布时间】:2015-09-09 17:12:49
【问题描述】:
我有一个混合移动应用程序,该应用程序通过电话差距开发并针对仅 iOS 设备。我使用 Backbone.js 作为我的 MVC 框架,使用 jQuery、FastClick.js 和 Hammer.js 作为事件。
我有一个可垂直滚动的项目列表。如果我点击一个项目,它应该会打开详细信息视图。如果我在列表不滚动时点击该项目,这很好。但是,如果我在列表滚动或减速时点击某个项目,它会选择错误的项目并显示其详细信息。
我在看
Tapping on scrolled list generates tap event for wrong element、javascript scroll event for iPhone/iPad? 和其他建议我收听滚动列表的 onscroll 事件的网站。每当用户滚动列表时都会触发此事件。我在 onscroll 的回调中禁用了点击事件。我在回调中设置了一个计时器,超时时间为 300 毫秒,然后在该回调中启用点击事件,该事件在 300 毫秒后执行。如果我在计时器触发之前收到另一个滚动事件,我会取消之前的计时器并再次将其设置为在 300 毫秒后触发。当滚动完全停止时,不会触发其他事件。所以,我只能依靠这个事件。
问题是即使滚动正在减速并且没有完全停止,事件也会触发。因此,即使列表正在减速并且没有停止,计时器也会被触发,我再次遇到错误的详细信息选择问题。当滚动完全停止时,该事件也会再次触发。 如果我将计时器增加到 >300 毫秒,那么在非动量滚动的情况下,启用点击需要更长的时间,并且用户将继续点击多次。
下面是sn-ps的代码:
当视图加载时,绑定tap事件和onscroll事件:
that.$('.scrollListItem').hammer().bind('tap',$.proxy(that.showDetail,that));
this.$('#scrollList').bind('scroll',$.proxy(this.checkscroll,this));
checkscroll函数
checkScroll: function(e){
this.$('.scrollListItem').hammer().unbind('tap');
clearTimeout(myGlobalScrollTimer);
var that = this;
myGlobalScrollTimer = setTimeout(function(){
that.$('.scrollListItem').hammer().bind('tap',$.proxy(that.showDetail,that));
},300);
}
checkScroll 函数当前正在触发,即使滚动列表正在减速并且还没有完全停止。 如何检测到滚动完全停止并且 UI 不再减速,然后才启用点击事件?有没有其他方法可以解决这个问题?请指教。
【问题讨论】:
-
投反对票的人至少可以评论为什么投反对票吗?
标签: javascript jquery ios cordova scroll