【问题标题】:Combining jQuery Mobile taphold and jQuery UI draggable结合 jQuery Mobile taphold 和 jQuery UI draggable
【发布时间】:2012-03-23 17:55:35
【问题描述】:

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

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

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

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

// 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');
}); 

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

知道如何解决这个问题吗?

【问题讨论】:

  • 您的代码在 jQuery Mobile 1.4.4+ 上运行良好,不需要下面建议的解决方法。

标签: jquery-ui jquery-mobile jquery-ui-draggable long-press


【解决方案1】:

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

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

接下来我会说 touchstart 事件没有通过,因为在 jquery mobile 中实现了 taphold。

只有当它得到一个 touchstart/mousedown 事件时才会启动可拖动对象。

我以前见过类似的东西,但是双击和拖动。

您可能需要在点击事件处理程序中手动触发 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);
});

【讨论】:

【解决方案2】:

虽然有点晚了 - 我通过跳过 taphold 插件并改用它来实现它。 记得加Touch Punch

$('#whatever').on('touchstart', function (event) {
    var me = this;

    if (!me.touching) {
        if (me.touched) { clearTimeout(me.touched); };
        me.touched = setTimeout(function () {
            //console.log('taphold');

            //Prevent context menu on mobile (IOS/ANDROID)
            event.preventDefault();

            //Enable draggable
            $this.draggable('enable');

            //Set internal flag
            me.touching = true;

            //Add optional styling for user
            $(me).addClass('is-marked');

            //trigger touchstart again to enable draggable through touch punch
            $(me).trigger(event);

            //Choose preferred duration for taphold
        }, 500);
    }
}).on('touchend', function () {
    //console.log('touchend');
    this.touching = false;

    //Disable draggable to enable default behaviour
    $(this).draggable('disable');

    //Remove optional styling
    $(this).removeClass('is-marked');

    clearTimeout(this.touched);
}).on('touchmove', function () {
    //console.log('touchmove');

    clearTimeout(this.touched);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2012-07-05
    • 2011-12-28
    相关资源
    最近更新 更多