【问题标题】:enabling drag and drop on a touchscreen mobile device在触摸屏移动设备上启用拖放
【发布时间】:2010-01-09 18:06:19
【问题描述】:

我最近刚买了一部安卓手机,发现我网站上的拖放不起作用!我明白为什么它不会,但是有没有人找到解决这个问题的方法?我正在使用 JQuery 来实现 D&D...

【问题讨论】:

  • 标记正确的答案。

标签: jquery android browser mobile mobile-phones


【解决方案1】:

我使用了 jQuery UI 触摸打孔器 - 它通过修改 mousedown、mouseup 功能并将它们替换为 touchstart、touchend 等来工作。

关于: http://touchpunch.furf.com/

脚本: https://raw.github.com/furf/jquery-ui-touch-punch/master/jquery.ui.touch-punch.min.js

代码:

包括:

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

在您的标头中的 jquery UI 脚本文件之后。

【讨论】:

  • TouchPunch 救了我的命。适用于 iPad 和 Nexus 7。谢谢
  • TouchPunch 很好用,感谢您提醒我这个库。
  • 虚幻。非常感谢。可惜你没有得到答案的分数
  • 太棒了!很棒的小实用程序
  • 不是最好的解决方案:如果要拖动的元素占据整个视口,使用 jQuery UI Touch Punch 会阻止文档滚动。甚至可能是您希望仅水平拖动的元素的问题,其中容器隐藏溢出,作为可拖动的轮播。在这种情况下,轮播会阻止用户上下滚动文档。我更喜欢 jQuery Touch (github.com/ajlkn/jquery.touch),它使得可拖动可能仅在移动设备上触摸(鼠标手势可以被过滤)并且不会阻止触摸事件传播(因此,要滚动的文档)。
【解决方案2】:

我使用了上面的 touchpunch 答案,效果很好。不过,请注意。我发现使用网站上的 github 链接(及以上):

脚本:https://raw.github.com/furf/jquery-ui-touch-punch/master/jquery.ui.touch-punch.min.js

不适用于运行移动 Chrome 的 Android 设备,但该网站的原始、人类可读的源代码确实有效。这是截至本文发布之日的,当然它可能会得到修复,但同时它可能会为您节省几个调试周期。

【讨论】:

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

我知道的旧线程......

我在这里有一个解决方案,它尊重任何输入或其他必须对可拖动元素上的“点击”(例如输入)做出反应的元素。该解决方案可以在任何触摸设备(或计算机)上使用基于 mousedown、mousemove 和 mouseup 事件的任何现有拖放库。这也是一种跨浏览器的解决方案。

我已经在几台设备上进行了测试,它运行速度很快(结合 ThreeDubMedia 的拖放功能(另见 http://threedubmedia.com/code/event/drag))。它是一个 jQuery 解决方案,因此您只能将它与 jQuery 库一起使用。我使用了 jQuery 1.5.1,因为一些 较新的函数在 IE9 及更高版本中无法正常工作(未使用较新版本的 jQuery 进行测试)。

之前将任何拖放操作添加到事件您必须先调用此函数

simulateTouchEvents(<object>);

您还可以使用以下语法阻止所有组件/子组件进行输入或加速事件处理:

simulateTouchEvents(<object>, true); // ignore events on childs

这是我写的代码。我使用了一些不错的技巧来加快评估速度(参见代码)。

function simulateTouchEvents(oo,bIgnoreChilds)
{
 if( !$(oo)[0] )
  { return false; }

 if( !window.__touchTypes )
 {
   window.__touchTypes  = {touchstart:'mousedown',touchmove:'mousemove',touchend:'mouseup'};
   window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textarea':1,'select':1,'option':1};
 }

$(oo).bind('touchstart touchmove touchend', function(ev)
{
    var bSame = (ev.target == this);
    if( bIgnoreChilds && !bSame )
     { return; }

    var b = (!bSame && ev.target.__ajqmeclk), // Get if object is already tested or input type
        e = ev.originalEvent;
    if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type]  )
     { return; } //allow multi-touch gestures to work

    var oEv = ( !bSame && typeof b != 'boolean')?$(ev.target).data('events'):false,
        b = (!bSame)?(ev.target.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false;

    if( b || window.__touchInputs[ev.target.tagName] )
     { return; } //allow default clicks to work (and on inputs)

    // https://developer.mozilla.org/en/DOM/event.initMouseEvent for API
    var touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent");
    newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1,
            touch.screenX, touch.screenY,
            touch.clientX, touch.clientY, false,
            false, false, false, 0, null);

    touch.target.dispatchEvent(newEvent);
    e.preventDefault();
    ev.stopImmediatePropagation();
    ev.stopPropagation();
    ev.preventDefault();
});
 return true;
}; 

它的作用: 首先,它将单点触摸事件转换为鼠标事件。它检查事件是否由必须拖动的元素上/中的元素引起。如果它是像 input、textarea 等输入元素,它会跳过翻译,或者如果附加了标准鼠标事件,它也会跳过翻译。

结果: 可拖动元素上的每个元素仍在工作。

快乐的编码,greetz, 欧文·汉杰斯

【讨论】:

  • 谢谢Erwin,真的是一个很棒的工具,第一次尝试就可以了,无需调整!在 ELO 触摸屏电脑上测试
【解决方案4】:

iPhone 至少有一些事件,例如 ontouchstart、ontouchend 等。这些都是 webkit 的一部分,但是关于 Android 的信息比 iPhone 少得多。我认为这个问题的答案是拖放功能需要使用这些事件而不是您通常使用的事件,或者需要同时使用两者。

这篇文章可能感兴趣 - http://backtothecode.blogspot.com/2009/10/javascript-touch-and-gesture-events.html

【讨论】:

  • 链接失效
【解决方案5】:

有一个支持手机/触摸屏设备的 jQuery 拖放插件:

http://plugins.jquery.com/project/mobiledraganddrop

在移动设备上,您点按以拾取物品,然后点按以选择放置位置。这解决了拖动操作被设备/浏览器劫持的问题。

【讨论】:

  • 上述库在其演示页面上有 4 个不同的示例“可拖动”。它们都不能在我的 iPad 2 上运行,请注意。
  • @alex gray,好地方。为此,我提出了一个针对 3.0.1 的错误。
  • 仍然无法在 iPad2 上运行,并且桌面 Webkit 浏览器中存在大量视觉伪影/功能参差不齐。 cl.ly/0a3a0X3o3e462O3g2P2O
  • 我无法在 iPad2 上进行测试,因为我没有 - 它适用于 iPhone。另一件事是,因为它是开源的,如果您在 jquery.com 上提出错误,就会有人修复它。我认为 webkit 问题现在已经得到修复 - 我认为 mousedown 和 touchstart 的组合导致多个事件为同一个事件触发。
【解决方案6】:

我找到了一个适用于我的 Android 平板电脑触摸屏的示例 http://www.quirksmode.org/m/tests/drag.html 它使用“ontouchstart 事件”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 2012-08-02
    • 1970-01-01
    • 2012-02-27
    • 2016-06-25
    • 2012-11-28
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多