1

選択可能なリストがあり、並べ替えも可能にしたいと考えています。また、なげなわ機能を使用する代わりに、選択可能なリストで複数のアイテムをクリックで選択できるため、リストのなげなわ機能を無効にしたいと思います。コードに $('#selectable').sortable() を追加しようとすると、リストは選択できなくなりますが、並べ替えることができます。

これが私のjsfiddleへのリンクです:

http://jsfiddle.net/jortgonfreit/HJugc/

ここに私の現在のJavaScriptコードがあります:

var $currentlySelected = null;
var selected = [];

$('#selectable').sortable();
$('#selectable').selectable({
start: function(event, ui) {
    $currentlySelected = $('#selectable .ui-selected');
},
stop: function(event, ui) {
    for (var i = 0; i < selected.length; i++) {
        if ($.inArray(selected[i], $currentlySelected) >= 0) {
          $(selected[i]).removeClass('ui-selected');
        }
    }
    selected = [];
},
selecting: function(event, ui) {
    $currentlySelected.addClass('ui-selected'); // re-apply ui-selected class to currently selected items
},
selected: function(event, ui) {
    selected.push(ui.selected); 
}
});
4

2 に答える 2

1

ソート可能と選択可能の両方が同じクリックイベントにあるため、おそらく両方を組み合わせることはできません。代わりに、ソートするホルダーを与えるだけです。

$('#selectable').sortable({ handle: ".holder" })//Make sortable on the handle
  .selectable({
    start: function(event, ui) {
        $currentlySelected = $('#selectable .ui-selected');
    }
    ,cancel: ".holder" //Cancel selection for holder
    ,
    stop: function(event, ui) {
        for (var i = 0; i < selected.length; i++) {
            if ($.inArray(selected[i], $currentlySelected) >= 0) {
              $(selected[i]).removeClass('ui-selected');
            }
        }
        selected = [];
    },
    selecting: function(event, ui) {
        $currentlySelected.addClass('ui-selected'); // re-apply ui-selected class to currently selected items
    },
    selected: function(event, ui) {
        selected.push(ui.selected); 
    }
}).find( "li" )
        .addClass( "ui-corner-all" )
         .prepend( 
             $('<div/>',
                 {'class':'holder'} )
            .append(
                 $('<span/>',
                     {'class':'ui-icon ui-icon-transfer-e-w'})
                  )
             );//Just prepend handle to li's or just addthem in your html itself and remove this section.

フィドル

独自のアイコンを使用しない場合は、このJquery UI Iconsを使用して、必要なアイコンを指定できます。

于 2013-05-24T20:14:23.507 に答える
0

これは、リストを選択およびソート可能にし、なげなわの実装を可能にするための私の回避策です。これがフィドルです。

<html>
<meta charset="utf-8" />
<title>jQuery UI Sortable with Selectable</title>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
$(function() {
//

$('body').selectable({
    filter: 'li'
    //filter: '#album2 > li'
});

/*
Since the sortable seems unable to move more than one object at a 
time, we'll do this:

The LIs should act only as wrappers for DIVs.

When sorting a LI, move all the DIVs that are children of selected 
LIs to inside the sorting LI (this will make them move together);
but before doing that, save inside the DIVs a reference to their
respective original parents, so we can restore them later.

When the user drop the sorting, restore the DIVs to their original
parent LIs and place those LIs right after the just-dropped LI.

Voilá!

Tip: doesn't work so great if you try to stick the LIs inside the LI
*/

$('.connectedSortable').sortable({
    connectWith: ".connectedSortable",
    delay: 100,
    start: function(e, ui) {
        var topleft = 0;

        // if the current sorting LI is not selected, select
        $(ui.item).addClass('ui-selected');

        $('.ui-selected div').each(function() {

            // save reference to original parent
            var originalParent = $(this).parent()[0];
            $(this).data('origin', originalParent);

            // position each DIV in cascade
            $(this).css('position', 'absolute');
            $(this).css('top', topleft);
            $(this).css('left', topleft);
            topleft += 20;

        }).appendTo(ui.item); // glue them all inside current sorting LI

    },
    stop: function(e, ui) {
        $(ui.item).children().each(function() {

            // restore all the DIVs in the sorting LI to their original parents
            var originalParent = $(this).data('origin');
            $(this).appendTo(originalParent);

            // remove the cascade positioning
            $(this).css('position', '');
            $(this).css('top', '');
            $(this).css('left', '');
        });

        // put the selected LIs after the just-dropped sorting LI
        $('#album .ui-selected').insertAfter(ui.item);

        // put the selected LIs after the just-dropped sorting LI
        $('#album2 .ui-selected').insertAfter(ui.item);
    }
});




//
});


<style>
*,
*:before,
*:after {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

#album {
    list-style: none;
    float: left;
    width: 20%;
    border: 1px solid blue;
}
#album2 {
    list-style: none;
    float: left;
    width: 20%;
    border: 1px solid blue;
}
#album li  {
    float: left;
    margin: 5px;
}

#album2 li  {
    float: left;
    margin: 5px;
}


#album div {
    width: 100px;
    height: 100px;
    border: 1px solid #CCC;

    background: #F6F6F6;    
}
#album2 div {
    width: 100px;
    height: 100px;
    border: 1px solid #CCC;

    background: #F6F6F6;    
}
#album .ui-sortable-placeholder {
    border: 1px dashed #CCC;
    width: 100px;
    height: 100px;
    background: none;
    visibility: visible !important;
}
#album2 .ui-sortable-placeholder {
    border: 1px dashed #CCC;
    width: 100px;
    height: 100px;
    background: none;
    visibility: visible !important;
}

#album .ui-selecting div, 
#album .ui-selected div {
    background-color: #3C6;
}

#album2 .ui-selecting div, 
#album2 .ui-selected div {
    background-color: #3C6;
}

#anotheralbum {
    list-style: none;
    float: left;
    width: 20%;
    height: 800px;
    border: 1px solid green;
}
</style>


<body>

<ul id="album" class="connectedSortable">
    <li id="li1"><div>1- First</div></li>
    <li id="li2"><div>2- Second</div></li>
    <li id="li3"><div>3- Third</div></li>
    <li id="li4"><div>4- Fourth</div></li>
    <li id="li5"><div>5- Fifth</div></li>
    <li id="li6"><div>6- Sixth</div></li>
    <li id="li7"><div>7- Seventh</div></li>
    <li id="li8"><div>8- Eighth</div></li>
</ul>

<ul id="album2" class="connectedSortable">
    <li id="li1"><div>1- 1</div></li>
    <li id="li2"><div>2- 2</div></li>
    <li id="li3"><div>3- 3</div></li>
    <li id="li4"><div>4- 4</div></li>
    <li id="li5"><div>5- 5</div></li>
    <li id="li6"><div>6- 6</div></li>
    <li id="li7"><div>7- 7</div></li>
    <li id="li8"><div>8- 8</div></li>
</ul>
<div id="anotheralbum" class="connectedSortable">
another album - no style for the lists inside here
</div>

<br style="clear:both">
</body>
</html>
于 2015-02-11T16:02:03.480 に答える