ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

cytoscape.js 元素 unpanify() 使用指南:将节点与边切换为不可平移状态

cytoscape.js 元素 unpanify() 使用指南:将节点与边切换为不可平移状态 数据可视化【免费下载链接】cytoscape.jsGraph theory (network) library for visualisation and analysis项目地址https://gitcode.com/gh_mirrors/cy/cytoscape.js点击查看免费下载导读unpanify()是 cytoscape.js 集合collectionAPI 中用于关闭元素平移穿透passthrough panning能力的方法。将某个元素设为不可平移unpannable后用户在该元素上按下并拖拽时不再平移整个画布而是可以执行框选box selection、拖拽等其他交互。本文以 unpanify.md 为核心结合 switch-functions.mjs、load-listeners.mjs 与 collection-data.mjs 等源码与测试完整讲解unpanify()的用法、底层实现、配套事件与实战场景。读完本文你将能够熟练通过unpanify()/panify()精确控制图中任意元素的平移行为并理解该状态与抓取、复合节点等交互的联动关系。一、方法速览语法、返回值与配套方法1.1 基本语法unpanify()作用于集合中的所有元素无参数cy.$(#j).unpanify();作用对象调用该方法的集合中的每个节点与边collection 文档 说明集合 API 的调用会应用到集合内全部元素。返回值返回调用自身的集合this支持链式调用例如cy.$(#j).unpanify().addClass(fixed)。幂等性若元素已经是不可平移状态重复调用不会重复触发事件见下文“事件”小节。1.2 与 panify() 的对照unpanify()是panify()的逆操作。两者构成一组“开关”型 API与lock()/unlock()、select()/unselect()、grabify()/ungrabify()、selectify()/unselectify()等并列全部由 switch-functions.mjs 中同一套defineSwitchSet()工厂统一生成defineSwitchSet( { field: pannable, on: panify, off: unpanify } );从源码结构看panify/unpanify对应元素私有状态字段pannabletrue/false。配套的读取方法为ele.pannable()返回集合首个元素的布尔状态。二、什么是“pannable”平移穿透机制在深入unpanify()之前需要先理解它控制的交互行为。文档 pannable.md 给出了权威定义A pannable element allows passthrough panning: The user can pan the graph when dragging on the element. Thus, a pannable element is necessarily ungrabbable.平移穿透passthrough panning当用户在元素上按下并拖拽时事件“穿透”该元素直接平移整个图viewport panning。不可抓取ungrabbable可平移元素必然是“不可抓取”的否则拖拽语义会冲突。这一点在 switch-functions.mjs 中体现grabbable的读取被强制受ele.pannable()影响——一个元素只要pannable()为真grabbable()就恒为false。2.1 默认值按 pannable.md 所述cytoscape.js 的默认规则是边edge默认可平移pannable节点node默认不可平移unpannable。因此对大多数节点而言unpanify()的效果是“保持默认状态”而对边unpanify()会将其从默认的可平移状态切换为不可平移这是该 API 最常见的用途之一。三、底层实现defineSwitchFunction 的完整行为unpanify()并非独立编写的函数而是由 switch-functions.mjs 的defineSwitchFunction()工厂生成。理解工厂逻辑即可完整掌握unpanify()的语义批量遍历遍历集合中每个元素this.length次循环对每个元素判断状态是否发生变化。状态变更检测仅当ele._private.pannable与目标值false不同时才将该元素记入changedEles。样式刷新对发生变化的元素集合调用changedColl.updateStyle()——状态变化可能导致依赖该状态的样式如overlay、透明度等需要重绘。事件派发对变化后的元素发出unpanify事件。链式返回始终返回this。工厂函数同时支持两种事件注册快捷调用形式即把unpanify()当作on(unpanify, ...)的简写// 形式一事件 数据 处理器 eles.unpanify( data, handler ); // 形式二仅事件处理器 eles.unpanify( handler );3.1 json() 中的联动元素的状态还可通过ele.json()统一读写。在 src/collection/index.mjs 的checkSwitch机制中pannable被列入开关字段清单checkSwitch( pannable, panify, unpanify );这意味着ele.json({ pannable: true })等价于调用ele.panify()ele.json({ pannable: false })等价于调用ele.unpanify()读取ele.json()时返回的 JSON 对象中包含pannable字段见 src/collection/index.mjs。该联动行为有测试直接佐证见 collection-data.mjs 中的sets pannable与sets unpannable两个用例它们分别通过json({ pannable: true })/json({ pannable: false })切换状态并断言触发了一次panify/unpanify事件。四、事件监听状态切换调用unpanify()后状态发生变化的元素会触发unpanify事件可用来驱动业务逻辑例如同步更新 UI 提示“该节点已锁定平移”cy.$(#j).on(unpanify, function(evt){ console.log(元素 #j 已切换为不可平移, evt.target.id()); }); cy.$(#j).unpanify();对应地panify()触发panify事件。测试 collection-data.mjs 证实了事件只会在状态实际变化时触发一次evts计数为 1重复设置相同状态不会重复触发。五、交互层面的实际效果unpanify()的价值最终体现在渲染层交互中。核心证据在 load-listeners.mjs5.1 鼠标拖拽分支第 700739 行在mousemove处理器中决定“是平移还是框选/拖拽”的关键条件是} else if( select[4] 1 (down null || down.pannable()) ){即只有按下的元素为 null点在空白处或pannable()为真时才进入平移/框选判定分支。随后调用allowPanningPassthrough(down, downs)决定是否真正允许穿透平移load-listeners.mjs若图含复合节点compound nodes且按下的元素可平移则检查事件层级中的所有元素只要其中存在“是父节点且不可平移”的元素就拒绝穿透平移allowPassthrough false否则允许穿透。5.2 复合节点下的特殊规则allowPanningPassthrough的逻辑意味着一个重要的组合行为不可平移的父节点会“挡住”穿透平移。即使你unpanify()了一个子节点若其父节点仍为 pannable行为可能仍受父节点约束反之对父节点执行unpanify()可有效阻止在其区域内开始的拖拽平移画布。这与pannable字段的“必然是 ungrabbable”约束switch-functions.mjs共同构成一套一致的交互优先级体系。5.3 触屏分支同一套判断也用于触屏事件load-listeners.mjs因此unpanify()在触屏与鼠标输入下行为一致。六、实战示例6.1 让边不再拖动画布默认边可平移若希望用户拖拽某条边时进行框选而非平移画布cy.$(#edge-ab).unpanify();6.2 锁定节点后同时禁止其平移穿透结合lock()使用彻底固定一个节点的交互cy.$(#j) .lock() // 禁止移动位置 .unpanify(); // 禁止在它上面拖拽平移画布6.3 条件化切换与事件联动// 根据数据字段批量控制 cy.nodes([typebackground]).unpanify(); cy.nodes([typedecor]).panify(); // 监听并反馈 cy.on(unpanify, node, function(evt){ console.log(节点被锁定平移, evt.target.id()); });6.4 通过 json() 等价操作cy.$(#j).json({ pannable: false }); // 等价于 unpanify()七、注意事项与最佳实践默认值意识节点默认不可平移、边默认可平移。若业务依赖“边可拖动平移画布”不要对全部边调用unpanify()而不做区分。与 grabbable 的冲突pannable 元素必然 ungrabbable若后续调用grabify()恢复抓取需先unpanify()否则grabbable()仍返回false由 switch-functions.mjs 的 override 逻辑保证。复合节点层级父节点的 pannable 状态会影响子区域内的穿透平移判定设计交互时需整体考虑父—子层级参考 load-listeners.mjs。状态持久化unpanify()只修改运行时状态不会写入元素data()。需要持久化时应结合json()导出ele.json()会包含pannable字段或自行在业务数据中记录。链式与批量方法返回集合本身可安全链式调用对大型集合批量调用时只会在状态实际变化的元素上触发事件与样式更新开销可控。八、相关资源方法文档unpanify.md、panify.md状态定义文档pannable.md集合 API 说明collection.md开关函数工厂实现switch-functions.mjsjson() 中 pannable 联动collection/index.mjs渲染层交互判定load-listeners.mjs单元测试collection-data.mjs赞分享数据可视化【免费下载链接】cytoscape.jsGraph theory (network) library for visualisation and analysis项目地址https://gitcode.com/gh_mirrors/cy/cytoscape.js点击查看免费下载相关推荐Cytoscape.js 元素移动指南使用 eles.move() 在不动图的前提下重连边与重设父节点Cytoscape.js 元素移动指南使用 eles.move 在不动图的前提下重连边与重设父节点 导读 本文系统讲解 Cytoscape.js 集合方法 e数据可视化Cytoscape.js 元素状态控制unselectify() 让元素不可选的原理与实战指南Cytoscape.js 元素状态控制 unselectify 让元素不可选的原理与实战指南 导读 在 Cytoscape.js 中元素的选中select数据可视化cytoscape.js 元素 pannable 状态详解平移透传Passthrough Panning的配置、切换与渲染器实现cytoscape.js 元素 pannable 状态详解平移透传Passthrough Panning的配置、切换与渲染器实现 pannable可平移数据可视化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表