在触摸设备上浏览jQuery UI Draggables会触发拖动。

5

我正在使用jQuery UI的draggables和 droppables功能。为了使其在触摸设备上起作用,我正在使用jQuery UI Touch Punch。

我有一系列没有太多空间的可拖动元素。在触摸设备上,我发现浏览列表的唯一方法是使用拖动元素周围很窄的空间,这不太用户友好。我考虑添加向上和向下滚动的按钮,但我认为对于习惯于通过轻扫来滚动的用户来说,这可能感觉陌生和笨重。最终,我采取了一种hacky的解决方法,但它有两个问题:

  1. 在滑动开始滚动之前需要花费一些时间,这可能会给人们留下网站滞后的错误印象。

  2. 没有动力学的滚动效果,所以滚动起来比平常更费劲。

我的问题

是否可以改进我的代码以解决以上两个问题,或者我应该采取完全不同的方法来解决这个问题?

代码

jsFiddle演示jsFiddle演示全屏结果

HTML

<p>Drag the colored squares into the gray area on the right.</p>

<ul>
    <li><span class="red"></span></li>
    <li><span class="orange"></span></li>
    <li><span class="yellow"></span></li>
    <li><span class="green"></span></li>
    <li><span class="blue"></span></li>
    <li><span class="purple"></span></li>
    <li><span class="red"></span></li>
    <li><span class="orange"></span></li>
    <li><span class="yellow"></span></li>
    <li><span class="green"></span></li>
    <li><span class="blue"></span></li>
    <li><span class="purple"></span></li>
    <li><span class="red"></span></li>
    <li><span class="orange"></span></li>
    <li><span class="yellow"></span></li>
    <li><span class="green"></span></li>
    <li><span class="blue"></span></li>
    <li><span class="purple"></span></li>
    <li><span class="red"></span></li>
    <li><span class="orange"></span></li>
    <li><span class="yellow"></span></li>
    <li><span class="green"></span></li>
    <li><span class="blue"></span></li>
    <li><span class="purple"></span></li>
</ul>

<div></div>

CSS

p {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    margin-bottom: 10px;
}

ul, div {
    float: left;
    height: 440px;
    background-color: #ccc;
    border: 1px solid #000;
}

ul {
    width: 127px;
    overflow-y: scroll;
    list-style: none;
}

li span {
    margin: 9px auto;
}

span {
    display: block;
    width: 100px;
    height: 100px;
    border: 5px solid #000;
}

.red {
    background-color: #f00;
}

.orange {
    background-color: #ff8000;
}

.yellow {
    background-color: #ff0;
}

.green {
    background-color: #0f0;
}

.blue {
    background-color: #00f;
}

.purple {
    background-color: #f0f;
}

div {
    width: 330px;
    margin-left: 20px;
}

div span {
    float: left;
}

JavaScript

// BEGIN: My attempt to fix the scrolling issue on touch devices

if ('ontouchstart' in document.documentElement) {
    $('span').on('dragstart', function(e) {
        if ($(this).hasClass('scroll')) {
            e.preventDefault();
        }
    }).on('mousemove', function(e) {
        if ($(this).hasClass('scroll')) {
            $('ul').scrollTop(scroll_top_on_mousedown + mousedown_coords.pageY - e.pageY);
            return false;
        }

        if (typeof(mousedown_coords) == 'object' && Math.max(
                Math.abs(mousedown_coords.pageX - e.pageX),
                Math.abs(mousedown_coords.pageY - e.pageY)
            ) >= 80
        ) {
            if (e.pageX - mousedown_coords.pageX < 70) {
                $(this).addClass('scroll');
            }
        }
    }).on('mousedown', function(e) {
        mousedown_coords = {
            'pageX': e.pageX,
            'pageY': e.pageY,
        };

        scroll_top_on_mousedown = $('ul').scrollTop();
    }).on('touchend', function() {
        $(this).trigger('mouseup'); // Android fix

        delete window.mousedown_coords;
        $('ul .scroll').removeClass('scroll');
    });
}

// END: My attempt to fix the scrolling issue on touch devices

$('span').draggable({
    distance: 90,
    helper: 'clone',
    containment: $('div')
});

$('div').droppable({
    drop: function(event, ui) {
        if ($(this).children('span').length == 12) {
            $(this).empty();
        }

        $(this).append($(ui.draggable).clone());
    }
});

1
你尝试在可拖动函数中添加**延迟选项**了吗?如果你设置一个500毫秒的延迟,也许足以让用户滚动页面而不触发可拖动函数? - Cholesterol
@Cholesterol 如果我删除所有伪造滚动的代码,然后添加“delay”选项,我就回到了之前的状态(只能在手指放在彩色正方形外的灰色区域的情况下滚动),当然,不同之处在于现在拖动彩色正方形之前会有延迟。不过还是谢谢你的建议。 - Nick
1个回答

3

不幸的是,我认为最好的答案是重新考虑您的用户界面。强制用户在可拖动元素上滚动只会带来问题。起初,我认为使用jQuery的tabhold事件可以延迟draggable事件,但它们不想一起使用。


我最终得出了相同的结论,因此我使触摸设备上的用户必须在项目上轻触才能将其拖动。我添加了一个可视提示,表明它是可拖动的,以便用户明显地看到。当用户将其拖动到其他位置时,或者如果他们改变主意并再次轻触相同的项目或轻触其他项目,则它将再次变为不可拖动。 - Nick
请您能否与我们分享您做了什么?我也遇到了类似的问题:( - GETah
@GETah 你之前的评论有哪一部分让你卡住了吗? - Nick
@Nick 谢谢你的快速回复。我正在考虑实现与你相同的功能,但在移动设备上,你需要先轻触才能拖放物品。 - GETah
如果你开始有困难,我建议你在 Stack Overflow 上发布一个问题。我可能能够提供帮助,如果我不能,其他人肯定会的。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接