2014-04-08 55 views
0

我有一个可拖拽的需要在开始而不是初始化时设置它的遏制集。开始时的JQuery UI Draggable遏制

编辑 的原因是,可拖动是组件的一部分,该组件可以在多个地方存在,所以我需要检查(启动),其中在DOM它的存在,并设置基础上,适当控制它的位置。

例如,如果拖动存在于A元素,设置围堵元素A.如果例如在B元素存在,将其设置为元素B.

为了进一步澄清,我不是在寻找的直接父是容器(因为我相信这可以通过将“父”传递给控件来处理),而是一个任意的父项,因此我需要在开始拖动时执行此逻辑。

I've tried the obvious (jsfiddle)

$('#dragMe').draggable({ 
    start: function (event, ui) { 
     $(this).draggable('option', "containment", '#container'); 
    }, 
}); 

这工作,但只有你拖着元素后两次。所以,举个例子,如果你拿起红色方块并将其拖出遏制区,它会让你。但是,如果将其放入容器中,然后再次拖动它,它将被正确包含。 (注意,我使用的是Chrome)

这使我相信在启动函数被调用之前检查遏制。

有没有什么办法可以让JQuery UI识别更改后的选项,还是我需要手动约束边界内的可拖动?

+4

我不明白你为什么不只是在做'$('#dragMe')。draggable({containment:'#container'});'。 http://jsfiddle.net/j08691/9X7Hd/1/ – j08691

+0

@ j08691我刚要回答这个问题。你应该把它作为答案。 –

+0

@SpencerMay - 如果我们错过了某些东西,我会给Johannes一个澄清自己的机会。 – j08691

回答

1

我决定跟进我的怀疑,即在召集开始活动之前设置了收容措施。

我发现这个代码在JQuery用户界面的源代码:

//Set a containment if given in the options 
this._setContainment(); 

//Trigger event + callbacks 
if(this._trigger("start", event) === false) { 
    this._clear(); 
    return false; 
} 

我简单地切换顺序各地,使_setContainment()功能会在事件发生后调用。这为我解决了这个问题,但我有点担心这可能会产生影响(包括错误/可维护性)。

所以,如果任何人有任何更好的想法,我会很感激。

+0

感谢您的支持。还没有发现任何不良副作用,并且似乎是迄今为止我发现的唯一体面的解决方案。 – producerism

+1

很高兴能够提供帮助,但如果它在两年后仍然是“唯一体面的解决方案”,那很不幸。 – Johannes