jQuery перетаскиваемый и appendTo не работает

Я использую jQuery ui draggable, но опция 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/


person MatthewK    schedule 10.03.2012    source источник


Ответы (3)


вот открытая ошибка по этой проблеме - Draggable: опция appendTo не работает вместе с помощником: 'original'.

Предлагаемый обходной путь — использовать helper: 'clone' и скрывать/показывать оригинал при запуске/остановке перетаскивания.

e.g.

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

Затем вы, вероятно, захотите вручную добавить свои перетаскиваемые элементы к drop элемента droppable.

 $('.dropArea').droppable({
        accept: '.draggyThing',
        drop: function (event, ui) {
            $('.dropArea').append(ui.draggable);
        }
    });
person RYFN    schedule 13.05.2013
comment
На самом деле это больше похоже на ответ на вопрос ОП и решение иметь такое же поведение, как и то, что можно было бы ожидать в противном случае. - person Arjun Mehta; 08.10.2013
comment
Jquery Sortable работает так же, но sortable инициируется в элементе контейнера сортируемых элементов, поэтому в этом случае вы захотите использовать ui.item.hide()/show() вместо $(this) - person Kristian Sandström; 04.02.2015

Похоже, что для распознавания опции appendTo перетаскиваемый элемент должен находиться за пределами тела.

Из пользовательского интерфейса jQuery 1.8.18 (около строки 275)

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

В вашем примере оператор if оценивается как false, поэтому логика appendTo не запускается.

person Ian Robinson    schedule 10.03.2012
comment
jsfiddle.net/fzjev Перетащите элемент, вы увидите, что его можно перетаскивать внутри #demo, но ‹ div class=item›‹/div› не добавляется внутрь #demo. - person MatthewK; 10.03.2012
comment
Затмил мой предыдущий ответ (который на самом деле был скорее вопросом) и обновил его чем-то более похожим на ответ. Я, честно говоря, не уверен, почему все так устроено, но, по крайней мере, мы знаем, что сейчас происходит. - person Ian Robinson; 10.03.2012

В моем случае отлично работают эти примеры:

$("[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();
}
person lmcDevloper    schedule 12.09.2016