You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

验证每个容器仅含单个元素的拖拽功能优化需求

问题分析与解决方案

首先得指出一个关键问题:你的HTML代码里重复使用了sortable1sortable2这两个ID,而ID在HTML文档中必须是唯一的,重复的ID会直接导致选择器逻辑混乱,这也是你当前出现全局禁用拖拽问题的核心根源之一。我们需要先修正这个问题,改用class来标识同类容器。

接下来针对你的核心需求——让每个容器单独判断是否已有元素,仅禁用已有元素的目标容器的拖拽操作,不影响其他容器——下面是完整的修正实现:

完整代码实现

HTML

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

<!-- 源容器区域 -->
<div class="col-md-5">
  <div class="col-md-12">
    <ul class="source-container connectedSortable">
      <li class="ui-state-default">Item 1</li>
    </ul>
  </div><br />
  <div class="col-md-12">
    <ul class="source-container connectedSortable">
      <li class="ui-state-default">Item 2</li>
    </ul>
  </div><br />
  <div class="col-md-12">
    <ul class="source-container connectedSortable">
      <li class="ui-state-default">Item 3</li>
    </ul>
  </div><br />
  <div class="col-md-12">
    <ul class="source-container connectedSortable">
      <li class="ui-state-default">Item 4</li>
    </ul>
  </div><br />
  <div class="col-md-12">
    <ul class="source-container connectedSortable">
      <li class="ui-state-default">Item 5</li>
    </ul>
  </div><br />
</div>

<!-- 目标容器区域 -->
<div class="col-md-5">
  <div class="col-md-12">
    <ul class="target-container connectedSortable">
    </ul>
  </div>
  <div class="col-md-12">
    <ul class="target-container connectedSortable">
    </ul>
  </div>
  <div class="col-md-12">
    <ul class="target-container connectedSortable">
    </ul>
  </div>
  <div class="col-md-12">
    <ul class="target-container connectedSortable">
    </ul>
  </div>
  <div class="col-md-12">
    <ul class="target-container connectedSortable">
    </ul>
  </div>
</div>

CSS

.source-container, .target-container {
  border: 1px solid #eee;
  width: 142px;
  min-height: 20px;
  list-style-type: none;
  margin: 0;
  padding: 5px 0 0 0;
  float: left;
  margin-right: 10px;
}

.source-container li, .target-container li {
  margin: 0 15px 15px 15px;
  padding: 5px;
  font-size: 1.2em;
  width: 120px;
  display: block;
  text-align: center;
  float: left;
}

JavaScript

$(function () {
  $(".source-container, .target-container").sortable({
    connectWith: ".connectedSortable",
    stop: function (event, ui) {
      // 获取当前拖拽元素所在的目标容器
      const targetContainer = ui.item.parent();
      // 判断该容器内的li数量是否超过1(每个容器最多容纳1个元素)
      if (targetContainer.find('li').length > 1) {
        $(this).sortable("cancel");
      }
    },
  }).disableSelection();
});

关键改动说明

  1. 修正HTML结构问题:把重复的sortable1sortable2ID替换为source-containertarget-container类,确保DOM结构符合规范,彻底解决选择器混淆的问题。

  2. 实现容器独立判断:在stop事件中,不再使用全局选择器$('ul#sortable2 li'),而是通过ui.item.parent()精准获取当前拖拽元素的目标容器,只判断该容器内的li数量。这样每个容器的判断逻辑都是独立的,不会影响其他容器的拖拽功能。

  3. 严格控制单元素限制:当目标容器内的li数量超过1时,调用sortable("cancel")取消本次拖拽,确保每个容器同一时间只能容纳一个元素,完全符合你的需求。

内容的提问来源于stack exchange,提问作者user8512043

火山引擎 最新活动