区域映射图片加载完成后的处理,本质是等待关联的加载完成再初始化热区逻辑:需监听img.load而非document.ready,检查img.complete应对缓存,坐标计算须映射回naturalWidth/Height,换图应新建Image实例避免状态残留。

区域映射( + )本身不触发图片加载,真正决定加载时机的是它所关联的 元素。所以“区域映射图片加载完成后的处理”,本质就是:等那张 加载完,再确保 的交互可用——否则点击热区可能无响应、坐标错位,甚至报 TypeError: Cannot read property 'naturalWidth' of null。
必须监听 img.load 而非 document.ready
很多人误以为 DOM 就绪了, 就能点。其实不是: 是异步加载资源,document.ready 或 DOMContentLoaded 触发时,图片很可能还是空的、宽高为 0,此时读取 img.naturalWidth 会是 0,area 坐标计算全乱。
- 错误写法:在
DOMContentLoaded里直接遍历并绑定事件——此时img可能还没加载完,offsetLeft/Top拿不到真实位置 - 正确做法:只对
绑定load和error,成功后再初始化热区逻辑 - 缓存场景要检查
img.complete:已缓存的图片可能在onload绑定前就加载完毕,必须先判断再决定走同步还是异步路径
area 坐标依赖 img 渲染尺寸,不能用 CSS 缩放后硬算
的坐标是相对于图片**原始尺寸(naturalWidth/naturalHeight)** 的像素值,不是渲染后尺寸。如果 用了 width="300" 或 CSS transform: scale(0.5),直接拿 coords 去比对鼠标位置会严重偏移。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 计算点击是否命中某 area,必须把鼠标 clientX/Y 映射回原始坐标系:
const x = (e.clientX - img.offsetLeft) * (img.naturalWidth / img.width) - 若图片用了
object-fit: cover,原始比例被裁剪,coords 就更不准——这时建议改用 SVG 替代,或服务端生成适配缩放比例的 coords - 不要在
img.onload里立刻读img.width:CSS 还没生效,得用getBoundingClientRect()或offsetWidth获取渲染后尺寸
动态更新 map 时,img 必须重新触发 load 事件?不,别这么干
有些需求要换图同时换热区(比如商品图切换,不同 SKU 区域不同),于是有人想:清空 img.src → 改 usemap → 设新 src → 再监听 onload。这是错的:清空 src 不会触发 load,但设新 src 后,如果浏览器缓存命中,onload 可能同步触发,回调来不及绑定就丢了。
- 安全做法:每次换图都新建一个
Image实例,绑定好onload/onerror后再赋值src,加载完成后替换 DOM 中的节点 - 避免操作原
的src:DOM 元素复用会导致状态混乱,尤其是complete、naturalWidth等属性残留旧值 - 如果必须复用节点,换图前手动清除所有事件监听器,并重置
src为空字符串再设新值(部分浏览器需要这个 trick 才重置 internal state)
最易被忽略的一点:area 的 href 和 target 属性由浏览器原生处理,但如果你用 JS 拦截点击做自定义行为(比如弹窗、统计),一定要在 img.onload 完成后才给 绑事件——否则用户第一次点击可能直接跳走了,JS 还没准备好。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










