如何以编程方式调用 jQuery UI Draggable 拖动开始?

Posted

技术标签:

【中文标题】如何以编程方式调用 jQuery UI Draggable 拖动开始?【英文标题】:How to programmatically invoke jQuery UI Draggable drag start? 【发布时间】:2012-12-02 17:19:59 【问题描述】:

我在鼠标处于向下位置之后释放之前创建了一个新的 jQuery 元素。 (鼠标按下后)。

我想使用 jQuery UI 以编程方式在新元素上触发 dragging,以便它会随着我的鼠标移动而自动开始拖动。我不想释放然后再次单击鼠标。

我已经尝试了以下...

var element = $("<div />");
element.appendTo("body").draggable().trigger("mousedown");

...但是这不起作用。

有人对如何实现这一点有任何建议吗?


更新:经过一番搜索this question 的发帖人有同样的问题。但是,建议的解决方案归结为...

$("body").on("mousedown", function(e)  
  $("<div />").draggable().appendTo("body").trigger(e);
);

...在最新版本的 jQuery 和 jQuery-UI 中不再工作,而是生成一个 Maximum Call Stack Exceeded 错误。

【问题讨论】:

找到解决方案了吗?我发现没有一个答案真的有效。我认为没有人理解这个问题。 在插入的元素上使用.trigger(e) 重新触发mousedown 事件,如***.com/q/8759884/165673 中所述,在最新的jQuery 1.9 中为我工作......你能做一个小提琴来展示Max Call 错误是如何发生的吗? @anber - 抱歉,我从来没有找到解决方案。我最终滚动了自己的可拖动来解决这个问题。 【参考方案1】:

可拖动插件希望其 mousedown 事件使用其命名空间并指向可拖动对象作为目标。在事件中修改这些字段适用于 jQuery 1.8.3 和 jQuery UI 1.9.2。

$("body").on("mousedown", function(e)  
  var div = $("<div />").draggable().appendTo("body");
  e.type = "mousedown.draggable";
  e.target = div[0];
  div.trigger(e);
);

在这里演示:http://jsfiddle.net/maCmB/1/

【讨论】:

Hrrm .. 它似乎在 chrome 36.0.1985.125 下对我有用。你用的是什么浏览器? @fuzzyBSc 感谢您提供详细信息,可以在这里使用它:***.com/questions/56571291/… 谢谢,这解决了Maximum Call Stack Exceeded错误!【参考方案2】:

更新:

见fuzzyBSc's answer below。这是正确的做法。


这完全是一个 hack,但它似乎可以解决问题:

  var myDraggable = $('#mydraggable').draggable();
  
  // Yeah... we're going to hack the widget
  var widget = myDraggable.data('ui-draggable');
  var clickEvent = null;
  
  myDraggable.click(function(event)
      if(!clickEvent)
        widget._mouseStart(event);
        clickEvent = event;
      
      else 
        widget._mouseUp(event);
        clickEvent = null;
      
    );
  
  $(document).mousemove(function(event)
    console.log(event);
    if(clickEvent)
      // We need to set this to our own clickEvent, otherwise
      // it won't position correctly.
      widget._mouseDownEvent = clickEvent;
      widget._mouseMove(event);
    
  );

Here's the plunker

我的示例使用了一个已经存在的元素而不是创建一个元素,但它应该类似地工作。

【讨论】:

不习惯plunker的朋友,这里相当于jsfiddle:jsfiddle.net/j6hzt2eb/1【参考方案3】:

在鼠标悬停时创建您的可拖动函数

$('#futureDragableElement').mouseover(function() 
  $(this).draggable();
);

由于可拖动初始化已经完成,您的第一次鼠标点击将被考虑

【讨论】:

【参考方案4】:

你必须将 mousedown 事件绑定到有问题的元素,然后你才能触发该事件。

来自http://api.jquery.com/trigger/

使用 .bind() 或其快捷方式之一附加的任何事件处理程序 当相应的事件发生时触发方法。他们可以 但是,使用 .trigger() 方法手动触发。打电话给 .trigger() 以相同的顺序执行处理程序,如果 该事件是由用户自然触发的:

$('#foo').bind('click', function() 
      alert($(this).text());
    );
    $('#foo').trigger('click');

【讨论】:

感谢您的回复 - 我相信当可拖动初始化时 mousedown 事件已经绑定。 您可能需要仔细检查并确保将可拖动对象绑定到具有特定 ID 的 div,然后您可以将其与触发器一起使用。【参考方案5】:

如果您在活动期间创建元素并且该元素不太复杂,则不需要黑客攻击。您可以简单地将draggable 设置为mousedown 发生的元素,并使用draggable helper 属性来创建一个将成为您的新元素的助手。在 dragStop 上,将助手克隆到 dom 中您想要的位置。

$('body').draggable(
  helper: function() 
    return '<div>your newly created element being dragged</div>';
  ,
  stop: function (e,ui) 
    ui.helper.clone().appendTo('body');
  
);

当然,你需要为助手设置位置,所以鼠标在它上面。这只是一个非常基本的例子。

【讨论】:

以上是关于如何以编程方式调用 jQuery UI Draggable 拖动开始?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式加载时无法从类函数内部访问 jQuery UI

如何在焦点()上以编程方式隐藏jquery mobile中的键盘

在 jQuery UI 对话框中以编程方式创建的 iframe 的大小

如何在d3中以编程方式调用“click”事件?

jQuery 数据表。如何以编程方式更改当前页面?

如何检查 JQuery UI 工具提示?