首页/新闻资讯/正文详情

Cytoscape.js 核心事件 API:深入掌握 cy.one() 一次性事件监听

发布时间:2026/9/24 7:52:44 来源:云帆数科 栏目:资讯中心
Cytoscape.js 核心事件 API:深入掌握 cy.one() 一次性事件监听
数据可视化【免费下载链接】cytoscape.jsGraph theory (network) library for visualisation and analysis项目地址https://gitcode.com/gh_mirrors/cy/cytoscape.js点击查看免费下载导读cy.one()是 Cytoscape.js 核心对象core提供的一次性事件监听方法它为指定事件注册一个回调该回调最多只触发一次触发后即被自动移除。本文以 documentation/md/core/one.md 为主线结合 src/core/events.mjs、src/emitter.mjs 等源码实现系统讲解cy.one()的用法、参数、事件选择器、命名空间、别名方法及其与cy.on()、cy.pon()的关系并给出可直接运行的实战示例帮助你精准控制事件生命周期。1. cy.one() 是什么一次性事件监听在 Cytoscape.js 中core 对象是访问图数据与交互能力的入口参见 core 概述。与持续监听的cy.on()不同cy.one()注册的处理器在首次命中事件后自动解除绑定后续相同事件再次发生时不再回调。cy.one(tap, node, function(){ console.log(tap!); }); cy.$(node).eq(0).trigger(tap); // tap! cy.$(node).eq(1).trigger(tap); // nothing b/c already tapped上面这段来自官方文档的示例完整展示了两种典型行为第一次对节点触发tap时回调执行并打印tap!第二次触发时由于该一次性处理器已被移除控制台不再有任何输出。该行为在 src/core/events.mjs 中由one()实现one: function( events, selector, callback ){ this.emitter().one( events, argSelector(selector), callback ); return this; },注意cy.one()返回 core 自身因此支持链式调用。同时 core 还提供了once()作为one()的别名见 src/core/events.mjs二者行为完全一致。2. 方法签名与参数说明cy.one( events, selector, callback )与cy.on()的签名完全兼容均支持以下参数参数类型说明是否必填eventsString事件类型字符串可包含命名空间如tap、tap.foo多个事件用空格分隔如tap dbltap是selectorString | null可选的元素选择器用于过滤从元素冒泡到 core 的事件传入null或省略时监听所有事件否callbackFunction事件触发时执行的回调函数接收事件对象为第一个参数是events字符串的解析逻辑在 src/emitter.mjs 中定义内部通过正则^([^.])(\.(?:[^.]))?$拆分出事件类型与命名空间。也就是说cy.one(tap.foo, ...)注册的是命名空间为foo的tap事件这类事件可以通过removeListener按命名空间精确移除详见下文第 5 节。3. 结合选择器过滤冒泡事件Cytoscape.js 的图事件遵循事件冒泡机制元素上发生的事件会先冒泡到其复合父节点最终冒泡到 core见 事件冒泡说明。因此cy.one()的selector参数用于在 core 层面过滤来源——只响应来自匹配该选择器的元素的事件。例如只想监听「来自node类型元素」的首次点击cy.one(tap, node, function(evt){ var node evt.target; // 事件来源元素 console.log(tapped node.id()); });也可以进一步收窄到具体 id 或样式条件比如只响应#foo节点或[weight 100]的边。选择器匹配的底层实现在 src/core/events.mjs当监听器带有qualifier即 selector时eventMatches会要求事件目标必须是元素且满足selector.matches(eventObj.target)同时回调的this上下文会被绑定到事件来源元素而非 core 本身——这一点与带选择器的cy.on()完全一致便于直接在回调里操作触发事件的元素。对应地元素集合上也提供eles.one()与eles.once()一次性监听见 src/collection/events.mjs区别在于eles.one()会为集合中每个元素分别注册一次性监听eles.once()则借助onceCollection在首次触发时从集合上统一移除两者细节略有差异但使用方式相同。4. 事件对象回调中能拿到什么cy.one()回调的第一个参数是标准事件对象参见 事件对象字段说明常用字段包括cy对应的 Cytoscape.js core 实例引用target事件的起源者——可能是某个元素也可能是 core 自身背景被点击时type事件类型字符串如tapnamespace事件命名空间字符串如footimeStamp事件发生的 Unix 毫秒时间戳。对于用户输入类事件还额外携带position模型坐标、renderedPosition渲染坐标与originalEvent原生事件对象。结合target与选择器可以区分「点击了节点」与「点击了空白背景」cy.one(tap, function(evt){ if (evt.target cy) { console.log(点击了背景仅响应一次); } else { console.log(点击了元素 evt.target.id() 仅响应一次); } });5. 与 on / pon / removeListener 的分工协作5.1cy.on()持续监听cy.on()注册的事件会持续生效直到被removeListener显式移除或实例销毁。若某段逻辑需要持续响应事件应使用 cy.on() 文档 中的写法cy.on(tap, node, function(evt){ var node evt.target; console.log(tapped node.id()); });5.2cy.pon()Promise 化的一次性监听如果希望在「首次事件到来」时获得一个 Promise例如把初始化逻辑编排进异步流程可使用cy.pon()/cy.promiseOn()见 cy.promiseOn() 文档cy.pon(tap).then(function( event ){ console.log(tap promise fulfilled); });从实现看pon本质上是one的 Promise 包装它在 src/define/events.mjs 中注册一次性回调事件触发时先解除绑定再resolve事件对象因此每个 Promise 只会被兑现一次。5.3cy.removeListener()按需解除即使是一次性监听也常需要「反悔」的场景。cy.removeListener()支持按事件类型、命名空间、选择器与回调函数组合精确移除见 cy.removeListener() 文档// 移除所有 tap 监听含一次性监听 cy.removeListener(tap); // 只移除指定的那个 handler var handler function(){ console.log(called handler); }; cy.one(tap, handler); cy.removeListener(tap, handler);其匹配逻辑见 src/emitter.mjs仅当事件类型或使用通配符*、命名空间、qualifier 与 callback 均匹配时才删除若在事件分发过程中移除监听器内部会先拷贝监听列表emitting ! 0时避免迭代过程中数组变动引发错乱。5.4cy.emit()手动触发事件cy.emit()用于手动派发事件并携带附加参数见 cy.emit() 文档可用于测试一次性监听逻辑或驱动自定义事件cy.on(tap, function(evt, f, b){ console.log(tap, f, b); }); cy.emit(tap, [foo, bar]);同样地cy.one()注册的监听也会被cy.emit()触发一次后自动移除因此可以用它快速验证一次性行为。5.5 方法别名一览src/define/events.mjs 为上述 API 提供了便捷别名方便不同习惯的开发者使用标准方法别名onaddListener、listen、bindremoveListeneroff、unlisten、unbindemittriggerone/once—core 上once即onepromiseOnpon6. 一次性监听的源码原理one 标志位与自动清理理解cy.one()为什么「只触发一次」关键在于 src/emitter.mjs 的两处实现注册阶段——p.one复用p.on并注入{ one: true }配置src/emitter.mjsp.one function( events, qualifier, callback, conf ){ return this.on( events, qualifier, callback, conf, { one: true } ); };派发阶段——在真正调用回调之前若监听器带有one标志先从监听器列表中剔除自身src/emitter.mjsif( listener.conf listener.conf.one ){ self.listeners self.listeners.filter( l l ! listener ); }这意味着「自动移除」发生在回调执行之前即使回调内部再次触发同一事件也不会产生递归式重复调用。这种设计让cy.one()天然适合初始化钩子、引导提示、一次性动画启动等只应执行一次的交互逻辑。7. 实战场景示例7.1 首次点击后才开始初始化利用cy.one(ready)在实例就绪后执行一次性初始化源码内部也大量采用这一模式如 src/core/index.mjs 中通过cy.one(layoutready, ...)链式编排初始化流程const cy cytoscape({ container: document.getElementById(cy), elements: [ /* 节点与边数据 */ ] }); cy.one(ready, function(){ console.log(实例已就绪开始初始化业务逻辑); cy.layout({ name: cose }).run(); });7.2 首次命中节点后显示引导提示cy.one(tap, node, function(evt){ showTooltip(你已经点击了节点 evt.target.id() 接下来可以拖拽它试试); });7.3 等待下一次渲染完成再导出图片cy.one(render, function(){ console.log(渲染完成可以调用 cy.png() 导出截图); cy.png({ full: true, scale: 2 }); });8. 小结cy.one()是 Cytoscape.js 事件体系中最常用的「一次性钩子」与cy.on()共用相同的(events, selector, callback)签名与选择器冒泡过滤机制通过 emitter 层的one标志位在回调执行前自动解除绑定保证只触发一次与cy.pon()Promise 化、cy.removeListener()精确解绑、cy.emit()手动触发组合可覆盖绝大多数事件生命周期管理需求相关实现与文档可在 src/core/events.mjs、src/emitter.mjs、src/collection/events.mjs 及 documentation/md/events.md 中进一步查阅。在「初始化一次」「首次交互引导」「等待某状态就绪」等场景下优先考虑cy.one()能让代码更简洁、行为更可预期。赞分享数据可视化【免费下载链接】cytoscape.jsGraph theory (network) library for visualisation and analysis项目地址https://gitcode.com/gh_mirrors/cy/cytoscape.js点击查看免费下载相关推荐cytoscape.js 事件 Promise 化深入解析 promiseOn() 与 pon() 的一次性事件监听机制cytoscape.js 事件 Promise 化深入解析 promiseOn 与 pon 的一次性事件监听机制 导读 本文围绕 cytoscape.js 的数据可视化Cytoscape.js 核心事件监听 cy.on() 完全指南事件绑定、冒泡与实战用法Cytoscape.js 核心事件监听 cy.on 完全指南事件绑定、冒泡与实战用法 Cytoscape.js 是一个用于图可视化与分析的图论网络库。在交数据可视化Playwright 事件系统详解等待事件、监听器增删与一次性监听器Playwright 事件系统详解等待事件、监听器增删与一次性监听器 Playwright 提供了一套统一的“事件驱动”编程模型页面上的网络请求、弹窗po测试开发工具浏览器控制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

树莓派串口全解析:UART、SPI、I2C与GPIO配置实战指南
树莓派串口全解析:UART、SPI、I2C与GPIO配置实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:52:38

QPLCR3S电桥镊子:μΩ级四线制阻抗测量DIY指南
QPLCR3S电桥镊子:μΩ级四线制阻抗测量DIY指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:52:38

PADS无模命令大全:20个隐藏技巧让PCB布线效率翻倍
PADS无模命令大全:20个隐藏技巧让PCB布线效率翻倍

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 7:52:32

PaddleSpeech 流式 TTS 在线引擎(Python 动态图后端)源码级解析与实战指南
PaddleSpeech 流式 TTS 在线引擎(Python 动态图后端)源码级解析与实战指南

人工智能语音音频 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword… · 2026/9/24 14:47:11

Sonnet 2 开发指南:基于 TensorFlow 2 的模块化神经网络库核心用法与序列化实战
Sonnet 2 开发指南:基于 TensorFlow 2 的模块化神经网络库核心用法与序列化实战

深度学习机器学习 【免费下载链接】sonnet TensorFlow-based neural network library 项目地址: https://gitcode.com/gh_mirrors/so/sonnet 点击查看 免费下载 Sonnet 是 DeepMind 设计并构建、运行在 TensorFlow 2 之上的神经网络库,其核心目标是提供… · 2026/9/24 14:47:04

easing-functions-cj API 参考大全:Skill 枚举、getMethod() 与 calculate() 每个参数逐条精讲
easing-functions-cj API 参考大全:Skill 枚举、getMethod() 与 calculate() 每个参数逐条精讲

easing-functions-cj API 参考大全:Skill 枚举、getMethod() 与 calculate() 每个参数逐条精讲 【免费下载链接】easing-functions-cj 一个基于缓动函数的动画UI组件库 项目地址: https://gitcode.com/Cangjie-TPC/easing-functions-cj easing-functions-cj … · 2026/9/24 14:47:04

PDF 补丁丁:免费编辑 PDF 书签、合并文档与解除限制的完整指南
PDF 补丁丁:免费编辑 PDF 书签、合并文档与解除限制的完整指南

PDF 补丁丁:免费编辑 PDF 书签、合并文档与解除限制的完整指南 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: ht… · 2026/9/24 14:47:04

EasyWeChat 3.x 用户分组(User Group)管理实战:获取、增删改查与批量移动用户完整 API 指南
EasyWeChat 3.x 用户分组(User Group)管理实战:获取、增删改查与批量移动用户完整 API 指南

后端即时通讯 【免费下载链接】easywechat 📦 一个 PHP 微信 SDK 项目地址: https://gitcode.com/gh_mirrors/ea/easywechat 点击查看 免费下载 导读 用户分组是微信公众号后台用户管理的基础能力之一,用于按自定义维度(如地区、… · 2026/9/24 14:47:04

Koin for Compose 实战指南:Jetpack Compose 与 Compose Multiplatform 依赖注入全解析
Koin for Compose 实战指南:Jetpack Compose 与 Compose Multiplatform 依赖注入全解析

Koin for Compose 实战指南:Jetpack Compose 与 Compose Multiplatform 依赖注入全解析 【免费下载链接】koin Koin - a pragmatic lightweight dependency injection framework for Kotlin & Kotlin Multiplatform 项目地址: https://gitcode.com/gh_mirrors… · 2026/9/24 14:47:01

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码