我最近刚入手了一部安卓手机,发现我的网站上的拖放功能无法使用!我知道为什么它不能工作,但有没有人找到解决办法?我正在使用jQuery来实现拖放...
我最近刚入手了一部安卓手机,发现我的网站上的拖放功能无法使用!我知道为什么它不能工作,但有没有人找到解决办法?我正在使用jQuery来实现拖放...
我使用了jQuery UI Touch Punch插件-它通过修改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脚本文件之后。
虽然这是一篇老帖子,但我有一个解决方案,它可以在可拖动元素上响应任何输入或其他元素的“点击”(例如输入)。这个解决方案使得可以在任何触摸设备(或计算机)上使用基于mousedown、mousemove和mouseup事件的任何现有拖放库。这也是一个跨浏览器的解决方案。
我已经在几个设备上测试过,它运行速度很快(与ThreeDubMedia的拖放功能结合使用,详情请参见http://threedubmedia.com/code/event/drag)。这是一个jQuery解决方案,所以你只能用jQuery libs。我用的是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等输入元素,则跳过翻译;或者如果一个标准的鼠标事件附加到它上面,它也会跳过翻译。
结果: 可拖动元素上的每个元素仍然可以正常工作。
愉快的编码,问候, Erwin Haantjes
iPhone至少有一些事件,如ontouchstart、ontouchend等。这些是Webkit的一部分,但是关于Android的信息比iPhone要少得多。我认为这个问题的答案是拖放功能需要使用那些事件而不是你通常使用的事件,或者需要同时使用两者。
这篇文章可能会引起您的兴趣 - http://backtothecode.blogspot.com/2009/10/javascript-touch-and-gesture-events.html
有一个jQuery拖放插件,支持移动设备/触摸屏设备:
在移动设备上,您可以轻触以拾取物品并轻触以选择放置位置。这样可以避免拖动操作被设备/浏览器劫持的问题。我找到了一个在我的Android平板电脑触摸屏上工作的示例http://www.quirksmode.org/m/tests/drag.html,它使用了"ontouchstart事件"