【问题标题】:Limit number of droppable dragged items inside a container限制容器内可拖放项目的数量
【发布时间】:2016-11-04 00:18:54
【问题描述】:

我找到了这个code,以及链接的fiddle

这与我要找的很接近,但是我想添加一个计数器,因为我希望列表 2 和列表 3 只接受 3 个可拖动项目。

出于我的目的,我打算在此代码中添加更多列表,并且它们也只需要接受 3 个项目。

列表 1 需要能够接受所有可拖动的项目。

我想我需要创建一个带有计数器的数组来跟踪所有这些,但我不知道该怎么做。我不太了解或不懂javascript。

对此的任何帮助将不胜感激。

$(document).ready(function(){
         $(".droppable").droppable({
            drop: function(event, ui) {
                var $list = $(this);
                $helper = ui.helper;
                $($helper).removeClass("selected");
                var $selected = $(".selected");                 
                if($selected.length > 1){                       
                    moveSelected($list,$selected);
                }else{
                    moveItem(ui.draggable,$list);
                }                                       
            }, tolerance: "touch"
         });

         $(".draggable").draggable({
            revert: "invalid",
            helper: "clone",
            cursor: "move",
            drag: function(event,ui){
                var $helper = ui.helper;
                $($helper).removeClass("selected");
                var $selected = $(".selected"); 
                if($selected.length > 1){   
                    $($helper).html($selected.length + " items");
                }                                       
            }
         });

        function moveSelected($list,$selected){
            $($selected).each(function(){
                $(this).fadeOut(function(){
                       $(this).appendTo($list).removeClass("selected").fadeIn();
                });                 
            });             
        }

        function moveItem( $item,$list ) {
            $item.fadeOut(function() {
                $item.find(".item").remove();
                $item.appendTo( $list ).fadeIn();
            });
        }

        $(".item").click(function(){
            $(this).toggleClass("selected");
        });

    });

HTML...

<div id="list1" class="droppable list"><!-- I want this to accept many. -->
        <div class="item draggable">1</div>
        <div class="item draggable">2</div>
        <div class="item draggable">3</div>
        <div class="item draggable">4</div>
    </div>
    <div id="list2" class="droppable list"><!-- I want this to accept only 3. -->
        <div class="item draggable">5</div>
        <div class="item draggable">6</div>
    </div>
    <div id="list3" class="droppable list"><!-- I want this to accept only 3. -->
        <div class="item draggable">7</div>
    </div>

【问题讨论】:

    标签: javascript jquery jquery-ui drag-and-drop


    【解决方案1】:

    为每个可放置列表添加了data-max 属性,在drop 函数中,您可以检查该列表中的元素数量是否达到max(限制),如果是,则返回false。

    以下是对代码的更改:

    $(document).ready(function(){
      $(".droppable").droppable({
        drop: function(event, ui) {
          var $list = $(this);
          $helper = ui.helper;
          
          // Check if we reached the maximum number of children. 
          if ($(this).children().length == $(this).data('max')) {
            return false;
          }
          
          $($helper).removeClass("selected");
          var $selected = $(".selected");                 
          if($selected.length > 1){                       
            moveSelected($list,$selected);
          }else{
            moveItem(ui.draggable,$list);
          }                                       
        }, tolerance: "touch"
      });
    
      $(".draggable").draggable({
        revert: "invalid",
        helper: "clone",
        cursor: "move",
        drag: function(event,ui){
          var $helper = ui.helper;
          $($helper).removeClass("selected");
          var $selected = $(".selected"); 
          if($selected.length > 1){   
            $($helper).html($selected.length + " items");
          }                                       
        }
      });
    
      function moveSelected($list,$selected){
        $($selected).each(function(){
          $(this).fadeOut(function(){
            $(this).appendTo($list).removeClass("selected").fadeIn();
          });                 
        });             
      }
    
      function moveItem( $item,$list ) {
        $item.fadeOut(function() {
          $item.find(".item").remove();
          $item.appendTo( $list ).fadeIn();
        });
      }
    
      $(".item").click(function(){
        $(this).toggleClass("selected");
      });
    
    });
    div.list {
      border: 1px solid red;
      margin: 5px;
      min-height: 20px;
    }
    div.list div {
      background: gray;
      margin: 4px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
    <div id="list1" class="droppable list" data-max="-1"><!-- I want this to accept many. -->
      <div class="item draggable">1</div>
      <div class="item draggable">2</div>
      <div class="item draggable">3</div>
      <div class="item draggable">4</div>
    </div>
    <div id="list2" class="droppable list" data-max="3"><!-- I want this to accept only 3. -->
      <div class="item draggable">5</div>
      <div class="item draggable">6</div>
    </div>
    <div id="list3" class="droppable list" data-max="3"><!-- I want this to accept only 3. -->
      <div class="item draggable">7</div>
    </div>

    【讨论】:

    • .selected 仍然可以在每个列表中添加超过 3 个。关于如何防止这种情况的任何想法?我将$(".droppable").droppable ... if($selected.length &gt; 1) 更改为if($selected.length &lt;= 3),它似乎可以工作,但它仍然可以在每个列表中添加超过 3 个并保留可拖动对象。
    • 我不太明白这条评论。你能澄清一下吗?
    • 如果您点击可拖动对象,但不移动它,它会被选中并改变颜色。您可以根据需要选择任意数量,然后一次将它们全部移动。 (这是我自己才意识到的。)我想我可以通过将 droppables 下的 if($selected.length &gt; 1) 行更改为 if($selected.length &lt;=3) 来解决它,但它没有用。
    • 我没有看到任何颜色变化,我不明白您如何选择“任意数量”。
    • 这里是fiddle。它具有与我的问题相同的代码,并带有您的编辑。如果你点击 1-4,然后将它们拖到带有 #7 的框,它将在那个框中有 5 个项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多