【问题标题】:jQuery draggable and appendTo doesn't workjQuery 可拖动和 appendTo 不起作用
【发布时间】: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/

【问题讨论】:

    标签: jquery jquery-ui draggable appendto


    【解决方案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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2014-07-21
      相关资源
      最近更新 更多