【问题标题】:Swapping two divs using jQuery sortable使用 jQuery 可排序交换两个 div
【发布时间】:2017-02-16 14:07:13
【问题描述】:

我有多个connectedSortable 部分,每个div 里面有一个div.widget,如下:

<div class="row">
        <section class="col-xs-4 col-sm-4 col-md-4 col-lg-4 connectedSortable">
            <div class="widget">Widget 1</div>
        </section>

        <section class="col-xs-4 col-sm-4 col-md-4 col-lg-4 connectedSortable">
            <div class="widget">Widget 2</div>
        </section>

        <section class="col-xs-4 col-sm-4 col-md-4 col-lg-4 connectedSortable">
     <div class="widget">Widget 3</div>
        </section>
    </div>
    <div class="row">
        <section class="col-xs-3 col-sm-3 col-md-3 col-lg-3 connectedSortable">
      <div class="widget">Widget 4</div>
        </section>

        <section class="col-xs-3 col-sm-3 col-md-3 col-lg-3 connectedSortable">
      <div class="widget">Widget 5</div>
        </section>

        <section class="col-xs-3 col-sm-3 col-md-3 col-lg-3 connectedSortable">
      <div class="widget">Widget 6</div>
        </section>

        <section class="col-xs-3 col-sm-3 col-md-3 col-lg-3 connectedSortable">
      <div class="widget">Widget 7</div>
        </section>
    </div>

使用可排序的 jQuery 插件,它会将拖动的 div 插入到connectedSortable 部分而不是交换。

我想要做的不是将该 div 插入 connectedSortable 部分中,而是将其与该 connectedSortable 部分中的 div 交换。

connectedSortable 部分中没有 div.widget 时,我只能删除一个 div.widget 并且没有任何东西可以交换,因为它已经是空的。

我该怎么做?

这是我尝试过的一个 jsfiddle: http://jsfiddle.net/pus4aff6/

【问题讨论】:

  • 你为什么使用Sortable?如果我理解正确,您想交换小部件,而不是容器,那么您需要制作小部件droppable 并检查目标是否为空...如果不是,则交换内容,这将是附加(@987654324 @) 预先存在的小部件到被放置小部件的原点。
  • 要交换项目,您可以使用以下答案:stackoverflow.com/questions/2263687/…

标签: javascript jquery jquery-ui jquery-ui-sortable


【解决方案1】:

我不会为此小部件使用引导行,而是基于 jQuery UI Sortable description 和 css flexbox 创建我自己的网格。

$( function() {
  $( "ul" ).sortable().disableSelection();
} );
ul{
  list-style-type: none; /* remove bullets */
  display: flex; /* flexbox */
  flex-wrap: wrap; /* multiple lines */
  align-items: stretch;
}
li{
  flex-grow: 1; /* stretch box width */
  width: 20vw;  /* 20vw is 20% of the browser width, you can replace it with an absolute value */
  min-height:50px;
  cursor:move;
}
/* remove margin & padding for this demo */
body, ul{
  margin: 0;
  padding: 0;
}
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/themes/base/jquery-ui.css" type="text/css" media="all" /> 
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.min.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js" type="text/javascript"></script>

<ul>
  <li class="ui-state-default">Widget 1</li>
  <li class="ui-state-default">Widget 2</li>
  <li class="ui-state-default">Widget 3</li>
  <li class="ui-state-default">Widget 4</li>
  <li class="ui-state-default">Widget 5</li>
  <li class="ui-state-default">Widget 6</li>
  <li class="ui-state-default">Widget 7</li>
  <li class="ui-state-default">Widget 8</li>
  <li class="ui-state-default">Widget 9</li>
  <li class="ui-state-default">Widget 10</li>
  <li class="ui-state-default">Widget 11</li>
</ul>

删除 ui-state-default 类以使用您自己的设计而不是 jQuery UI。

【讨论】:

  • 很抱歉,这只是一个常规的可排序列表,如您所见,我有一组 connectedSortable div,因此每个连接的 connectedSortable 一次只能包含一个元素。
  • 没错,我已经删除了带有connectedSortable 类的引导元素。
【解决方案2】:

我创建了一个解决方案,我在其中处理 startreceive 事件,如下所示:

start: function(event, ui){
                        ui.item.startPos = ui.item.index();
                    },
                    receive: function(event, ui) {
                        var source = ui.sender;
                        var target = $(this);
                        var draggedItem = ui.item;
                        if(target.attr('id') !== 'widgets-container'){
                            if(target.find('div.widget').length >= 2){
                                if(source.is('#widgets-container')){
                                    draggedItem.remove();
                                    if(ui.item.startPos === 0) {
                                        source.prepend(draggedItem);
                                    }else{
                                        source.children().eq(ui.item.startPos-1).after(draggedItem);
                                    }
                                }else{
                                    var elementToSwap = target.find('div.widget').not(draggedItem)[0];
                                    source.html(elementToSwap);
                                }
                            }
                        }   
                    }

这里更新jsfiddle:http://jsfiddle.net/frgj5qmm/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多