jQuery 可拖动和 appendTo 不起作用

Posted

技术标签:

【中文标题】jQuery 可拖动和 appendTo 不起作用【英文标题】:jQuery draggable and appendTo doesn't work 【发布时间】:2012-03-27 17:14:49 【问题描述】:

我使用 jQuery ui 可拖动,但选项 appendTo 不起作用。但是,其他选项(例如包含或网格)可以正常工作。代码如下:

html

<div id="demo">
</div>
<div id="sidebar">
    <div class="item">
    </div>
    <div class="item">
    </div>
    <div class="item">
    </div>
    <div class="item">
    </div> 
</div>

脚本

jQuery(".item").draggable( appendTo: "#demo", grid: [ 10, 10 ], containment: "#demo" );

CSS

#demo 
    width: 500px;
    height: 500px;
    border: 1px solid black;
    float: left;

#draggable 
    background: red;
    width: 50px;
    height: 50px;

#sidebar 
    float: left;
    width: 300px;

.item 
    cursor: pointer;
    background: black;
    width: 100px;
    height: 100px;
    margin: 10px;

这是一个现场演示:http://jsfiddle.net/fzjev/

【问题讨论】:

【参考方案1】:

这里有一个关于这个问题的开放错误 - Draggable: appendTo option doesn't work together with helper: 'original'。

建议的解决方法是使用helper: 'clone' 并在拖动开始/停止时隐藏/显示原件。

例如

$('.draggyThing').draggable(
        appendTo: '.dropArea',
        helper: 'clone',
        start: function (event, ui) 
            $(this).hide();
        ,
        stop: function (event, ui) 
            $(this).show();
        
    );

然后您可能希望手动将您的可拖动项附加到 dropdroppable 元素上。

 $('.dropArea').droppable(
        accept: '.draggyThing',
        drop: function (event, ui) 
            $('.dropArea').append(ui.draggable);
        
    );

【讨论】:

这实际上似乎更像是对 OP 问题的回答,以及具有与预期行为相同的行为的解决方案。 Jquery Sortable 的工作方式相同,但 sortable 是在可排序项目的容器元素上启动的,因此在这种情况下您可能希望使用 ui.item.hide()/show() 而不是 $(this)【参考方案2】:

看起来要识别 appendTo 选项,被拖动的项目必须在正文之外。

来自 jQuery UI 1.8.18(大约第 275 行)

if(!helper.parents('body').length)
  helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));

在您的示例中,if 语句的计算结果为 false,因此 appendTo 逻辑不会被触发。

【讨论】:

jsfiddle.net/fzjev 拖动一个项目,您会看到它在#demo 中是可拖动的,但 不会附加在#demo 中。 使我之前的答案(实际上更像是一个问题)黯然失色,并更新了一些更像答案的东西。老实说,我不确定为什么会这样设置,但至少我们知道现在发生了什么。【参考方案3】:

在我的情况下,这些例子可以正常工作:

$("[drag='true']").draggable(
    drag: handleDragDrag,
    start: handleDragStart,
    stop: handleDragStop,
    helper: 'clone',
    appendTo: 'body'
)
function handleDragStart(ev, ui) 
    $(this).show();

function handleDragDrag(ev, ui) 

function handleDragStop(ev, ui) 
    $(this).show();

【讨论】:

以上是关于jQuery 可拖动和 appendTo 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

可拖动的 jQuery UI 在 chrome 中不起作用

.appendTo在.bind(加载)中不起作用 - jQuery

JQuery可拖动:使用助手时滚动不起作用:使用克隆

jQuery 拖放模拟对最后一个可拖动对象不起作用

将可拖动对象放入可排序对象后,jQuery Click 事件不起作用

如果为空,则拖动到父 div 时,jQuery 可排序不起作用