如何让 jQueryUI 拖放与触摸设备一起使用

Posted

技术标签:

【中文标题】如何让 jQueryUI 拖放与触摸设备一起使用【英文标题】:How to get jQueryUI drag\drop working with touch devices 【发布时间】:2012-12-06 02:22:35 【问题描述】:

在这种情况下,我希望有人回复告诉我我是个白痴。但我仍然对 jQueryUI 拖放无法在触摸设备上使用感到惊讶。我还没有测试过它们,但我在去年尝试过 iphone\ipad\android 2、3&4 并且什么都没有。刚刚在新的 Android 上尝试了最新版本。依然没有。不信,只需访问移动设备上的演示页面并尝试使用拖放示例。什么都没有。

这里是否存在技术问题或核心不兼容?一个如此简单以至于不值得写的修复? jQuery 开发人员不使用移动设备吗?我在 Stack Overflow 上到处都看到过“修复”,但它们都是“黑客”,而且我尝试过的所有方法都不起作用。

我很困惑。有人能解释一下这个问题吗?

【问题讨论】:

我认为这更多的是目标受众的问题。 jQuery UI 最初并不是为处理移动设备而编写的。它甚至不能很好地与 jQuery Mobile 配合使用。它的某些部分可能仍然在移动设备上运行良好,但任何与拖动有关的东西都会失败。 【参考方案1】:

如果您只想让当前的 jQuery UI 代码处理触摸事件,您可以使用 jQuery UI Touch Punch 猴子补丁。

唯一的“技术问题或核心不兼容”是 jQuery UI (1.x) 仅侦听鼠标事件,而不是触摸事件(有关历史原因,请参阅 @ScottGonzales 的回复)。上面的 jQuery touch punch 做出了这种改变。您甚至可以尝试该页面上的一些 jQuery UI 示例,它们都可以工作。一般来说,使用 Touch Punch 是目前公认的解决方案。

【讨论】:

Touch Punch 猴子补丁”的声音 不是最好的解决方案:如果要拖动的元素占据整个视口,使用 jQuery UI Touch Punch 会阻止文档滚动。甚至可能是您希望仅水平拖动的元素的问题,其中容器隐藏溢出,作为可拖动的轮播。在这种情况下,轮播会阻止用户上下滚动文档。我更喜欢 jQuery Touch (github.com/ajlkn/jquery.touch),它使得可拖动可能仅在移动设备上触摸(鼠标手势可以被过滤)并且不会阻止触摸事件传播(因此,要滚动的文档)。 @MaxAuray 您的评论将成为这个问题的绝佳替代答案!请注意 jquery.touch 在 2012 年不存在,当时我最初回答了这个 >_ 【参考方案2】:

jQuery UI 不支持触​​摸设备的原因由来已久,但归结为 Touch Event 是一个非标准的 WebKit 特定实现。当时,未来看起来很凄凉。苹果拥有无人愿意接近的专利;结果,Mozilla 使用从未流行的流实现了自己的触摸事件系统。目前尚不清楚微软和 Opera 会做什么。 Paul Bakaus(jQuery UI 的创建者)wanted to land iPhone support 4 years ago。我想等待官方标准。

时间过去了,Mozilla 放弃了他们的触摸事件,微软实现了他们自己的指针事件系统。 W3C 成立了一个工作组来标准化触控事件并调查 Apple 专利。触摸事件工作组已发布建议并解散。微软最终提交了一个标准化指针事件的提案,现在有一个 W3C 指针事件工作组。

我们目前正在处理所有 jQuery UI 交互的device-agnostic rewrite,它将成为 jQuery UI 2.0 的一部分。在此之前,您可以使用jQuery UI Touch Punch。

今年早些时候,我写了一些关于触控事件的历史,以及为什么指针事件提供了一个更美好的未来。您可以在jQuery blog 上了解它。

【讨论】:

不是最好的解决方案:如果要拖动的元素占据整个视口,使用 jQuery UI Touch Punch 会阻止文档滚动。甚至可能是您希望仅水平拖动的元素的问题,其中容器隐藏溢出,作为可拖动的轮播。在这种情况下,轮播会阻止用户上下滚动文档。我更喜欢 jQuery Touch (github.com/ajlkn/jquery.touch),它使得可拖动可能仅在移动设备上触摸(鼠标手势可以被过滤)并且不会阻止触摸事件传播(因此,要滚动的文档)。【参考方案3】:

查看jQTouch

这是一个 jQuery 插件,可帮助弥合桌面设备和触控设备之间的事件差距。

【讨论】:

似乎已停产,请查看 jQuery Touch (github.com/ajlkn/jquery.touch)。【参考方案4】:

使用 jQuery UI Touch Punch 似乎是最好的方法。

<script src="../jquery-ui-1.13.0/external/jquery/jquery.js"></script>
<script src="../jquery-ui-1.13.0.custom/jquery-ui.min.js"></script>
<script src="../jquery-ui-1.13.0/jquery-ui.min.js"></script>
<script src="../jquery-ui-touch-punch/jquery.ui.touch-punch.min.js"></script>

<link href="../bootstrap-5.1.1/css/bootstrap.min.css" rel="stylesheet" />

<script>
    $(function () 
        $("#sortable").sortable();
    );
</script>

<div class="container">
    <div class="row">
        <div class="col-md-12">
            <ul id="sortable" class="list-group">
                <li class="list-group-item active">Item 1</li>
                <li class="list-group-item">Item 2</li>
                <li class="list-group-item">Item 3</li>
                <li class="list-group-item">Item 4</li>
                <li class="list-group-item">Item 5</li>
                <li class="list-group-item">Item 6</li>
                <li class="list-group-item">Item 7</li>
                <li class="list-group-item">Item 8</li>
            </ul>
        </div>
    </div>
</div>

https://jsfiddle.net/igorkrupitsky/cw5n0xku/1/

【讨论】:

以上是关于如何让 jQueryUI 拖放与触摸设备一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使垫表行拖放与 cdkDragHandle 一起使用,以便只能使用句柄拖动行?

拖放与视觉指示

如何为 Bootstrap 实现支持拖放的触摸敏感、响应式、可排序列表?

拖放与物理行为

在触摸屏上拖放

nstableview 拖放与自定义单元格视图