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

Vis.js Timeline拖拽范围项:如何获取放置位置的起始时间

解决Vis.js Timeline拖拽范围项设置放置时间的问题

我来帮你搞定这个问题!你遇到的核心问题其实很好理解:handleDragStart是在拖拽刚开始的时候触发的,这时候还没把元素放到Timeline上,根本拿不到最终的放置时间,所以在这里设置item.start = new Date()肯定只能拿到拖拽开始的当前时间,而不是你想要的放置位置时间。

解决方案思路

我们需要把时间设置的逻辑从拖拽开始事件移到**拖拽完成(drop)**的事件里:

  1. 在拖拽开始时,只传递范围项的基础信息(id、类型、内容),不设置时间;
  2. 在drop事件中,获取放置位置的时间properties.time,再给项设置start和end(end是start加1小时),最后把项添加到Timeline的数据集中。

具体代码实现

1. 修改拖拽开始事件处理函数

function handleDragStart(event) {
  var dragSrcEl = event.target;
  event.dataTransfer.effectAllowed = 'move';
  // 只传递基础信息,暂不设置时间相关字段
  var item = { 
    id: new Date().getTime(), // 用时间戳生成唯一id
    type: 'range', 
    content: event.target.innerHTML.trim() 
  };
  event.dataTransfer.setData("text", JSON.stringify(item));
}

2. 配置Timeline的drop事件

// 假设你的Timeline实例是timeline,数据集是items(Vis.DataSet实例)
timeline.on('drop', function (properties) {
  // 解析拖拽过来的基础数据
  var draggedItem = JSON.parse(properties.dataTransfer.getData("text"));
  
  // 设置起始时间为放置位置的时间
  draggedItem.start = properties.time;
  // 设置结束时间为起始时间加1小时
  draggedItem.end = new Date(properties.time.valueOf() + 1000 * 60 * 60);
  
  // 将配置好的项添加到Timeline
  items.add(draggedItem);
});

额外注意事项

  • 确保你初始化Timeline时开启了拖拽功能:
    var timeline = new vis.Timeline(container, items, options);
    // 或者在options里设置dragDrop: true
    var options = { dragDrop: true };
    
  • 你的items必须是Vis.js的DataSet实例,这样才能用add方法添加新项。

这样修改后,拖拽的范围项就会准确以放置位置的时间作为起始时间,结束时间自动往后推1小时啦!

内容的提问来源于stack exchange,提问作者Eduardo de la Torre

火山引擎 最新活动