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),仅供参考

相关新闻

软件定制开发全链路实战指南

软件定制开发全链路实战指南

在实际的软件交付过程中,我们常遇到一种尴尬局面:业务方提出的需求模糊且多变,而技术团队往往急于投入编码,导致项目后期频繁返工,甚至交付成果与预期大相径庭。这种“边做边改”的模式不仅消耗了大量开发资源&#xf…

2026/9/24 7:53:17 阅读更多 →
PaddleHub ResNeXt50_vd_64x4d 图像分类模型实战:从安装、命令行预测到 Python API 调用

PaddleHub ResNeXt50_vd_64x4d 图像分类模型实战:从安装、命令行预测到 Python API 调用

人工智能大模型微调模型推理服务 【免费下载链接】PaddleFormers PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers 点击查看 免费下载 本篇…

2026/9/24 7:53:17 阅读更多 →
环境硕士论文 AI 工具实测:臭氧污染课题开题、初稿生成、论文润色、答辩 PPT 制作方案

环境硕士论文 AI 工具实测:臭氧污染课题开题、初稿生成、论文润色、答辩 PPT 制作方案

环境专业硕士做臭氧污染方向课题,几乎都会遇到一套连环难题:开题阶段难以搭建完整研究框架,文献综述需要梳理大量光化学污染、VOCs-NOx 敏感性、区域传输等中外文献;写完初稿后,论文语句生硬、学术表达不规范&#xff…

2026/9/24 7:53:17 阅读更多 →

最新新闻

哺乳动物瞬时蛋白表达|CHO细胞蛋白表达|HEK293细胞蛋白表达

哺乳动物瞬时蛋白表达|CHO细胞蛋白表达|HEK293细胞蛋白表达

哺乳动物瞬时蛋白表达(Transient Gene Expression, TGE)是通过将目标基因导入哺乳动物细胞,实现短时期内重组蛋白表达的方法。相比于稳定表达系统,TGE省略克隆筛选等冗长步骤,具备快速、高效的优点,尤其适用…

2026/9/24 8:33:52 阅读更多 →
OTN技术体系详解:帧结构、映射交叉与保护调测实践

OTN技术体系详解:帧结构、映射交叉与保护调测实践

/* 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 8:33:52 阅读更多 →
边缘计算服务:原理、技术价值与典型应用场景解析

边缘计算服务:原理、技术价值与典型应用场景解析

/* 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 8:33:52 阅读更多 →
十年iOS开发实战总结:从Objective-C到SwiftUI的技术演进与踩坑指南

十年iOS开发实战总结:从Objective-C到SwiftUI的技术演进与踩坑指南

/* 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 8:33:52 阅读更多 →
AI编码助手迁移与Windows自动化打包实践:从ZCode到DeepSeek Harness

AI编码助手迁移与Windows自动化打包实践:从ZCode到DeepSeek Harness

/* 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 8:32:51 阅读更多 →
高压超充桩安全防线:热管理、绝缘监测与运维实战

高压超充桩安全防线:热管理、绝缘监测与运维实战

/* 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 8:32:51 阅读更多 →

日新闻

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

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

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

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →