ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

如何给 CesiumJS 开发自定义 Widget:挂上 Viewer、管好生命周期的完整指南

如何给 CesiumJS 开发自定义 Widget:挂上 Viewer、管好生命周期的完整指南 如何给 CesiumJS 开发自定义 Widget挂上 Viewer、管好生命周期的完整指南【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium默认时间轴和你公司的设计规范打架或者想在地球左上角放一块任务面板——内置控件改不动的时候就得自己写 Widget地球界面上的一个可交互小控件。本文讲清三件事CesiumJS 自定义 Widget 挂到 Viewer 容器上、接上时钟状态、在 destroy 里做完整清理。Widget 在 CesiumJS 里是什么、挂在哪Widget 不是独立运行的东西它是一块挂进 Cesium 容器里的 DOM 区域。整条链路很短Viewer内部持有CesiumWidget后者负责 canvas 与Scene时间轴这类控件则挂在 Viewer 自己的容器里靠一个共享的Clock和场景保持同步。样式全部来自 widgets.css 里那套cesium-前缀的类名。对你来说结论只有一条Widget 的生命周期必须和它依附的容器对齐挂在哪、谁销毁谁写之前先想清楚。最小可跑实现两行容器加一个类今天就能挂上配置这一步很薄引入 Cesium 构建产物和widgets.css后给自定义面板留一个div。下面只写关键的三行。div idcesiumContainer/div div idtaskPanel/div link relstylesheet hrefBuild/Cesium/Widgets/widgets.css /为什么单独留一个div因为官方 Widget 都是容器进、节点出的模式你的组件照抄这个约定后面才能被viewer或页面布局统一管理。实现时把状态注入、DOM 生成、事件绑定都收进一个类监听统一交给EventHelper——这个类专门替你记录加了哪些监听清理时一行removeAll全拔掉漏挂的风险直接归零。class TaskPanel { constructor(container, options) { this._eventHelper new Cesium.EventHelper(); const panel Cesium.Dom.create(div, taskPanel-widget); const button Cesium.Dom.create(button, null, 飞过去, panel); this._eventHelper.addEventListener( button, click, (event) { event.stopPropagation(); options.viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(options.lng, options.lat, options.height), }); } ); container.appendChild(panel); this._panel panel; } destroy() { this._eventHelper.removeAll(); this._panel.remove(); } }注意两行为什么stopPropagation防止点击先被地球的ScreenSpaceEventHandler吃掉destroy必须自己暴露因为业务组件要能精确控制下线时机。挂载只有两行销毁也写进离开页面的流程里const viewer new Cesium.Viewer(cesiumContainer); const panel new TaskPanel(document.getElementById(taskPanel), { viewer, lng: 116.39, lat: 39.9, height: 50000 }); // 离开页面时 panel.destroy();这里刻意没有让viewer级联替你销毁——级联只处理 Viewer 自己创建的资源你类里绑的监听和订阅它一概不管。踩坑对照现象、根因、对策一次列齐高频问题基本集中在事件、内存、样式三处按现象 → 根因 → 对策对照着排查最快你看到的现象背后根因对策按钮点了没反应点击先落在地球 canvas 上被ScreenSpaceEventHandler消费监听里加stopPropagation必要时preventDefault页面反复进出内存只涨不降postRender订阅和 DOM 监听从未解绑destroy里用EventHelper.removeAll一次清光再panel.remove()按钮、输入框样式被别人改了全局button选择器打中了cesium-button等内置类自定义样式全部限定在自己的命名空间类下复用cesium-widget做绝对定位面板跟着地球缩放糊了容器尺寸没跟上 viewer 的resize订阅scene.resize把布局计算挪进同一回调继续深挖顺着官方 Widget 的骨架走两个方向值得翻源码这里只留钩子想看控件如何吃时钟数据读 Timeline它持有container和clock整条时间轴就是容器 共享状态 帧响应的样板你的任务面板可以叠在同一套模式上。想看生命周期谁来收尾读 Viewer 实现destroy如何级联清理每个内部 Widget、如何和CesiumWidget对齐渲染循环对照它就能补全你组件的清理清单。更多细节以 API 文档构建指南 生成的接口说明为准。收获一句话挂容器、接状态、destroy清干净自定义 Widget 就只剩业务细节了。【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表