在触摸屏移动设备上实现拖放

时间:2010-01-09 18:06:20

标签: jquery android browser mobile mobile-phones

我刚刚拿到一部Android手机,发现我网站上的拖放不起作用!我理解为什么它不会,但有没有人找到解决方案?我正在使用JQuery来实现D& d ...

6 个答案:

答案 0 :(得分:32)

我使用了jQuery UI touch punch - 它通过破解mousedown,mouseup功能并用touchstart,touchend等替换它们。

ABOUT: http://touchpunch.furf.com/

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

CODE:

包括:

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

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

答案 1 :(得分:3)

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

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

对于运行移动Chrome的Android设备不起作用,但来自网站的原始人类可读来源有效。这是截至发布之日,当然可能会得到修复,但同时可能会为您节省几个调试周期。

答案 2 :(得分:2)

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

我这里有一个解决方案,它尊重任何输入或其他元素,它们必须对可拖动元素上的“点击”(例如输入)作出反应。该解决方案使得可以在任何触摸设备(或cumputer)上使用基于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 Haantjes

答案 3 :(得分:1)

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

这篇文章可能很有意思 - http://backtothecode.blogspot.com/2009/10/javascript-touch-and-gesture-events.html

答案 4 :(得分:0)

有一个jQuery拖放插件,支持移动设备/触摸屏设备:

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

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

答案 5 :(得分:0)

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

相关问题