d3.js 中拖动后(有时)单击事件未触发

2024-05-04

观察到的行为

我正在使用 d3.js,并且我想根据以下情况更新一些数据drag https://github.com/mbostock/d3/wiki/Drag-Behavior#wiki-on事件,并重绘事件之后的所有内容dragend https://github.com/mbostock/d3/wiki/Drag-Behavior#wiki-on事件。可拖动的项目也有一些click行为。

可拖动项目只能沿 x 轴移动。当拖动项目时,并且光标位于可拖动项目的正上方dragend/mouseup,该项目在重新绘制后必须单击两次click触发事件。当一个项目被拖动时,但是dragend/mouseup不直接出现在该项目的上方,click重绘后,事件按预期触发(第一次尝试)。

期望的行为

我想要click事件始终在拖动后第一次单击时触发,无论光标位于何处。

如果我更换click可拖动项目上的事件mouseup事件,一切都按预期进行,但是click这是我真正想处理的事件。

示范

这是一个独立的示例:http://jsfiddle.net/RRCyq/2/ http://jsfiddle.net/RRCyq/2/

这是相关的 JavaScript 代码:

var data, click_count,did_drag;
// this is the data I'd like to render
data = [
    {x : 100, y : 150},
    {x : 200, y : 250}
];
// these are some elements I'm using for debugging
click_count = d3.select('#click-count');
did_drag = d3.select('#did-drag');

function draw() {
    var drag_behavior,dragged = false;

    // clear all circles from the svg element
    d3.select('#test').selectAll('circle')
        .remove();

    drag_behavior = d3.behavior.drag()
        .origin(Object)
        .on("drag", function(d) {
            // indicate that dragging has occurred
            dragged = true;
            // update the data
            d.x = d3.event.x;
            // update the display
            d3.select(this).attr('cx',d.x);
        }).on('dragend',function() {
            // data has been updated. redraw.
            if(dragged) { draw(); }
        });

    d3.select('#test').selectAll('circle')
        .data(data)
        .enter()
        .append('circle')
        .attr('cx',function(d) { return d.x; })
        .attr('cy',function(d) { return d.y; })
        .attr('r',20)
        .on('click',function() {
            did_drag.text(dragged.toString());
            if(!dragged) {
                // increment the click counter
                click_count.text(parseInt(click_count.text()) + 1);
            }
        }).call(drag_behavior);
}

draw();

聚会有点晚了,但是……

文档建议您使用d3.event.defaultPrevented在你的click事件来了解元素是否刚刚被拖动。如果你把它与你的结合起来drag and dragend事件,一个更简洁的方法是在必要时调用您想要的确切函数(参见何时以及如何flashRect叫做):

http://jsfiddle.net/langdonx/fE5gN/ http://jsfiddle.net/langdonx/fE5gN/

var container,
    rect,
    dragBehavior,
    wasDragged = false;

container = d3.select('svg')
    .append('g');

rect = container.append('rect')
    .attr('width', 100)
    .attr('height', 100);

dragBehavior = d3.behavior.drag()
    .on('dragstart', onDragStart)
    .on('drag', onDrag)
    .on('dragend', onDragEnd);

container
    .call(dragBehavior)
    .on('click', onClick);

function flashRect() {
    rect.attr('fill', 'red').transition().attr('fill', 'black');
}

function onDragStart() {
    console.log('onDragStart');
}

function onDrag() {
    console.log('onDrag');

    var x = (d3.event.sourceEvent.pageX - 50);

    container.attr('transform', 'translate(' + x + ')');

    wasDragged = true;
}

function onDragEnd() {
    if (wasDragged === true) {
        console.log('onDragEnd');

        // always do this on drag end
        flashRect();
    }

    wasDragged = false;
}

function onClick(d) {
    if (d3.event.defaultPrevented === false) {
        console.log('onClick');

        // only do this on click if we didn't just finish dragging
        flashRect();
    }
}

我不喜欢全局变量,所以我修改为使用数据:http://jsfiddle.net/langdonx/fE5gN/1/ http://jsfiddle.net/langdonx/fE5gN/1/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3.js 中拖动后(有时)单击事件未触发 的相关文章

  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 如何在“object”标签内选择 SVG?

    HTML 页面的内容如下所示 方法如下script js looks var tooltip d3 select body append div style position absolute sty
  • 如何在 Angular 2 中实现 D3

    我想将这段代码从 d3 js 实现到 Angular 2 组件 但我不知道如何将 js 文件调用到组件 ts 文件中 我找到了一些折线图的代码 包括index html和lineChart js 我怎样才能调用javascriptngAft
  • D3.js - 更改鼠标悬停时元素的不透明度 IF 条件 = false

    我正在制作一个带有过滤器的交互式 D3 js 图表 当用户单击选定的复选框时 该过滤器会显示点 此外 在鼠标悬停事件上 所选点旁边将出现一个弹出窗口 其中包含一些信息 由于图表上的点数量相对较多 因此我选择在取消选中相应复选框时使相关点变得
  • 如何运行 Mike Bostock 的 D3 示例?

    我一直在尝试经营迈克博斯托克透视地球仪 http bl ocks org mbostock 6747043例如 但是如果您尝试在本地重现它 则对其 json 文件的引用是不正确的 问题来自于这行代码 d3 json mbostock raw
  • d3 v4 使用 TypeScript 进行拖放

    我正在使用 D3 库 v4 和 Angular2 我想拖放 svg 元素 我有一个代码 item call d3 drag on start dragStarted on drag dragged on end dragEnded and
  • 使 D3 响应式:viewBox 与 resize()?

    我必须构建在平板电脑 桌面显示器以及某些情况下非常大的 4k 高分辨率影院尺寸显示器上都能正常运行的 d3 可视化效果 因此 我试图找出使用 SVG 的 viewBox 属性和 preserveaspectratio 与调用调整大小函数以在
  • d3.js 强制布局是否允许动态 linkDistance?

    我使用力布局来表示有向未加权网络 我的灵感来自以下例子 http bl ocks org mbostock 1153292 http bl ocks org mbostock 1153292 我的问题是 在我的情况下 节点之间有更多的链接
  • 在 d3.js 中换行长文本

    我想将长文本元素换行为宽度 这里的例子取自博斯托克的wrap功能 http bl ocks org mbostock 7555321 但似乎有两个问题 首先 wrap的结果没有继承元素的x值 文本左移 其次它绕在同一条线上 并且lineHe
  • d3js 折线图——如何将最后一步延伸到范围末尾?

    很简单 但我无法摆脱这个问题 线是两点 值 之间的链接 从值 A 绘制到值 B 因此 假设 A 的值为 10 B 的值为 20 而 C 缺失 现在从 0 到 10 到 20 的线已经绘制完毕 我想画从 0 到 10 到 20 到 25 的线
  • 如何在 d3.js 中填充 svg 圆圈内的图像

    这是我在 svg 中填充圆圈的代码 var svgContainer d3 select body append svg attr width 1000 attr height 1000 var circles svgContainer s
  • d3 序数尺度的映射

    我正在使用 D3 的序数比例将数字映射到颜色 我用过这个 color d3 scale ordinal range 1f77b4 ff7f0e 2ca02c d62728 9467bd 8c564b e377c2 domain 0 6 co
  • 如何在 d3.js 中的节点上制作双击事件?

    我想在节点上进行双击事件 所以我尝试了 on dbclick function d return http google com and bind dbclick function d alert hello 但一切都失败了 谁能帮我 完整
  • 如果满足条件,则在另一个转换期间添加并发转换

    我试图在转换运行时添加一个新的转换 条件是如果 bar1 宽度与 bar2 匹配 则条形会更改位置 我使用了transition tween来查看是否满足条件 当第二个转换开始时 第一个转换停止 我希望第一个转换继续运行直到其持续时间结束
  • 时间序列折线图与轴不同步

    本实验基于这个d3官方例子 http bost ocks org mike path 我想要实现的是可视化时间序列数据的最后 x 分钟 我有这个代码的副本jsfiddle http jsfiddle net 225dC 3 单击以添加新数据
  • svg / d3.js 矩形一侧的圆角

    我知道 svg 有一个内置函数可以做圆角 但我只需要在四个角中的 2 个上做圆角 我知道我可以在彼此之上绘制多个矩形来模仿这一点 但这看起来有点俗气 有什么方法可以使用剪辑或任何 d3 js 方法来做到这一点吗 现在我有一个水平条形图 其中
  • D3.js折线图溢出边距

    我有 d3 js 折线图 它作为 angular js 应用程序的指令包含在内 动态添加的线和 xAxis 以及缩放线上的边距溢出 我必须在图的顶部为每条加载的线创建 Ox 轴 并具有 Ox 和 Oy 单独的缩放可能性 Oy 缩放工作正常
  • d3.js - 具有树形布局,如何更改 X 轴以使用 D3 中的时间刻度?

    我有这个树布局 需要它在 X 轴上使用时间刻度来将节点固定为日期 另外 我需要保留根节点 它有一个is rootJSON 数据中的属性 在时间范围之外 Here http codepen io anon pen kIJxo是具有树布局工作的
  • 需要帮助从数组中为国家/地区着色,保留其余默认颜色

    我需要一些帮助从我创建的数组中获取数据 然后仅对数组中存在的国家 地区进行着色 而不在数组中的其余国家 地区我希望保留为默认颜色 我正在使用 D3 来完成所有这些工作 并且我非常确定我可以通过 D3 实现我需要的目标 但不确定如何实现 我想
  • 显示具有多个父代的 D3 树

    我目前有this http bl ocks org mbostock 4339083图已实现 我希望在描述具有多个父节点的子节点时保持结构和可折叠性 有没有办法做到这一点 我研究了力图 但我也想保留一组层次结构 这意味着 1 级的父级可以有

随机推荐

  • 如何保证auto_increment数字没有间隙?

    我有一个关于自动递增的问题 这是我的表 我首先拥有它 它可以顺利地递增 id id name 1 name1 2 name2 3 name3 4 name4 5 name5 6 name6 但是当我删除一条记录并插入一条新记录时 id从7开
  • bash while 循环线程

    我有一个 while 循环读取来自 a 的行 hosts while read line do ip line check done lt hosts 我的问题是我可以使用某种方法来加快速度 或者一次在 10 个主机上运行检查 每个检查都在
  • Firebase BigQuery 导出 - 历史数据

    当我尝试在 BigQuery 上搜索事件的历史数据时 我只能找到上周的事件 我无法在任何地方找到信息是否正确 或者我做错了什么 基本上我似乎只能查询过去一周的 events YYYYMMDD 它是否正确 您是否有机会在一周前从 Fireba
  • 如何找到 Rails 中的当前路线?

    我需要知道 Rails 中过滤器中的当前路线 我怎样才能知道它是什么 我正在处理 REST 资源 但没有看到命名路由 如果您尝试对视图中的某些内容进行特殊处理 您可以使用current page as in 或者一个动作和ID 或命名路线
  • 使用 PHP 将图像中的一种颜色替换为另一种颜色

    有人可以帮我编写一个简单的脚本 使用 PHP 将图像中的特定颜色替换为另一种颜色吗 这是一个示例 颜色从绿色变为黄色 如果你的意思是在 PHP 中使用 GD 库 你应该检查一下图像过滤器 http php net manual en fun
  • Chart.JS 工具提示回调标签和标题 (v3.5)

    请注意 v2 有很多答案 这是 v3 的 我正在尝试设置工具提示label and title对于圆环图 Code Create the donut chart donut new Chart questions positivity do
  • 为一列中的多行生成不同的随机数

    我得到了一列带有整数值 n 行 的列 我想生成满足特定条件的值的正态分布范围内的随机数 我尝试使用下面的代码 但它们太慢了 df members bd df members bd apply lambda x np random norma
  • Typescript,返回元组的通用可变参数工厂函数

    在打字稿中 可以像这样创建工厂函数 并定义返回类型 function factory1
  • 如何从实体框架获取模式名称?

    我有以下代码 using WdmEntities context new WdmEntities get object models from context ObjectContext objContext IObjectContextA
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 在不可为空的列中忽略默认值

    我正在尝试使用以下 SQL alchemy 脚本在表中创建一个新的布尔型 不可空列 默认值 True from sqlalchemy import MetaData Table Boolean Column def upgrade migr
  • C# - 具有属性和节点值的 Xml 元素

    我有一些需要反序列化为对象的 Xml XML 是
  • 提交登录表单后关闭 Fancybox 模式窗口并重新加载页面

    我在 FancyBox 2 模式 iframe 窗口中打开了一个登录表单 但是 当您提交表单时 网页将在模式中打开 谁能告诉我是否以及如何使 Fancybox 模式关闭 并在提交登录表单时重新加载底层页面 这是我当前的代码 在functio
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • IntelliJ 2017.1.2 GOLANG 调试不适用于包中的断点

    我的应用程序由一个 main go 文件和一些包组成 当在 main go 中命中断点时 IntelliJ 按预期工作 显示变量值等 但是 当在不同的包中设置断点时 除了被命中之外 不会显示任何变量 并且不会跳过 进入功能按预期工作 被击中
  • Android 设备有方形屏幕吗?

    我正在为 Android 编写一个游戏 我自己布局游戏屏幕 处理垂直和水平方向 如果宽度和高度相同 则没有做任何事情 有人知道至少有一款 Android 设备具有完美的方形屏幕分辨率吗 The MotoACTV https motoactv
  • Keras 中的 model.fit() 和 model.evaluate() 有什么区别?

    我使用 Keras 和 TensorFlow 后端来训练 CNN 模型 之间是什么model fit and model evaluate 我应该最好使用哪一种 我在用model fit 截至目前 我知道的用处model fit and m
  • 在猫鼬的整个应用程序中共享数据库连接

    使用最新的 mongoose 更新 您不能再像我以前那样进行用户建模 我需要在整个应用程序中共享相同的数据库连接 https github com LearnBoost mongoose issues 1249 https github c
  • 按位置对 MultiIndex pandas DataFrame 进行切片

    我目前正在尝试按位置对具有三个级别的多索引数据帧进行切片 我正在使用熊猫 19 1 Level0 Level1 Level2 Value 03 00368 A Item111 6 9 03 00368 A Item333 19 2 03 0
  • d3.js 中拖动后(有时)单击事件未触发

    观察到的行为 我正在使用 d3 js 并且我想根据以下情况更新一些数据drag https github com mbostock d3 wiki Drag Behavior wiki on事件 并重绘事件之后的所有内容dragend ht