滚动浏览触摸设备上的jQuery UI拖放物触发拖动



我正在使用jQuery UI的拖放功能。为了使其在触摸设备上工作,我正在使用jQuery UI触摸punch。

我有一个拖曳物列表,它们周围没有太多空间。在触摸设备上,我发现滚动列表的唯一方法是使用拖放周围非常狭窄的空间,而拖放物不友好。我考虑过添加按钮上下滚动的按钮,但是我认为这可能会使习惯滚动滚动的用户感到陌生和笨拙。我最终遇到了一种骇人听闻的解决方法,但这有两个问题:

  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());
    }
});

不幸的是,我认为最好的答案是重新考虑您的UI。强迫用户滚动浏览可拖动的元素只是出现问题。起初,我认为使用jQuery的tabhold事件会延迟draggable事件,但他们不想一起玩。

最新更新