cytoscape.js 元素解锁完全指南:eles.unlock() 与元素锁定机制深入解析
数据可视化【免费下载链接】cytoscape.jsGraph theory (network) library for visualisation and analysis项目地址https://gitcode.com/gh_mirrors/cy/cytoscape.js点击查看免费下载unlock()是 cytoscape.js 集合 API 中用于解除元素锁定的核心方法调用后节点/边恢复可移动状态可被拖拽、由布局重新定位。本文围绕 documentation/md/collection/unlock.md 给出的用法示例结合源码 switch-functions.mjs、position.mjs 与相关测试系统讲解unlock()的调用方式、底层实现、事件行为及其与lock()、locked()、:unlocked选择器、autolock全局配置的协作关系读完即可在项目中熟练运用元素锁定/解锁机制。一、unlock() 快速上手原文档 unlock.md 给出的用法非常直观cy.$(#j).unlock();cy.$(#j)通过 ID 选择器#j获取单个元素的集合collection对其调用unlock()即可解除该元素的锁定状态。unlock()是集合级方法作用于集合中的每一个元素因此也支持批量解锁// 解锁所有节点 cy.nodes().unlock(); // 解锁满足自定义条件的元素 cy.$(node[weight 10]).unlock(); // 解锁同时保留链式调用 cy.$(#j).unlock().addClass(moved);unlock()会返回调用它的集合本身即返回this因此可以继续链式调用其他集合方法。同时它也会对集合中的元素批量生效这与select()、grabify()等开关型方法的行为一致。二、锁定三兄弟lock() / unlock() / locked()在 cytoscape.js 中锁定状态是每个元素的内部布尔属性由三组方法共同管理方法作用返回ele.lock()锁定元素使其无法被移动集合自身链式ele.unlock()解锁元素使其恢复可移动集合自身链式ele.locked()查询元素当前是否处于锁定状态布尔值这三个方法并非各写各的实现而是由 src/collection/switch-functions.mjs 中的工厂函数defineSwitchSet统一生成defineSwitchSet( { field: locked, overrideField: function( ele ){ return ele.cy().autolock() ? true : undefined; }, on: lock, off: unlock } );从源码结构看defineSwitchSet会做三件事生成读取方法locked()返回ele._private.locked生成开方法lock()把_private.locked置为true生成关方法unlock()把_private.locked置为false。值得注意的是overrideField如果图实例开启了autolock()自动锁定locked()会直接返回true此时即使某个元素内部状态是解锁的查询结果也表现为锁定——这是全局配置对个体状态的覆盖详见下文第七节。同一套defineSwitchSet机制还派生了grabify/ungrabifygrabbable、select/unselectselected、selectify/unselectifyselectable、activate/unactivateactive、panify/unpanifypannable等成对方法unlock()与它们共享同一套状态切换框架。三、unlock() 的底层实现原理unlock()实际执行的是defineSwitchFunction生成的函数核心逻辑位于 src/collection/switch-functions.mjs。关键流程如下遍历集合遍历集合中的每个元素能力检查判断元素是否可执行该操作对于unlock没有ableField限制默认均可执行状态变更检测比较ele._private.locked与目标值false只记录真正发生变化的元素到changedEles样式刷新对状态发生变化的元素调用changedColl.updateStyle()因为锁定状态的改变可能影响样式计算事件广播通过changedColl.emit(unlock)触发unlock事件并且支持额外事件参数。因此unlock()对已经处于解锁状态的元素是幂等的状态没有变化就不会触发unlock事件也不会做无谓的样式刷新这为高频调用提供了性能保障。解锁与位置写入的关系锁定状态最直接的影响体现在位置写入。在 src/collection/dimensions/position.mjs 中position的定义显式声明了canSet校验canSet: function( ele ){ return !ele.locked(); }也就是说被锁定的元素无法通过position()改变位置unlock()之后position()、silentPosition()以及拖动交互才对其生效。此外beforePositionSetposition.mjs在写入位置时还会同步位移复合节点parent的子节点解锁父节点后移动它会带动整棵子树这是布局交互中容易忽略但很实用的行为。四、解锁后元素恢复了哪些能力unlock()解除锁定后元素在以下场景中恢复可移动权限程序化定位ele.position()、ele.silentPosition()可以正常写入新坐标用户拖拽渲染层的交互监听在判定是否启动拖拽时会检查!ele.locked()见 src/extensions/renderer/base/load-listeners.mjs解锁后的节点可被鼠标/触控拖拽且拖拽过程中lock状态会参与grabbed状态判定load-listeners.mjs布局算法重排多个内置布局会跳过锁定节点。例如网格布局 grid.mjs、预设布局 preset.mjs 都会判断element.locked()CoSE 力导向布局也会在初始化时记录isLockedcose.mjs解锁后这些布局才会重新计算节点位置动画位移核心动画步进在endPos isEles !self.locked()条件下才会应用位置插值src/core/animation/step.mjs测试 collection-style.mjs 也验证了动画不会移动锁定节点解锁后节点方可随动画移动。五、监听 unlock 事件unlock()每次让元素从锁定变为解锁状态时都会在该元素集合上触发unlock事件。可以这样监听cy.$(#j).on(unlock, function( evt ){ console.log(元素 #j 已解锁, evt.target); }); cy.$(#j).unlock();事件触发与集合上下文相关在 defineSwitchFunction 中事件是在状态发生变化的元素子集changedColl上广播的因此通过evt.target可以拿到实际解锁的元素。这一行为有测试兜底见 test/events.mjsit(unlock, function(){ n1.on(unlock, handler); n1.lock(); // make sure its already locked n1.unlock(); });测试先确保元素处于锁定状态再调用unlock()验证事件被触发与源码仅对 changed 元素发事件的逻辑一致。六、通过 json() 读写锁定状态unlock()并不是操作锁定状态的唯一入口。在 src/collection/index.mjs 的ele.json()写入逻辑中存在开关映射checkSwitch( locked, lock, unlock );这意味着传入json({ locked: false })等价于调用unlock()传入json({ locked: true })等价于lock()。反过来不带参数调用json()时输出的 JSON 中会包含locked字段index.mjs便于序列化与状态恢复。相关测试见 test/collection-data.mjs分别验证了json({ locked: true })触发lock事件、json({ locked: false })触发unlock事件。七、与 autolock 全局配置的交互在defineSwitchSet的overrideField中locked()的读取会被全局开关覆盖overrideField: function( ele ){ return ele.cy().autolock() ? true : undefined; }即当图实例启用了autolock初始化选项autolock: true或运行时调用cy.autolock(true)别名cy.autolockNodes(true)见 src/core/viewport.mjs 与 viewport.mjs时所有节点都表现为锁定状态即使对单个元素调用unlock()也无法恢复其可移动性。这与autoungrabify、autounselectify的机制一脉相承。因此在实际项目中要注意作用域想锁定个别元素 → 用ele.lock()/ele.unlock()想全局锁定所有节点 → 用autolock二者同时存在时全局autolock优先unlock()不生效查询层面始终返回true。八、结合选择器筛选解锁元素锁定状态可以直接作为状态选择器使用见 src/selector/state.mjs:locked— 匹配当前处于锁定状态的元素:unlocked— 匹配当前未锁定的元素。// 解锁所有当前被锁定的节点 cy.nodes(:locked).unlock(); // 统计当前可自由移动的节点数 cy.nodes(:unlocked).length;选择器测试见 test/selectors.mjs它先对nparent调用lock()再断言:locked与:unlocked的筛选结果验证了状态选择器与lock/unlock的联动。九、综合实战示例结合以上所有知识点一个完整的条件解锁 事件响应场景如下const cy cytoscape({ container: document.getElementById(cy), elements: [ { data: { id: a } }, { data: { id: b } }, { data: { id: c } } ], layout: { name: grid } }); // 初始全部锁定 cy.nodes().lock(); // 解锁 id 为 a 和 c 的节点并监听事件 cy.$(#a, #c).on(unlock, function( evt ){ console.log(已解锁:, evt.target.id()); }).unlock(); // 锁定状态下 position() 写入无效 cy.$(#a).position({ x: 100, y: 100 }); // 无效仍锁定前的旧位置 // 显式解锁后 position() 生效 cy.$(#a).unlock().position({ x: 100, y: 100 }); // 查询状态 console.log(cy.$(#b).locked()); // true console.log(cy.nodes(:unlocked).length); // 2注意lock()的overrideField与unlock()相同只要cy.autolock()为真上面的unlock()在查询层面都不会改变locked()的结果——这是第七节强调的优先级问题排查为什么解锁无效时应首先检查cy.autolock()与初始化配置。小结unlock()虽是一行 API背后却串联了 cytoscape.js 的状态开关框架、位置写入校验、交互拖拽、布局算法、事件系统、JSON 序列化与状态选择器等多个模块。掌握它与lock()、locked()、autolock、:unlocked的关系就能在允许用户拖动哪些节点哪些节点参与布局重排状态如何序列化保存等场景中精准控制图形的可交互性。参考阅读API 文档入口documentation/md/collection/unlock.md配套 lock.md核心实现src/collection/switch-functions.mjs位置校验src/collection/dimensions/position.mjsJSON 读写src/collection/index.mjs全局配置src/core/viewport.mjs测试用例test/collection-position-and-dimensions.mjs、test/events.mjs、test/selectors.mjs、test/collection-data.mjs赞分享数据可视化【免费下载链接】cytoscape.jsGraph theory (network) library for visualisation and analysis项目地址https://gitcode.com/gh_mirrors/cy/cytoscape.js点击查看免费下载相关推荐Cytoscape.js 元素数据管理完全指南ele.data()、removeData() 与 scratch() 深度解析Cytoscape.js 元素数据管理完全指南ele.data 、removeData 与 scratch 深度解析 导读 在 Cytoscape.js 中数据可视化Cytoscape.js 元素查询与检索深入解析 cy.$()、cy.filter() 与 cy.elements()Cytoscape.js 元素查询与检索深入解析 cy.$ 、cy.filter 与 cy.elements 导读 本文聚焦 Cytoscape.js 图库中数据可视化Cytoscape.js 元素数值样式读取指南深入理解 ele.numericStyle() 与 ele.numericStyleUnits()Cytoscape.js 元素数值样式读取指南深入理解 ele.numericStyle 与 ele.numericStyleUnits 导读 在 Cytos数据可视化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

3分钟搞懂金字塔ppt源码,性能优化实战避坑指南

3分钟搞懂金字塔ppt源码,性能优化实战避坑指南

3分钟搞懂金字塔ppt源码,性能优化实战避坑指南 官方文档翻了三页还是云里雾里?别慌,我也被坑过。 做技术久了,都知道看源码是硬道理,但金字塔ppt这种涉及复杂渲染引擎的项目,代码量巨大,直接读容易晕头转向。…

2026/9/24 19:39:58 阅读更多 →
VOC与YOLO双格式标注一致性实践:419张鸵鸟图像精准处理指南

VOC与YOLO双格式标注一致性实践:419张鸵鸟图像精准处理指南

简介:本资源是一份专为计算机视觉目标检测任务准备的鸵鸟图像数据集,面向深度学习初学者、算法工程师及科研人员,适用于YOLO、Faster R-CNN等主流检测模型的训练与验证。数据集共1258个文件,包含419张JPG格式原始图像(…

2026/9/24 19:40:32 阅读更多 →
围棋程序包从解压到跑通:GTP协议、引擎与权重配置实战

围棋程序包从解压到跑通:GTP协议、引擎与权重配置实战

简介:一份基于VC编写的双人对弈围棋程序工程,面向希望学习MFC游戏开发或对围棋AI感兴趣的开发者。该程序展示从用户界面到棋局逻辑的完整实现,包含两套尺寸棋盘,可动态调整窗口布局,并提供快速落子体验,值得…

2026/9/24 19:40:53 阅读更多 →

最新新闻

React 360 项目代码探索指南:从启动模板到交互状态的完整剖析

React 360 项目代码探索指南:从启动模板到交互状态的完整剖析

前端3D渲染 【免费下载链接】react-360 Create amazing 360 and VR content using React 项目地址: https://gitcode.com/gh_mirrors/re/react-360 点击查看 免费下载 导读 本文围绕 React 360 官方文档《Exploring the Code》展开,带你逐文件拆解一个…

2026/9/25 1:57:48 阅读更多 →
AU6989SN-GT写保护修复:量产工具救盘与热插拔避坑指南

AU6989SN-GT写保护修复:量产工具救盘与热插拔避坑指南

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

2026/9/25 1:57:48 阅读更多 →
UE5+Cosys-AirSim与ROS2联合仿真跨平台部署与网络配置实战

UE5+Cosys-AirSim与ROS2联合仿真跨平台部署与网络配置实战

这篇内容很适合作为一篇“环境部署复盘型”的硬核博客来写。用户给的标题很精准——不只是单纯讲安装,而是把“跨平台避坑”和“网络配置”点出来了,这恰恰是整个联合仿真链路里最容易反复折腾人的地方。导向很明确:要实操、要细节、要有真实…

2026/9/25 1:57:48 阅读更多 →
MediaGo 下载 API 完整接入指南:任务创建、SSE 事件流与媒体检测实战

MediaGo 下载 API 完整接入指南:任务创建、SSE 事件流与媒体检测实战

音视频桌面应用后端 【免费下载链接】mediago 跨平台视频提取工具:支持流媒体下载、视频下载、m3u8 下载及 B站视频下载,提供 Windows 和 Mac 桌面客户端。Cross-platform video extraction tool: Supports streaming download, video download, m3u8 do…

2026/9/25 1:57:48 阅读更多 →
标定与调校的本质区别及CANalyzer/CANoe/CANape选型指南

标定与调校的本质区别及CANalyzer/CANoe/CANape选型指南

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

2026/9/25 1:57:47 阅读更多 →
SpringBoot学生考勤管理系统源码实战:从环境搭建到二次开发

SpringBoot学生考勤管理系统源码实战:从环境搭建到二次开发

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

2026/9/25 1:56:47 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

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

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

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

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

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

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

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

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

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

2026/9/24 14:33:56 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/24 12:49:17 阅读更多 →