【问题标题】:How can I make a jQuery UI 'draggable()' div draggable for touchscreen?如何使 jQuery UI 'draggable()' div 可拖动以用于触摸屏?
【发布时间】:2011-03-02 21:34:34
【问题描述】:

我有一个在 Firefox 和 Chrome 中工作的 jQuery UI draggable()。用户界面的概念基本上是点击创建一个“便利贴”类型的项目。

基本上,我单击或点击侦听单击的div#everything(100% 高和宽),然后显示输入文本区域。您添加文本,然后在完成后保存它。您可以拖动此元素。这适用于普通浏览器,但在我可以测试的 iPad 上,我无法拖动项目。如果我触摸选择(然后它会稍微变暗),我不能再拖动它。它根本不会向左或向右拖动。我可以向上或向下拖动,但我不是拖动单个div,而是拖动整个网页。

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

$('#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,这是整个 html 正文:

<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 上做错的事情,或者是否有更好的框架来做跨平台/向后兼容的 draggable()适用于触摸屏 UI 的元素。

更多关于如何编写这样的 UI 组件的通用 cmets 也将受到欢迎。

谢谢!


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

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

jQuery Touch plugin 成功了!

【问题讨论】:

  • 我很好奇:你能用两根手指或三根手指拖动 div 吗?我知道您有时必须使用多个手指来滚动移动 Safari 中的嵌入内容,因此“可拖动”内容可能是相同的。
  • 沃尔特·蒙德谢谢!我还没有尝试过任何手指的变化,等我拿到手再试试!
  • 两个或三个手指实际上阻止了“整个页面”的无意滚动,但对可拖动没有任何改变。
  • 不幸的是,这种技术似乎对我不起作用。 :(
  • @blaster 您需要查看其他一些答案以了解其他可能的解决方案

标签: jquery jquery-ui ipad draggable touchscreen


【解决方案1】:

在浪费了很多时间之后,我遇到了这个!

jquery-ui-touch-punch

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

我可以在 iPad 和 iPhone 上使用它

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

【讨论】:

  • 这个解决方案效果很好,我厌倦的另一个答案是错误的,真的没有帮助
  • 一个小提示:效果很好,尽管如果可拖动元素覆盖有图层(如其上方带有蒙版的图像),则不会激活拖动,但解决方案将是添加指针事件:无;在顶层。
  • 这是一个伟大而简单的解决方案,您只需使用插件并继续使用 JQuery 可拖动功能。完美,谢谢!
  • 这将阻止可拖动项目中的可点击项目。
【解决方案2】:

警告:此答案写于 2010 年,技术发展迅速。如需更新的解决方案,请参阅@ctrl-alt-dileep's answer below


根据您的需要,您不妨试试jQuery touch plugin;你可以尝试一个例子here。在我的 iPhone 上拖动效果很好,而 jQuery UI Draggable 则不行。

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

附带说明:信不信由你,我们听到越来越多的关于 iPad 和 iPhone 等触控设备如何对使用 :hover/onmouseover 功能和可拖动内容的网站造成问题的讨论。

如果您对此的底层解决方案感兴趣,那就是使用三个新的 JavaScript 事件; ontouchstart、ontouchmove 和 ontouchend。苹果实际上已经写了一篇关于它们使用的文章,你可以找到here。可以在here 找到一个简化的示例。我链接的两个插件都使用了这些事件。

【讨论】:

  • 超级棒!我所要做的就是将.touch({ animate: false, sticky: false, dragx: true, dragy: true, rotate: false, resort: true, scale: false }); 链接到我现有的draggable() 电话上,这很有效!我仍然需要解决我想要处理的所有事件才能使工作流程正确,但是 jQuery touch 插件成功了!
  • jquery.com 上似乎不再提供该插件。你仍然可以在这里找到 javascript manifestinteractive.com/iphone/touch/js/jquery.touch.js
  • 嘿,现在 manifestinteractive.com 中也缺少该插件。试试这个:plugins.jquery.com/files/jquery.touch.js.txt
  • 这个答案不再有效。请参阅下面的@ctrl-alt-dileep 答案(jquery-ui-touch-punch)以获取 2012 年的答案
  • @bjelli 感谢您指出这一点。我已经用警告更新了我的答案。 :)
【解决方案3】:

这个项目应该很有帮助 - 将触摸事件映射到单击事件,使 jQuery UI 无需任何更改即可在 iPad 和 iPhone 上工作。只需将 JS 添加到任何现有项目中即可。

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

【讨论】:

    【解决方案4】:

    jQuery ui 1.9 将为您解决这个问题。下面是 pre 的演示:

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

    只需将 jquery.mouse.ui.js 取出,将其粘贴在您正在加载的 jQuery ui 文件下,这就是您应该做的所有事情!也适用于可排序的。

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

    Jquery-ui sortable doesn't work on touch devices based on Android or IOS

    【讨论】:

    • 这很好,他们正在处理这个 1.9。 FWIW,我发现该演示中的代码版本虽然存在错误,但效果不佳。有人在这个问题上发布了更正确的版本:stackoverflow.com/questions/6745098/… 这对我来说效果更好。
    • 我更新了我的答案来解决这个问题。在我的用例中,我还没有收到任何错误。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      我昨天也遇到了类似的问题。我已经有了一个使用 jQuery UI 的可拖动和 jQuery Touch Punch 的“工作”解决方案,其他答案中提到了这些解决方案。但是,使用这种方法会在一些 Android 设备中对我造成奇怪的错误,因此我决定编写一个小的 jQuery 插件,它可以通过使用触摸事件而不是使用模拟假鼠标事件的方法来使 HTML 元素可拖动。

      其结果是jQuery Draggable Touch,这是一个简单的 jQuery 插件,用于使元素可拖动,通过使用触摸事件(如 touchstart、touchmove、touchend 等)将触摸设备作为主要目标。如果浏览器/设备不支持触摸事件,它仍然有一个使用鼠标事件的后备。

      【讨论】:

      • 嗨,Heyman,做得很好。谢谢分享。它也适用于可调整大小的 jQuery 吗?
      【解决方案7】:

      您可以尝试使用 jquery.pep.js

      jquery.pep.js 是一个轻量级的 jQuery 插件,可以转换任何 DOM 元素到一个可拖动的对象。它适用于几乎所有浏览器, 从旧到新,从触摸到点击。我建造它是为了满足 哪个 jQuery UI 的 draggable 不满足,因为它不起作用 在触摸设备上(没有一些骇客)。

      Website, GitHub link

      【讨论】:

      • 谢谢@martynas,我去看看!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多