结合jQuery Mobile taphold和jQuery UI draggable

Tho*_*mas 6 jquery-ui jquery-mobile jquery-ui-draggable long-press

我正在开发一个移动应用程序,我正在尝试将jQuery UI的可拖动功能与jQuery Mobile的taphold事件相结合.这个想法是当执行taphold时元素变得可拖动.

Draggable正在以下代码中的元素上初始化:

$('div.rect', '#outerBox').draggable({
    containment: "parent", 
    grid: [50, 50],
    disabled: true,
    stop: function(event, ui) {
        $(this).draggable('disable');
        $(this).removeClass('highlighted');
    }
}); 
Run Code Online (Sandbox Code Playgroud)

如您所见,最初禁用了可拖动功能,因为我想在taphold事件后启用它.为实现这一点,我目前正在使用以下代码:

// Bind long press event to rectangle elements
$('div.rect', '#outerBox').bind('taphold', function(event, ui) {
    // Enable dragging on long press
    $(this).addClass('highlighted');
    $(this).draggable('enable');
}); 
Run Code Online (Sandbox Code Playgroud)

这是有效的,但问题是需要'释放并再次点击'事件才能拖动元素,而不是在taphold事件之后直接拖动.这可能是某种事件干扰问题吗?我尝试了类似的东西,event.preventDefault()但我对jQuery事件的了解并不多,所以我不知道这是否应该有所不同.

关于如何解决这个问题的任何想法?

asg*_*eo1 2

首先,jquery ui Draggable 不适用于触摸事件。我假设您已经进行了必要的调整来解决此问题。

即看到Jquery-ui sortable 不适用于基于 Android 或 IOS 的触摸设备

接下来我想说的是,由于 jquery mobile 中 Taphold 的实现方式,touchstart 事件没有流过。

仅当收到 touchstart/mousedown 事件时,draggable 才会启动。

我以前见过类似的东西,但是双击与可拖动结合使用。

您可能需要在 taphold 事件处理程序中手动触发 touchstart 事件,以便可拖动项启动:

$('div.rect', '#outerBox').bind('taphold', function(event, ui) {
    var offset = $(this).offset();
    var type   = $.mobile.touchEnabled ? 'touchstart' : 'mousedown';
    var newevent = $.Event(type);
    newevent.which  = 1;
    newevent.target = this;
    newevent.pageX  = event.pageX ? event.pageX : offset.left;
    newevent.pageY  = event.pageY ? event.pageX : offset.top;

    $(this).trigger(newevent);
});
Run Code Online (Sandbox Code Playgroud)