jQuery Draggable + Sortable - Как перетаскивать между двумя прокручиваемыми списками - PullRequest
6 голосов
/ 05 ноября 2010

Я хотел бы иметь два списка, Доступные элементы и Выбранные элементы, в соответствии с которыми Доступные элементы назначаются выбранным элементам путем перетаскивания. Я требую сортировки выбранных предметов, но не доступных предметов. Проблема состоит в том, что оба списка могут содержать значительное количество элементов, и поэтому их необходимо прокручивать.

Вот jQuery, который у меня есть:

        <script type="text/javascript">
        $(function() {
            $( "#available > li" ).draggable({ 
                revert: 'invalid',
                connectToSortable: '#selected',
                containment: '#drag_container'
            });

            $( "#selected" ).sortable({
                axis: 'y',
                placeholder: 'ui-state-highlight'
            });
        });
    </script>

и соответствующий HTML:

            <div class="drag_container">
            <ul id="available" class="drag_column draggable">
                <li id="item1" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 1</li>
                <li id="item2" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 2</li>
                <li id="item3" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 3</li>
                <li id="item4" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 4</li>
                <li id="item5" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 5</li>
                <li id="item6" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 6</li>
                <li id="item9" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 9</li>
                <li id="item10" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 10</li>
            </ul>


            <ul id="selected" class="drag_column draggable sortable" style="margin-left: 20px;">
                <li id="item7" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 7</li>
                <li id="item8" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 8</li>
                <li id="item9" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 9</li>
                <li id="item10" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 10</li>
                <li id="item11" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 11</li>
                <li id="item12" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 12</li>
                <li id="item13" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 13</li>
                <li id="item14" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 14</li>
                <li id="item15" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 15</li>
                <li id="item16" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 16</li>
                <li id="item17" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 17</li>
                <li id="item18" class="ui-state-default"><span class="ui-icon ui-icon-arrow-4-diag"></span>Item 18</li>
            </ul>
            <div style="clear: both">&nbsp;</div>
        </div>

Однако с требованием прокручиваемого списка я не могу заставить перетаскиваемое поведение работать элегантно (см. Демонстрацию на http://pastehtml.com/view/1bsk6bt.html).

Как только перетаскиваемый элемент попадает в список «Доступные элементы», он исчезает за рамкой с прокруткой. Я пробовал помощника клонирования, а также пытался поиграть с содержащимися в нем divами, различными вариантами переполнения, отключив опцию прокрутки в jQuery, но не могу заставить его работать должным образом. Я уверен, что кто-то достиг чего-то вроде того, что я собираюсь сделать здесь, и может сэкономить мне время? :)

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

6 голосов
/ 17 ноября 2010

Уф!Исправить это было весело.

Первая проблема, когда список прокручивался вечно по горизонтали, я исправил с помощью некоторых простых изменений переполнения в вашем CSS.Я удалил оба атрибута переполнения из вашего .drag_column и поместил переполнение: скрыто в .drag_container.

.drag_container {
    width: 1000px;
    margin: 0 auto;
    position: relative;
    border: 1px solid black;
    position: relative;
    z-index: 1;
    overflow: hidden;
}

.drag_column {
    padding: 5px;
    width: 490px;
    height: 200px;
    float: left;
    position: relative;
}

К сожалению, когда я сделал это, он создал ошибку позиции, когда вы переместили перетаскиваемый объект из одного спискана другой (он будет стрелять вверх, в зависимости от того, какой элемент списка вы выбрали).Чтобы исправить это, я добавил строку «helper: clone» в вашу перетаскиваемую функцию создания.

$( "#available > li" ).draggable({ 
    revert: 'invalid',
    connectToSortable: '#selected',
    containment: '#drag_container',
    helper: 'clone'
});

Еще раз, это создало нежелательный эффект.Помощник клона делает это так, что в исходном списке никогда не удаляются элементы.Чтобы это исправить, мне пришлось вручную создать функцию, которая удаляла бы старый элемент.Я добавил в свой перетаскиваемый объект функцию start:, которая захватила идентификатор объекта и поместила его в переменную.Затем я создал объект перетаскивания из вашего списка #selected и сделал там функцию drop :.Эта функция удаления просто выполняет slideUp (100) для объекта с соответствующим идентификатором.Обратите внимание, что у меня есть создание переменной при запуске скрипта - это исправляет ошибку в IE.

var dragged = null;
$(function() {
    $( "#available > li" ).draggable({ 
        revert: 'invalid',
        connectToSortable: '#selected',
        containment: '#drag_container',
        helper: 'clone',
        start: function(ui, event) {
            dragged = $(this).attr('id');
        }
    });
    $( "#selected" ).droppable({
        drop: function(event, ui) {
            var ident = "#" +  dragged;
            $(ident).slideUp(100);
        }
    });

Я разместил страницу с полным HTML на http://pastehtml.com/view/1by9nfd.html, чтобы вы могли поигратьесли ты хочешь.Надеюсь, это поможет!

1 голос
/ 09 января 2013

Мне нужна была эта функциональность, и я нашел способ сделать это

используйте appendTo: "body" и установите абсолютную позицию при запуске. Перетаскиваемый элемент добавляется к телу и всегда является «вершиной» других элементов, поскольку его положение абсолютно равно телу.

$( "#available > li" ).draggable({

    revert: 'invalid',
    appendTo: 'body',
    helper: 'clone',
    connectToSortable: '#selected',
    containment: '#drag_container',

start: function( event, ui ){

    $(ui.helper).css('position', 'absolute'); //helper if you are using clone

},


stop: function(event, ui){

    $(ui.helper).css('position', 'relative'); // if you want

} 

});

Надеюсь, это поможет

...