jQuery Mobile - 如何使用绑定到vmouseup的项目滚动列表

时间:2012-04-18 23:52:35

标签: jquery listview jquery-mobile event-handling

我有一组绑定到'vmouseup'而不是'click'的列表项,因为事件的触发时间延迟了300ms。

我的问题是当我使用'vmouseup'或'vmousedown'绑定每个列表项时,我显然无法通过一些调整滚动列表。

我的列表元素看起来是这样的:

 $(liElem).bind('vmouseup', function () {
      scrollToTop();
      showDetails();
 });
  1. 如何在不触发list元素上的vmouseup事件的情况下滚动列表?
  2. 我记得在SOFlow的某处读到vmouseup并不一定总是被触发,所以我应该使用vmousedown吗?
  3. 我想我知道#1的答案与unbind() / die()有关,而stopPropagation()preventDefault()

    的可能性很小

    更新的答案

    在iOS 4.2.1(iPod Touch)中,似乎有一些错误的阈值方法。如果向上滚动(从上到下滑动),一切正常工作,但向下滚动(从向下滑动到向上)距离pageY通常会给出错误值并触发事件。例如,如果阈值设置为30像素,并且我从手机的最底部滑动到顶部,它仍然可以触发事件。使用jQueryMobile 1.1.0 RC1和jQuery 1.7.1。

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)');
    }
});​

以下是演示:http://jsfiddle.net/RB6mp/4/