我有一组绑定到'vmouseup'而不是'click'的列表项,因为事件的触发时间延迟了300ms。
我的问题是当我使用'vmouseup'或'vmousedown'绑定每个列表项时,我显然无法通过一些调整滚动列表。
我的列表元素看起来是这样的:
$(liElem).bind('vmouseup', function () {
scrollToTop();
showDetails();
});
我想我知道#1的答案与unbind()
/ die()
有关,而stopPropagation()
和preventDefault()
更新的答案
在iOS 4.2.1(iPod Touch)中,似乎有一些错误的阈值方法。如果向上滚动(从上到下滑动),一切正常工作,但向下滚动(从向下滑动到向上)距离pageY通常会给出错误值并触发事件。例如,如果阈值设置为30像素,并且我从手机的最底部滑动到顶部,它仍然可以触发事件。使用jQueryMobile 1.1.0 RC1和jQuery 1.7.1。
答案 0 :(得分:2)
var did_user_swipe = false;
$(liElem).bind('vmousedown', function () {
did_user_swipe = false;
}).bind('vmouseup', function () {
if (!did_user_swipe) {
scrollToTop();
showDetails();
}
}).bind('vmousemove', function () {
did_user_swipe = true;
});
默认设置false
的标志。当用户以滑动动作拖动手指时,该标志设置为true
。当标志设置为true
时,vmouseup
事件处理程序将不会运行。
以下是演示:http://jsfiddle.net/RB6mp/
您也可以设置滑动/点击行为的阈值,从而减少绑定vmousemove
事件的需要:
var coords = [0, 0],
threshold = 100;//in pixels
$(liElem).bind('vmousedown', function (event) {
//when the mouse is clicked, set the coordinates of that event
coords = [event.pageX, event.pageY];
}).bind('vmouseup', function (e) {
//when the mouse is released, calculate the distance from the start of the click to the end
var distance = Math.sqrt(Math.pow(coords[0] - e.pageX, 2) + Math.pow(coords[1] - e.pageY, 2));
//if the distance of the "swipe" is longer than the `threshold` set
if (distance > threshold) {
alert('Swipe (' + Math.floor(distance) + 'px)');
} else {
alert('Click (' + Math.floor(distance) + 'px)');
}
});