将单击与 JQuery 中的可拖动功能分开

Posted

技术标签:

【中文标题】将单击与 JQuery 中的可拖动功能分开【英文标题】:Separating click from draggable functionality in JQuery 【发布时间】:2015-04-05 16:17:37 【问题描述】:

如果点击事件功能与拖动事件功能都附加到同一个对象,有没有办法将它们分开?

我正在添加一个点击类。我的应用程序的目标是,当用户“点击”和项目时,它的可拖动功能被禁用。

相反,如果用户拖动项目,则不应触发点击。

这可能吗?

这是我对以下代码的小提琴...

jsFiddle

html:

<div class="buttonBox"></div>

jQuery:

var bool = false;
var buttonBox = $(".buttonBox");

buttonBox.off("click");
buttonBox.on("click", function (event, ui) 
    console.log("class Added");
    $bool = true;
    var self = $(this);
    self.addClass("selectedBox");
);

buttonBox.draggable(
    distance: 40,
    disabled: bool,
    revert: "invalid",
    revertDuration: 400,
    refreshPositions: true,

);

【问题讨论】:

你可以试试 .on() 和 .off() api.jquery.com/off 重复:***.com/questions/1771627/… 在您发布的代码中buttonBox.off("click"); 没有任何意义 我们正在查看来自更大应用程序的示例。我已经读到您应该将前面的 .off() 与您的 .on() 配对,以便在添加新的点击事件之前删除您之前的点击事件。 【参考方案1】:

您可以使用可拖动元素的start 事件来设置您的逻辑:

buttonBox.on("click", function (event, ui) 
    if($(this).hasClass('dragging')) 
        $(this).removeClass('dragging');
        return;
    
    console.log("class Added");
    $bool = true;
    var self = $(this);
    self.addClass("selectedBox");
);

buttonBox.draggable(
    start: function()
        if($(this).hasClass('selectedBox')) return false;
        $(this).addClass('dragging');
    ,
    distance: 40,
    disabled: bool,
    revert: "invalid",
    revertDuration: 400,
    refreshPositions: true,

);

-jsFiddle-

【讨论】:

所以我可以摆脱 bool 变量? @DanBeaulieu 是的,这里没有使用【参考方案2】:

您可以在点击事件开始时稍等片刻,然后仅在该元素未被拖动时触发点击事件功能。

buttonBox.on("click", function (event, ui) 
    setTimeout(function (ev, ui) 
        if($(ev.target).hasClass("ui-draggable-dragging"))
            return;
        console.log("class Added");
        $(ev.target).addClass("selectedBox");
    , 50, event, ui);
);

小提琴:http://jsfiddle.net/doqpbuvy/3/

【讨论】:

这也是一个很好的解决方案。我将研究这两个,看看它们在我的项目中的作用。无论哪种方式,我都会投票支持你花时间解决这个问题。谢谢奥赞。

以上是关于将单击与 JQuery 中的可拖动功能分开的主要内容,如果未能解决你的问题,请参考以下文章

从jQuery的可拖动STOP停止事件传播的onclick

jQuery UI - overflow-y:scroll 容器中的可拖动项目

Angular JQuery UI 元素的可拖动副本

没有 jQuery UI(或根本没有 jQuery?)的可排序/可拖动列表项

使用 UIPanGestureRecognizer 的可拖动视图中的操作元素导致视图移动

使用 Laravel 4+ 从 jQuery/ajax 保存序列化的可排序数据