jQuery Сортируемый без jQuery UI - PullRequest
16 голосов
/ 11 января 2011

Мне нужна функциональность "Sortable Drag & Drop", и я использую jQuery. Я действительно не могу использовать пользовательский интерфейс jQuery, потому что для этого проекта это было бы непроизводительно (мне нужно было бы добавить много килобайт JS и CSS только для использования небольшой части функциональности).

Есть ли какой-нибудь плагин, который вы могли бы порекомендовать, или, может быть, простой путь реализации, которому я мог бы следовать?

Решение должно быть максимально легким, желательно на основе jQuery / Sizzle или чистого JavaScript.

Ответы [ 10 ]

19 голосов
/ 17 сентября 2012

Для будущих поколений: http://dragsort.codeplex.com/

Демонстрация: http://cleesh.org/example (не удалось найти ни одного на веб-сайте разработки).

Сокращено до9 КБ в размере.

15 голосов
/ 11 января 2011

Вы можете создать свою собственную загрузку JQuery на jqueryui.com без всякой информации о css / theme.Вы также можете убрать виджеты и эффекты и просто использовать перетаскиваемый / сбрасываемый.

Получается до 30 КБ олл-ин. Все еще слишком большой?

8 голосов
/ 27 февраля 2013

Вот еще один для будущих поколений: http://johnny.github.com/jquery-sortable/.

Единственная зависимость - это jQuery, с хорошим набором функций и минимальным 8kb.

3 голосов
/ 19 сентября 2014

много времени с тех пор, как об этом спросили, так что, возможно, если вы думаете об альтернативе пользовательскому интерфейсу jquery, это действительно хороший и простой в реализации http://rubaxa.github.io/Sortable/

2 голосов
/ 11 января 2011

Если вы посмотрите на jQuery UI source , jquery.ui.sortable.js - это отдельный файл, который, я считаю, зависит только от jquery.ui.core.js, jquery.ui.widget.js и jquery.ui.mouse.js, хотя я не проверялэтот.Тем не менее, это все еще весит в 36KB минимизировано.

2 голосов
/ 11 января 2011

Если вы уверены, что не используете настроенную, сжатую и сжатую версию jQueryUI, которую вы можете поддерживать и обновлять ...

... возможно, один из плагинов из следующего поста блога подходит вам:

«17 плагинов jQuery для простого и эффективного изменения порядка и фильтрации элементов страницы» http://www.tripwiremagazine.com/2010/03/17-jquery-plugins-for-easy-and-efficient-reordering-and-filtering-page-elements.html

примеров из блога: «Переупорядочивание списка» (<10 КБ) или «Сортируемые строки таблицы с jQuery - Перетаскиваемые строки» (<3 КБ) </p>

1 голос
/ 02 марта 2015

Вы можете попробовать мой (http://jsfiddle.net/606bs750/16/). Неограниченное количество блоков, которые вы можете перетаскивать и сортировать.

Блоки будут ограничены родительским.

<div id="parent" class="parent">
    <button id="button1" class="button">Drag me 1</button>
    <button id="button2" class="button">Drag me 2</button>
    <button id="button3" class="button">Drag me 3</button>
    <button id="button4" class="button">Drag me 4</button>
</div>

JQuery (только):

$(function() {
    $('.button').mousedown(function(e) {
        if(e.which===1) {
            var button = $(this);
            var button_id = button.attr('id');
            var parent_height = button.parent().innerHeight();
            var top = parseInt(button.css('top'));
            var original_ypos = button.position().top; //original ypos
            var drag_min_ypos = 0-original_ypos;
            var drag_max_ypos = parent_height-original_ypos-button.outerHeight();
            var drag_start_ypos = e.clientY;
            var my_ypos = original_ypos;
            //Set current order for all
            $('.button').each(function(i) { $(this).attr('data-order',(i+1)); });
            var prev_button = button.prev('.button'); var next_button = button.next('.button');
            var prev_button_ypos = prev_button.length>0 ? prev_button.position().top : '';
            var next_button_ypos = next_button.length>0 ? next_button.position().top : '';
            $('#log1').text('mousedown '+button_id+' original_ypos: '+original_ypos);
            $('#log2').text('');
            $('#log3').text('');
            $(window).on('mousemove',function(e) {
                //Move and constrain
                button.addClass('drag');
                var direction = my_ypos>button.position().top ? 'up' : 'down';
                var new_top = top+(e.clientY-drag_start_ypos);
                my_ypos = button.position().top;
                button.css({top:new_top+'px'});
                if(new_top<drag_min_ypos) { button.css({top:drag_min_ypos+'px'}); }
                if(new_top>drag_max_ypos) { button.css({top:drag_max_ypos+'px'}); }
                $('#log2').text('mousemove new_top: '+new_top+', my_ypos: '+my_ypos+', direction: '+direction);
                //$('#log3').text('');
                //Check position over others
                if(direction=='down'&&next_button_ypos!='') {
                    if(my_ypos>next_button_ypos) { //crossed next button
                        $('#log3').text('dragged after '+next_button_ypos+' ('+next_button.attr('id')+')');
                        next_button.css({top:(parseInt(next_button.css('top'))-next_button.outerHeight(true))+'px'}); //up once
                        var tmp_order = next_button.attr('data-order');
                        next_button.attr('data-order',button.attr('data-order')); //switch order
                        button.attr('data-order',tmp_order);
                        prev_button = next_button; next_button = next_button.nextAll('.button:not(.drag)').first();
                        prev_button_ypos = prev_button.length>0 ? prev_button.position().top : '';
                        next_button_ypos = next_button.length>0 ? next_button.position().top : '';
                    }
                } else if(direction=='up'&&prev_button_ypos!='') {
                    if(my_ypos<prev_button_ypos) { //crossed prev button
                        $('#log3').text('dragged before '+prev_button_ypos+', '+prev_button.attr('id'));
                        prev_button.css({top:(parseInt(prev_button.css('top'))+prev_button.outerHeight(true))+'px'}); //down once
                        var tmp_order = prev_button.attr('data-order');
                        prev_button.attr('data-order',button.attr('data-order')); //switch order
                        button.attr('data-order',tmp_order);
                        next_button = prev_button; prev_button = prev_button.prevAll('.button:not(.drag)').first();
                        prev_button_ypos = prev_button.length>0 ? prev_button.position().top : '';
                        next_button_ypos = next_button.length>0 ? next_button.position().top : '';
                    }
                }
                $('#log4').text('prev_button_ypos: '+prev_button_ypos+' ('+prev_button.attr('id')+'), next_button_ypos: '+next_button_ypos+' ('+next_button.attr('id')+')');
            });
            $(window).on('mouseup',function(e) {
                 if(e.which===1) {
                    $('.button').removeClass('drag');
                    $(window).off('mouseup mousemove');
                    //Reorder and reposition all
                    $('.button').each(function() {
                        var this_order = parseInt($(this).attr('data-order'));
                        var prev_order = $(this).siblings('.button[data-order="'+(this_order-1)+'"]');
                        if(prev_order.length>0) { $(this).insertAfter(prev_order); }
                    });
                    $('.button').css('top','0'); $('.button').removeAttr('data-order'); //reset
                    $('#log1').text('mouseup');
                    $('#log2').text('');
                    $('#log3').text('');
                    $('#log4').text('');
                 }
            });
        }
    });
});
0 голосов
/ 01 апреля 2017

Я предлагаю вам перейти к "перетаскиванию LMDD". Разархивировано менее 4 КБ и очень просто реализовать.https://supraniti.github.io/Lean-Mean-Drag-and-Drop/ Простой пример:

div id="basic-example"> (scope)
    <div class="grid"> (container)
        <div class="item"></div> (draggable)
    </div>
</div>
<script>
    lmdd.set(document.getElementById('basic-example'), {
        containerClass: 'grid',
        draggableItemClass: 'item'
});
</script>
0 голосов
/ 28 декабря 2013

Если вы не хотите оборок, я нашел этот лучший: http://jsfiddle.net/erikdana/Nkykq/3/ до http://jsfiddle.net/erikdana/Nkykq/6/

очень очень легкий и точный.

JS

$('#box').bind({
    mousedown: function() {
        $(document).mousemove(function(e) {
            $('#box').css({
                top: e.pageY - 10,
                left: e.pageX - 20
            });
        });
    },
    mouseup: function() {
        $(document).unbind(mousedown);
        var box = $('#box').css('top');
        if (box > '100') {
            $('#box').css({width: '100px'});
        };
    }
});

CSS

div {width:50px;height:50px;background:blue;position:absolute; cursor:move;}
div:focus { cursor:move;}
0 голосов
/ 15 ноября 2011

есть один здесь http://plugins.jquery.com/project/NestedSortable он не использует пользовательский интерфейс и занимает всего 5 КБ (хотя вы могли бы взломать любую дополнительную функциональность, чтобы уменьшить ее при необходимости)

надеюсь, что поможет

Andrew

...