让Jquery在droppable和draggable <div> </div>中可排序

时间:2013-04-05 23:57:19

标签: jquery jquery-ui-sortable jquery-ui-droppable

我目前正在开发一项功能,我需要同时将可放置,可拖动和可排序的功能组合在一起。下面是我的测试代码。我很抱歉,因为我无法获得此代码的jsfiddle。 Droppable和Draggable工作正常。

问题:我很难在我的droppable div中进行水平排序。如果有人可以帮助/指导我在排序列表中获取元素的索引/位置,无论元素是在第1个,第2个等位置,我将不胜感激。

HTML:

        <ul id="gallery" class="gallery ui-helper-reset ui-helper-clearfix">
          <li class="ui-widget-content ui-corner-tr">
            <div class="ui-widget-header">High Tatras 1</div>
          </li>
          <li class="ui-widget-content ui-corner-tr">
            <div class="ui-widget-header">High Tatras 2</div>
          </li>
          <li class="ui-widget-content ui-corner-tr">
            <div class="ui-widget-header">High Tatras 3</div>
          </li>
          <li class="ui-widget-content ui-corner-tr">
            <div class="ui-widget-header">High Tatras 4</div>
          </li>
        </ul>

        <div id="trash" class="ui-widget-content ui-state-default">
            <ul id = "sortable" class='gallery ui-helper-reset sortable'></ul>
        </div>

以上是我用作测试数据的HTML代码。

JQuery:下面是我目前正在使用的Jquery代码。

                   var $gallery = $( "#gallery" ),
                   $trash = $( "#trash" );

                 // let the gallery items be draggable
                 $( "li", $gallery ).draggable({
                   cancel: "a.ui-icon", // clicking an icon won't initiate dragging
                   revert: "invalid", // when not dropped, the item will revert back to its initial position
                   containment: "document",
                   helper: "clone",
                   cursor: "move"
                 });

                 // let the trash be droppable, accepting the gallery items
                 $trash.droppable({
                   accept: "#gallery > li",
                   activeClass: "ui-state-highlight",
                   drop: function( event, ui ) {
                     addToContainer( ui.draggable );
                   }
                 });

                 // let the gallery be droppable as well, accepting items from the trash
                 $gallery.droppable({
                   accept: "#trash li",
                   activeClass: "custom-state-active",
                   drop: function( event, ui ) {
                     RemoveFromContainer( ui.draggable );
                   }
                 });

                 function addToContainer( $item ) {
                   $item.fadeOut(function() {
                     var $list = $( "ul", $trash );

                     $item.appendTo($list).fadeIn(function() {
                       $item
                         .addClass('ui-state-default')
                         .find( "div .ui-widget-header" )
                           .animate({ height: "36px"});
                     });
                   });

                   $( ".sortable" ).sortable({
                       connectWith: "#sortable"
                   }).disableSelection();

                 }

                 function RemoveFromContainer( $item ) {
                   $item.fadeOut(function() {
                     $item
                       .find( "a.ui-icon-refresh" )
                         .remove()
                       .end()
                       .css( "width", "96px")
                       .find( "img" )
                         .css( "height", "72px" )
                       .end()
                       .appendTo( $gallery )
                       .fadeIn();
                   });
                 }

                 // resolve the icons behavior with event delegation
                 $( "ul.gallery > li" ).click(function( event ) {

                   var $item = $( this ),
                     $target = $( event.target );

                   if ( $target.is( "a.ui-icon-trash" ) ) {
                     addToContainer( $item );
                   } else if ( $target.is( "a.ui-icon-refresh" ) ) {
                     RemoveFromContainer( $item );
                   }

                   return false;
                 });

如果我遗失了某些内容并且未能发布正确的问题,请告诉我。我对stackoverflow做了一些研究,但仍然无法找到确切的解决方案。非常感谢你提前。

1 个答案:

答案 0 :(得分:1)

使用2 sortable并将connectWith属性设置为彼此:

var $gallery = $("#gallery"),
    $trash = $("#trash");
$("#gallery").sortable({
    connectWith: "#trash",
    helper: "",
    revert: "invalid",
    start: function (event, ui) {
        var $item = ui.helper;
        $item.css({
            'width': $('#gallery li').width()
        });
    },
    stop: function (event, ui) {
       //get what you want here
    }
});

$('#trash').sortable({
    placeholder: "ui-state-highlight",
    connectWith: '#gallery',
    revert: true,
    cursor: "move",
    items: "li",
    drop: function (event, ui) {

    },
    stop: function (event, ui) {
        var $obj = $(ui.item);
       //get what you want here
    }
});

尝试小提琴:

http://jsfiddle.net/mw3Pn/2/