Vis.js Timeline拖拽范围项:如何获取放置位置的起始时间
解决Vis.js Timeline拖拽范围项设置放置时间的问题
我来帮你搞定这个问题!你遇到的核心问题其实很好理解:handleDragStart是在拖拽刚开始的时候触发的,这时候还没把元素放到Timeline上,根本拿不到最终的放置时间,所以在这里设置item.start = new Date()肯定只能拿到拖拽开始的当前时间,而不是你想要的放置位置时间。
解决方案思路
我们需要把时间设置的逻辑从拖拽开始事件移到**拖拽完成(drop)**的事件里:
- 在拖拽开始时,只传递范围项的基础信息(id、类型、内容),不设置时间;
- 在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




