You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jquery Sortable实现任务克隆至多周目标列的技术问询

解决方案:通过识别悬浮目标容器实现动态克隆任务

你的需求是将侧边任务克隆到指定的周日期列,现有通过光标位置判断的方法虽然可行,但确实存在依赖固定像素宽度、响应式场景下易失效的问题。其实可以利用jQuery UI Sortable自带的事件来直接识别当前悬浮的目标容器,这个方法更灵活且易于维护。

改进思路

核心是通过over事件记录拖拽元素当前悬浮的目标容器,在remove事件中直接使用这个记录的容器作为appendTo的目标,完全不需要硬写像素范围判断。

优化后的代码

function sortable() {
  // 声明变量存储当前悬浮的目标容器
  let targetContainer = null;

  // 侧边任务列的可拖拽配置
  $("#sort1, #sort2, #sort3").sortable({
    connectWith: ".connectedSortable",
    // 当拖拽元素进入目标容器时,记录该容器
    over: function(event, ui) {
      // 只记录sort4-sort10这些周日期列
      const currentContainer = ui.item.closest("#sort4, #sort5, #sort6, #sort7, #sort8, #sort9, #sort10");
      if (currentContainer.length) {
        targetContainer = currentContainer;
      }
    },
    // 当拖拽元素离开容器时,清空记录(避免残留错误目标)
    out: function() {
      targetContainer = null;
    },
    remove: function(event, ui) {
      // 如果有记录的目标容器,就克隆到该容器;否则设置默认处理
      if (targetContainer) {
        ui.item.clone().appendTo(targetContainer);
      } else {
        // 可选:拖拽到容器外时的默认行为,比如克隆到第一个周列
        ui.item.clone().appendTo('#sort4');
      }
      $(this).sortable('cancel');
    }
  }).disableSelection();

  // 周日期列间的拖拽配置
  $("#sort4, #sort5, #sort6, #sort7, #sort8, #sort9, #sort10").sortable({
    connectWith: ".connectedSortable"
  }).disableSelection();
};

方案优势对比

  • 更灵活:不依赖固定的容器宽度,即使页面是响应式布局(比如容器宽度随屏幕尺寸变化),代码依然能正常工作
  • 更准确:直接通过DOM元素识别目标,避免光标位置判断可能出现的误差(比如容器有内边距、边框时的计算偏差)
  • 更易维护:不需要修改像素数值,后续新增或调整周列时,只需修改选择器即可

补充说明

如果需要支持拖拽到多个列(比如按住Ctrl键同时拖拽到多个列),可以扩展这个思路:通过监听键盘事件记录多选状态,在over事件中收集多个目标容器,最后批量克隆。不过从你的需求描述看,当前的方案已经能满足"克隆到一个或多个"的基础场景,如果需要多选可以再进一步调整。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:47:19