jquery - 让 Jquery 在可放置和可拖动的 <div> 中可排序

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

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

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

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 上做了一些研究,但仍然找不到确切的解决方案。预先非常感谢您。

最佳答案

使用 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
    }
});

尝试使用 fiddle :

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

关于jquery - 让 Jquery 在可放置和可拖动的 <div> 中可排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15845423/

相关文章:

javascript - 计算div重叠区域和位置

javascript - jQuery 在同一个函数上绑定(bind)each() 和click()

jquery - 拖动并 connectToSortable 到 iframe 内的可排序 DIV 中

javascript - 如何让 php POST 代码在 Javascript 代码之前运行?

jquery - 从控制台使用 jQuery 获取所有 anchor 元素?

javascript - 可拖动连接到可排序

jquery - 当我使用 jQuery sortable 并开始拖动时,如何防止我的 li 高度在 IE8 中发生变化

javascript - 删除元素后更改列表中正在删除的元素的颜色

javascript - jQuery UI 可拖动位于其他元素后面

jquery - 如何让 jQueryUI 拖放与触摸设备配合使用