如何防止 d3.drag().on('end' 触发 .on('click'

2024-01-18

我有一个 svg 元素,我希望能够单独单击和拖动。据我所知在 D3 中,单击会触发“拖动结束”事件(也可能拖启动?)。在下面的代码中,只需单击圆圈即可为其显示红色轮廓:

var svg = d3.select('body').append('svg');
var g = svg.append('g');

var c = g.append('circle').attr('r', 20).attr('cx', 25).attr('cy', 25)
         .call(d3.drag().on('drag', dragged).on('end', end))
         .on('click', clicked);

function dragged() {
    d3.select(this).attr('fill', 'green').attr('cx', d3.event.x).attr('cy', d3.event.y);
}

function end() {
    d3.select(this).attr('fill', 'red').attr('stroke', 'red').attr('stroke-width', 5);
}

function clicked() {
    if (d3.event.defaultPrevented) return;
    d3.select(this).attr('fill', 'blue');
}

fiddle https://jsfiddle.net/hj21t40n/7/

如何注册点击回调而不触发drag.end回调?

似乎大多数有关单击和拖动的问题和块似乎都想抑制拖动时的单击操作,因此不相关。


  • d3v5.7(当前)

由于 mouseup 指示单击完成和拖动结束,您可以跳过单击事件并简单地添加一些逻辑来确定是否发生拖动:

// track action:
var wasMoved = false;

// Drag event:
function dragged() {
    d3.select(this).attr('fill', 'green').attr('cx', d3.event.x).attr('cy', d3.event.y);
    wasMoved = true; // or alternatively, measure the change in distance.
}

// Mouse up event: drag end & click:
function end() {
  if(wasMoved) {
  // It was a drag:
        d3.select(this).attr('fill', 'red').attr('stroke', 'red').attr('stroke-width', 5);
  }
  // Otherwise it was a click:
  else {
    d3.select(this).attr('fill', 'blue');
  }
  wasMoved = false; // reset for next drag.
}

现在我们只能在鼠标松开时触发一项操作:拖动结束或单击时我们想要的操作:

var svg = d3.select('body').append('svg');
var g = svg.append('g');

var drag = d3.drag().on("drag", dragged).on("end",end);

var c = g.append('circle')
  .attr('r', 20).attr('cx', 25).attr('cy', 25)
  .call(drag)

var wasMoved = false;

function dragged() {
	d3.select(this).attr('fill', 'green').attr('cx', d3.event.x).attr('cy', d3.event.y);
  wasMoved = true;
}

function end() {
  if(wasMoved) {
  // It was a drag:
		d3.select(this).attr('fill', 'red').attr('stroke', 'orange').attr('stroke-width', 5);
  }
  // It was a click:
  else {
    d3.select(this).attr('fill', 'blue');
  }
  wasMoved = false;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.0.0/d3.min.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止 d3.drag().on('end' 触发 .on('click' 的相关文章

  • 如何在 Yarn 中使用多个 npm 注册表?

    我正在尝试在我们的环境中设置 Yarn 0 17 9 但我的注册表有问题 我们目前使用两个注册中心 官方 npmjs 和我们自己的内部网络注册中心 Sinopia 问题是我们正在使用内部工具通过 registry 标志从一个或另一个中提取软
  • Javascript“this”在 IE 中丢失上下文

    以下在 firefox safari chrome 中工作正常 在 IE 中 this 似乎在 handleEvent 函数中丢失上下文 警报的结果是 object Window 这不是我想要的 当从handleEvent 输出时 this
  • 如何使用标准 JavaScript 在 CSS 转换结束后立即重新启动它?

    我构建了一种密码生成器 只要倒计时到期 它就会显示新密码 不幸的是 我只设法弄清楚如何运行我的代码一次 倒计时由一个简单的 CSS 过渡组成 我想保留它 因为它比我的其他尝试平滑得多 其中我尝试使用 JavaScript 重复更新宽度 va
  • 获取 CRM 2011 中功能区按钮的 ID

    我创建了一个 JavaScript 我想在其中隐藏功能区Reactivate Lead按钮取决于某些条件 我通过在表单上按 F12 获得了按钮的 ID 即lead NoRelationship Form Mscrm Form lead Re
  • 如何从 javascript 错误对象读取错误消息

    有人可以帮我解决以下问题吗 我正在通过 redux 操作进行后调用 如下所示 export const addEmployee firstName surname contactNumber email gt async dispatch
  • 有没有办法让 jslint 在 javascript 的下一行中使用大括号?

    我改变了我的编码风格 function getParams entity use strict var accountID store getItem AccountID switch entity case Topic to functi
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • setTimeout范围问题

    我在控制玩家重生的函数内部定义了一个 setTimeout 我正在创建一个游戏 var player death function this alive false Console log death var timer3 setTimeo
  • 纯 JS 相当于 Jquery eq()

    jquery 的纯等价物是什么eq 例如 我怎样才能实现 class1 class2 eq 0 text 1254 在纯 JavaScript 中 要获取数组中的元素索引 可以使用 在 JavaScript 中 因此 要重现您的代码 您可以
  • Angular UI-Router:多个 URL 到单一状态

    我已经开始使用 Angular 的 ui router 并且我正在尝试弄清楚如何让多个 URL 引用单个状态 例如 orgs 12354 overview retyrns the same pages as org overview 我的
  • 如何将本地文本文件上传到文本区域(网页内)

    我是一名新手程序员 需要一些帮助来弄清楚如何将本地文本文件上传到我正在构建的网站内的文本区域 我非常精通 HTML CSS 对 Javascript JQuery 有相当的了解 而且我刚刚学习 PHP 您能提供的任何帮助我将不胜感激 我有一
  • 对使用“new”创建的数组上“map”的行为感到困惑[重复]

    这个问题在这里已经有答案了 我对结果感到困惑mapping 使用创建的数组new function returnsFourteen return 14 var a new Array 4 gt undefined x 4 in Chrome
  • 在 Chrome 开发者工具中禁用调试器语句

    我正在尝试对恶意 JavaScript 进行逆向工程 当我最初加载侧面时 会注入 JS 代码 其中包括 debugger 语句并将断点注入我的 chrome 开发人员控制台 通过stackoverflow阅读 禁用所有断点does not帮
  • 在 javascript 中实现固定位置会导致 Safari 滚动时出现抖动

    固定位置不适用于我的用例 因为它固定在浏览器窗口上 您可能会处于文本在屏幕右侧之外且无法到达的状态 无论如何 我尝试使用绝对定位 然后调整javascript中的 顶部 它在 Firefox 和 Chrome 中运行良好 但在 Safari
  • 检查浏览器空闲的替代方法

    我有一个简单的网络信息亭 在鼠标未使用 jQuery 移动 30 秒后显示用户操作提示 var i null body wrap mousemove function clearTimeout i overlay fadeOut i set
  • 从请求url获取hash参数

    我有这样的网址 http www coolsite com daily plan id 1 http www coolsite com daily plan id 1解析该字符串并读取哈希值 id 之后的值 的最简单方法是什么 谢谢 在客户
  • 如何将数据推送到嵌套对象

    如何将另一个元素推入variables来自以下对象的属性 var request name Name id 3 rules name Rule name tags tagId 1 variables variable var1 matchT
  • highchart堆积柱每个类别的总数据

    我想获取每个类别的总数据 这point stackTotal只给出活动数据的总数 从我粘贴的代码示例中 我想知道每种水果的总消耗量 因此 即使我单击右上角图例上的乔的名字 这使得堆叠图表上的所有乔信息都处于非活动状态 我仍然可以知道约翰 简
  • javascript:完全删除top.location.hash?

    如果我的地址栏中已经有一个哈希值 例如domain com whatever 我打电话 top location hash wathever 被转换为domain com 没有任何内容 是否可以完全删除哈希值 所以没有 left 因为如果我
  • VS Code 扩展 - 获取完整路径

    我正在为 VS Code 编写一个插件 我需要知道调用扩展的文件的路径 无论是从编辑器上下文菜单或资源管理器上下文菜单调用还是用户只需键入扩展命令 function activate context get full path of the

随机推荐

  • 样式组件中的CSS' calc() [重复]

    这个问题在这里已经有答案了 尝试这个 const styledDiv styled div props gt props takeViewportHeight min height calc 100vh 16px 它不起作用 我是否遗漏了样
  • 警告:mysql_query(): 3 不是有效的 MySQL-Link 资源

    我遇到了这个奇怪的错误 但我不知道它来自哪里 Warning mysql query 3 is not a valid MySQL Link resource in 3号怎么了 我不明白 有没有人自己经历过这个错误 PHP 使用资源作为特殊
  • 如何在 Android 模拟器中安装 APK 文件?

    我终于成功混淆了我的 Android 应用程序 现在我想通过安装来测试它APK http en wikipedia org wiki APK 28file format 29文件并在模拟器上运行 如何在 Android 模拟器上安装 APK
  • 无法在 macOS High Sierra 上构建和安装 Valgrind

    我无法在 macOS High Sierra 上安装 Valgrind 无法通过brew 我尝试过3 10 https github com msgpack msgpack c issues 525 After make install 我
  • R语言变量冲突

    我有一个 R 脚本 它采用 R 的其他脚本并以这种方式操作它们 并且还执行它们的代码 我的脚本使用一些变量 显然 当其他脚本使用公共变量名时 我会陷入混乱 我希望我可以像在胶囊中一样执行其他脚本 这样重合的变量就不会互相影响 我一直在阅读有
  • 将冷却/计时器添加到 on_message [Discord.py]

    我最近开始用 Python 制作一个 Discord 机器人 用它测试 Python 的基础 并自己创建了一个带有多个命令的功能机器人 为了扩大其用途 我添加了一个级别 XP 系统 到目前为止该系统正在运行 bot event async
  • Nexus 7 上不显示菜单按钮

    所以我很长时间都面临这个问题 我的 Nexus 4 和 Nexus 7 都运行 Android 4 3 并且我有 targetSdkVersion 11 的应用程序 我使用 11 因为任何低于 11 的目标 sdk 都不支持我的多点触控 问
  • IE 7 和 8 中的 CSS 倾斜转换

    我有菱形样式的菜单 它使用以下代码 它在 Chrome firefox ie9 等中运行良好 但我现在需要在 IE 7 和 8 中运行 有没有办法在这些旧版浏览器上执行此操作 http jsfiddle net C7e7U http jsf
  • Django 过滤外键字段

    简洁版本 我有一个用于食谱的 Django 应用程序 并且想要过滤要发送到我的视图中的模板的数据 我基本上希望特定用户添加的所有收据都作为上下文发送 以下过滤返回错误消息以 10 为基数的 int 的文字无效 我的用户名 recipes R
  • jquery旋转图像并将它们保存为同名文件(覆盖)?

    我有一个像这样的简单场景 我想旋转图像 并将它们保存为现有的旧文件 现在 所有功能都已完成 但是当我下载 保存图像时 它总是创建新的文件名 这是我的代码 div img src image a png alt div
  • Opencv 代码慢:有问题吗?

    这是我尝试改善图像颜色的函数 它有效 但真的很慢 也许有人有更好的主意 static Mat correctColor Mat AImage Mat copyImage AImage copyTo copyImage Mat imgLab
  • FileInputStream 和 FileOutputStream 在 Java 中如何工作?

    我正在阅读有关 java 中的所有输入 输出流的信息Java 教程文档 https docs oracle com javase tutorial essential io bytestreams html 教程作者使用这个例子 impor
  • 使用 EPPlus 设置下载位置

    我正在关注This http www c sharpcorner com Blogs 47619 export to excel using epplus aspxEPPlus 上的教程 但我对如何将下载位置设置为登录用户的 下载 文件夹感
  • 获取 ScriptHandlerFactory 处理程序

    有没有办法调用 System Web Script Services ScriptHandlerFactory 类的 GetHandler 方法 该方法返回 IHttpHandler 类型对象 我知道 ScriptHandlerFactor
  • 防止 pip 安装某些依赖项

    我们正在开发一个AWS LambdaPython 中 Alexa 技能的函数并使用pip安装ask sdk打包到我们的dist 目录 pip install t dist ask sdk 问题在于 t dist 因为pip想要在那里拥有所有
  • 使用 XSLT 重新排序 xml 元素

    我有以下 xml 片段 它出现在很多地方 但 TYPE 元素出现的顺序是随机的 此外 不保证所有类型都可用 例如某些片段可能缺少 Visio 和 或 Outlook 或任何其他节点
  • 在 Oracle 中生成具有 2 个日期之间的时间间隔的行

    我有一个表格 其中给出了周日到周六的 医生开始时间 和 结束时间 我想创建 15 分钟的时段 在此基础上 患者单击日历日期时间间隔 其中显示已预订的时段 以下示例显示如何将时间分成 15 分钟的片段 它使用分层查询 一点解释 line 2
  • 当我的动画完成时,transitionend 事件不会触发

    我正在尝试使用 jQuery 在 css 动画完成时触发一个事件 并且它基本上可以正常工作 但由于某种原因transitionend直到我将鼠标从有问题的对象上移开后 事件才会被调用 方法如下 function replaceWithSea
  • 结构类型别名/无联合的标记联合

    两人 或以上 structs Base and Sub有一个共同的第一个 未命名 struct 转换 投射是否安全Base to Sub反之亦然 struct Base struct int id char data necessary s
  • 如何防止 d3.drag().on('end' 触发 .on('click'

    我有一个 svg 元素 我希望能够单独单击和拖动 据我所知在 D3 中 单击会触发 拖动结束 事件 也可能拖启动 在下面的代码中 只需单击圆圈即可为其显示红色轮廓 var svg d3 select body append svg var