我怎样才能使 jQueryUI‘ dragable()’div 对于触摸屏来说是可拖动的呢?

我有一个 jQuery UI draggable(),可以在 Firefox 和 Chrome 中使用。用户界面的概念基本上是点击创建一个“发表它”类型的项目。

Basically, I click or tap on div#everything (100% high and wide) that listens for clicks, and an input textarea displays. You add text, and then when you're done it saves it. You can drag this element around. That is working on normal browsers, but on an iPad I can test with I can't drag the items around. If I touch to select (it then dims slightly), I can't then drag it. It won't drag left or right at all. I 可以 drag up or down, but I'm not dragging the individual div, I'm dragging the whole webpage.

下面是我用来捕捉点击的代码:

$('#everything').bind('click', function(e){
var elem = document.createElement('DIV');
STATE.top = e.pageY;
STATE.left = e.pageX;
var e = $(elem).css({
top: STATE.top,
left: STATE.left
}).html('<textarea></textarea>')
.addClass('instance')
.bind('click', function(event){
return false;
});
$(this).append(e);
});

下面是我用来“保存”音符并将输入 div 转换为显示 div 的代码:

$('textarea').live('mouseleave', function(){
var val = jQuery.trim($(this).val());
STATE.content = val;
if (val == '') {
$(this).parent().remove();
} else {
var div  = $(this).parent();
div.text(val).css({
height: '30px'
});
STATE.height = 30;
if ( div.width() !== div[0].clientWidth || div.height () !== div[0].clientHeight ) {
while (div.width() !== div[0].clientWidth || div.height () !== div[0].clientHeight) {
var h = div.height() + 10;
STATE.height = h;
div.css({
height: (h) + 'px'
});     // element just got scrollbars
}
}
STATE.guid = uniqueID()
div.addClass('savedNote').attr('id', STATE.guid).draggable({
stop: function() {
var offset = $(this).offset();
STATE.guid = $(this).attr('id');
STATE.top = offset.top;
STATE.left = offset.left;
STATE.content = $(this).text();
STATE.height = $(this).height();
STATE.save();
}
});
STATE.save();
$(this).remove();
}
});

当我加载保存的笔记时,我有这样的代码:

$('.savedNote').draggable({
stop: function() {
STATE.guid = $(this).attr('id');
var offset = $(this).offset();
STATE.top = offset.top;
STATE.left = offset.left;
STATE.content = $(this).text();
STATE.height = $(this).height();
STATE.save();
}
});

我的 STATE对象处理笔记的保存。

Onload, this is the whole html body:

<body>
<div id="everything"></div>
<div class="instance savedNote" id="iddd1b0969-c634-8876-75a9-b274ff87186b" style="top:134px;left:715px;height:30px;">Whatever dude</div>
<div class="instance savedNote" id="id8a129f06-7d0c-3cb3-9212-0f38a8445700" style="top:131px;left:347px;height:30px;">Appointment 11:45am</div>
<div class="instance savedNote" id="ide92e3d13-afe8-79d7-bc03-818d4c7a471f" style="top:144px;left:65px;height:80px;">What do you think of a board where you can add writing as much as possible?</div>
<div class="instance savedNote" id="idef7fe420-4c19-cfec-36b6-272f1e9b5df5" style="top:301px;left:534px;height:30px;">This was submitted</div>
<div class="instance savedNote" id="id93b3b56f-5e23-1bd1-ddc1-9be41f1efb44" style="top:390px;left:217px;height:30px;">Hello world from iPad.</div>


</body>

所以,我真正的问题是: 我怎样才能在 iPad 上做得更好?

我没有设置 jQuery UI,我想知道这是否是我在 jQuery UI 或 jQuery 上做错的地方,或者是否有更好的框架来做跨平台/向后兼容的 dragable ()元素,这些元素可以用于触摸屏 UI。

我们也欢迎更多关于如何编写这样的 UI 组件的一般性评论。

谢谢!


更新: 我能够简单地链接到我的 jQuery UI draggable()调用,并得到正确的 iPad 拖动性!

.touch({
animate: false,
sticky: false,
dragx: true,
dragy: true,
rotate: false,
resort: true,
scale: false
});

The JQuery Touch 插件 did the trick!

104569 次浏览

警告: 这个答案写于2010年,技术发展迅速。


根据您的需要,您可能希望尝试 JQuery 触摸插件; 您可以尝试示例 给你。它可以在我的 iPhone 上拖动,而 jQuery UI Dragable 则不行。

或者,您可以尝试使用 这个插件,尽管这可能需要您实际编写自己的可拖动函数。

作为一个旁注: 信不信由你,我们听到越来越多的关于触摸设备,如 iPad 和 iPhone 是如何导致问题的网站使用: 悬停/onmouseover 功能和拖动内容。

如果您对这个问题的底层解决方案感兴趣,那么可以使用三个新的 JavaScript 事件: ontouch start、 ontouch move 和 ontouch end。苹果实际上已经写了一篇关于它们的使用的文章,你可以找到 给你。一个简化的例子可以找到 给你。这些事件在我链接到的两个插件中都有使用。

这个项目应该是有帮助的-地图触摸事件点击事件的方式,允许 jQuery UI 工作在 iPad 和 iPhone 没有任何改变。只需将 JS 添加到任何现有项目中。

Http://code.google.com/p/jquery-ui-for-ipad-and-iphone/

JQuery ui 1.9将为您解决这个问题:

Https://dl.dropbox.com/u/3872624/lab/touch/index.html

只要把 jQuery.mouse.ui.js 取出来,放在正在加载的 jQuery ui 文件下面,就可以了!也可以用来分类。

这段代码对我来说非常好用,但是如果您遇到了错误,可以在这里找到 jquery.mouse.ui.js 的更新版本:

Jquery-ui 排序不能在基于 Android 或 IOS 的触摸设备上工作

在浪费了许多小时之后,我发现了这个!

Jquery-ui-touch-unch

它将点击事件转换为点击事件。 记住在 jquery 之后加载脚本。

我在 iPad 和 iPhone 上做了这个

$('#movable').draggable({containment: "parent"});

这个在 github 上的项目可能是你的解决方案

Https://github.com/furf/jquery-ui-touch-punch

I was struggling with a similar problem yesterday. I already had a "working" solution using jQuery UI's draggable together with jQuery Touch Punch, which are mentioned in other answers. However, using this method was causing weird bugs in some Android devices for me, and therefore I decided to write a small jQuery plugin that can make HTML elements draggable by using touch events instead of using a method that emulates fake mouse events.

这样做的结果是 拖动触摸,它是一个简单的 jQuery 插件,用于使元素可拖动,通过使用触摸事件(如 touch start、 touch move、 touch end 等) ,触摸设备成为它的主要目标。如果浏览器/设备不支持触摸事件,它仍然可以使用鼠标事件。

你可以尝试使用 Jquery.pep.js:

jquery.pep.js is a lightweight jQuery plugin which turns any DOM 它可以在大多数浏览器中工作, 从旧到新,从触摸到点击。我建造它是为了满足 JQueryUI 的拖拽式界面无法实现这一点,因为它无法工作 在触摸设备上(没有一些黑客技术)。

Website, GitHub link