Перетаскивание пользовательского интерфейса jQuery более одного раза

#jquery #jquery-ui #drag-and-drop

#jquery #jquery-пользовательский интерфейс #перетаскивание

Вопрос:

В настоящее время я работаю над сценарием, который позволит пользователям перетаскивать изображения украшений на рождественскую елку, чтобы украсить ее. Я использую jquery-ui, чтобы изображения, отображаемые на боковой панели, можно было перетаскивать по дереву. Вроде как это работает. По какой-то причине после того, как я перетаскиваю изображение в дерево, вы больше не можете его перемещать и не можете создать другое перетаскиваемое по дереву, поскольку исходное изображение больше не перетаскивается.

Вот код, который я придумал:

 $(document).ready(function () {
$('[clickable]').click(function () {
    if ( $(this).attr('targets') )
    {
        $($(this).attr('targets')).css('background-image', 'url('   $(this).attr('src')   ')');
    }
});

$('[draggable]').each(function () {
    $(this).css('z-index', '30');
    $(this).draggable({
    revert: "invalid"
    //, zIndex: 999
    , helper: 'clone'
     , containment: '#panel'
     , appendTo: '#'   $(this).attr('targets')
    });
});

$('[droppable]').each(function () {
    $(this).css('z-index', '-20');
    $(this).droppable({
        accept: '[targets='   $(this).attr('id')   ']'
        , drop: function (e, ui) {
            $(this).append($(ui));
            $(ui).draggable({
                revert: "invalid"
                //, zIndex: 999
                 , containment: '#top'
                 , appendTo: '#top'//'#'   $(this).attr('targets')
                });
        }
    });
});
});
  

и html:

 <div id="drop_area" droppable="droppable">
        <div id="canvas" droppable="droppable">
            <div id="background" droppable="droppable">
                <div id="tree" droppable="droppable">

                </div>
            </div>
        </div>

        <div id="selectors">
            <img src="./images/dressup/largepinkbow.png" draggable="draggable" targets="tree" />
        </div>

    </div>
  

Ответ №1:

Вы подходите к чему-то из этого неправильно. Вместо этого, если вы используете $.each, вы можете просто сделать .droppable и .draggable для выбора jquery.

 $('[draggable]').draggable({...})
  

Также вам не следует переустанавливать плагин .draggable() для каждого элемента пользовательского интерфейса, который вы удаляете. Все, что вам нужно сделать, это определить его для этого элемента один раз, а затем его можно будет перетаскивать до конца его жизни в dom.

Что-то вроде:

 $('[draggable]')
.css('z-index', '30')
.draggable({
    revert: "invalid"
    //, zIndex: 999
    , helper: 'clone'
     , containment: '#panel'
     , appendTo: '[droppable]'
    });
});

$('[droppable]')
    .css('z-index', '-20');
    .droppable({
        accept: '[draggable]'
        , drop: function (e, ui) {
            $(this).append($(ui));
        }
    });
});