我正在寻找一个适用于触摸设备的拖放插件。
我希望它具有类似于jQuery UI插件的功能,可以允许元素被“放置”在特定区域。
jqtouch插件支持拖动,但不支持放置。
这里有一个仅支持iPhone/iPad的拖放插件。
谁能指导我一个适用于安卓/苹果iOS的拖放插件?
...或者可能可以更新jqtouch插件以实现放置功能,因为它已经可以在Andriod和IOS上运行。
谢谢!
我正在寻找一个适用于触摸设备的拖放插件。
我希望它具有类似于jQuery UI插件的功能,可以允许元素被“放置”在特定区域。
jqtouch插件支持拖动,但不支持放置。
这里有一个仅支持iPhone/iPad的拖放插件。
谁能指导我一个适用于安卓/苹果iOS的拖放插件?
...或者可能可以更新jqtouch插件以实现放置功能,因为它已经可以在Andriod和IOS上运行。
谢谢!
您可以使用Jquery UI进行拖放操作,并使用将鼠标事件转换为触摸事件的附加库,这正是您所需要的。我推荐的库是https://github.com/furf/jquery-ui-touch-punch。使用它,您的Jquery UI拖放应该可以在触摸设备上正常工作。
或者,您可以使用以下代码,我也在使用它,它会将鼠标事件转换为触摸事件,像魔术一样工作。
function touchHandler(event) {
var touch = event.changedTouches[0];
var simulatedEvent = document.createEvent("MouseEvent");
simulatedEvent.initMouseEvent({
touchstart: "mousedown",
touchmove: "mousemove",
touchend: "mouseup"
}[event.type], true, true, window, 1,
touch.screenX, touch.screenY,
touch.clientX, touch.clientY, false,
false, false, false, 0, null);
touch.target.dispatchEvent(simulatedEvent);
event.preventDefault();
}
function init() {
document.addEventListener("touchstart", touchHandler, true);
document.addEventListener("touchmove", touchHandler, true);
document.addEventListener("touchend", touchHandler, true);
document.addEventListener("touchcancel", touchHandler, true);
}
在document.ready中调用init()函数即可。document.getElementById('draggableContainer').addEventListener(...
- chiliNUT对于任何想要使用这个并保留“点击”功能(正如John Landheer在他的评论中提到的那样)的人,您只需进行一些修改即可实现:
添加一些全局变量:
var clickms = 100;
var lastTouchDown = -1;
然后将原始的switch语句修改为以下内容:
var d = new Date();
switch(event.type)
{
case "touchstart": type = "mousedown"; lastTouchDown = d.getTime(); break;
case "touchmove": type="mousemove"; lastTouchDown = -1; break;
case "touchend": if(lastTouchDown > -1 && (d.getTime() - lastTouchDown) < clickms){lastTouchDown = -1; type="click"; break;} type="mouseup"; break;
default: return;
}
您可能希望根据自己的喜好调整 'clickms'。基本上,它只是监视 'touchstart' 紧接着 'touchend',以模拟点击。
谢谢以上的代码!-我尝试了几个选项,这是正确的选择。我遇到了一个问题,就是preventDefault会阻止iPad上的滚动-我现在正在测试可拖动项目,目前效果非常好。
if (event.target.id == 'draggable_item' ) {
event.preventDefault();
}
我和gregpress的答案是一样的解决方案,但我的可拖动元素使用的是类而不是id。看起来它能够工作。
var $target = $(event.target);
if( $target.hasClass('draggable') ) {
event.preventDefault();
}
虽然这是一个旧帖子,但是......
@ryuutatsuo的答案存在问题,它会阻止任何需要“点击”(例如输入框)或与之互动的元素,所以我写了这个解决方案。这个解决方案使得在任何触摸设备(或计算机)上使用基于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等输入元素,它就会跳过翻译;或者如果它附加了标准的鼠标事件,它也会跳过翻译。
结果: 可拖动元素上的每个元素仍然可以正常工作。
愉快的编码,问候, Erwin Haantjes
simulateTouchEvents(<object>, true);
中我应该传递哪个对象? - Valay