使用 visjs 时间线,如何获取时间线中放置的范围项目的开始时间(我放置它的位置)

Posted

技术标签:

【中文标题】使用 visjs 时间线,如何获取时间线中放置的范围项目的开始时间(我放置它的位置)【英文标题】:Using visjs timeline, how to get start time (where I drop it) of a range item dropped in timeline 【发布时间】:2020-05-16 04:46:16 【问题描述】:

vijs 时间线文档:https://visjs.github.io/vis-timeline/docs/timeline/

我正在使用这个例子: https://visjs.github.io/vis-timeline/examples/timeline/other/drag_drop.html

我想在时间轴上放置一个范围项目,并设置我放置它的开始时间和一小时后的结束时间。

我有结束时间,没问题。

我正在使用此代码

function handleDragStart(event) 
var dragSrcEl = event.target;
event.dataTransfer.effectAllowed = 'move';
var item = 
        id: new Date(),
        type: 'range',
        content: event.target.innerHTML.trim()
    ;
item.start = new Date();
item.end = new Date(1000*60*60 + (new Date()).valueOf());
event.dataTransfer.setData("text", JSON.stringify(item));

如果你看到:item.start = new Date(); 我得到的是实际时间,而不是我放下物品的时间。

我发现我可以抽出时间使用:

timeline.on('drop', function (properties) 
console.log(properties.time);

);

但我不能在函数中使用它。

【问题讨论】:

【参考方案1】:

起初这是一件很困难的事情,但我设法解决了它。以下内容可能对未来的读者有所帮助:

vis-timeline 使用的版本7.4.2

第 1 步:定义侦听器

记住:dragend 侦听器对于创建项目的准确结束时间很重要

    $('.media_elm').each(function (index, item) 
        item.addEventListener('dragstart', handleDragStart.bind(this), false);
        item.addEventListener('dragend', handleDragEnd.bind(this), false); // ***
    );

第 2 步:创建 DragStart 函数

function handleDragStart(event) 
    // Get element from event
    let element = event.target;

    // Create item
    let item = 
        id: element.id, // You should define id on the drag element(important)
        content: 'Element',
        type: 'range'
        // IMPORTANT
        // No need to define start or end time here
        // As the accurate start time automatically gets created after dropping the element on the timeline
    

    // Add item to timeline
    event.dataTransfer.setData("text", JSON.stringify(item));

第 3 步:创建 DragEndFunction

function handleDragEnd(e) 
    let element = e.target; // This is the same element as we used before
    
    // Get item data
    let itemData = prevTimeline.itemSet.items[element.id].data; // Here element id is the one which we used to create item

    // Set end time based on the start time and duration
    // This will add 5 seconds to the start time(the time where the item was dropped)
    // You can also define the duration on the drag element and then use it here
    itemData.end = moment(itemData.start).add('5', 's');

    // Update timeline data (auto refreshes)
    prevTimeline.itemsData.update(itemData);

【讨论】:

以上是关于使用 visjs 时间线,如何获取时间线中放置的范围项目的开始时间(我放置它的位置)的主要内容,如果未能解决你的问题,请参考以下文章

如何在离线地图图块中放置多个图钉并获得经纬度?

在 WPF 的菜单中放置分隔线

可见时间线嵌套组背景整行

Vis js时间线范围元素自定义绘制

如何使用 AppCompatActivity 和 Fabric 来获取时间线?

如何使用python从用户时间线twitter检索/查找tweet上的特定文本