ByteNoteByteNote
朗读回调把文件名解构错了
字

字节笔记本

2026年10月7日 · 约 3 分钟读完

朗读回调把文件名解构错了

API中转
¥120

组件在 attached 里 wx.createInnerAudioContext(),赋给 this.data.innerAudioContext。detached 里调用 destroy。点击处理从 e.detail 取出 x 和 y,在 hotspots 里找:x 落在左边界到左边界加宽度之间,y 同样。命中就 readText(hotspot.text)。

成功回调多解构了一次

readText 每次 requirePlugin("WechatSI"),textToSpeech 的语言是 zh_CN,tts 为真,内容是热区文字。成功回调写成 const { filename } = res.filename。若 res.filename 是字符串,对字符串做解构不会得到名为 filename 的属性,结果是空的。下一行把这个空值赋给 innerAudioContext.src 再 play。失败回调打出「转换失败」,并 toast「朗读失败」。成功路径没有判断 src 是否为空。

热区指示器的样式是 left、top、宽高加上 rpx。点击的 e.detail 是另一套坐标,通常相对页面而不是相对这张按 widthFix 缩放后的图。热区数据若按原图像素标注,和点击坐标、和 rpx 指示器都不是同一个尺度。指示器画在图旁边的文档流里时,还要父级 relative,图本身 widthFix 的高度是后来才确定的。没有缩放系数时,放大图片不会同步放大热区的判定。

成功回调对文件名又解构了一次,播放地址变成空

用户后来说这不是要一份小程序实现,而是技术讨论,重点是标注时要能放大缩小。第一版没有缩放,命中测试直接比 x、y 和热区的宽高。放大之后若点击坐标仍按未缩放的数比较,热区会错位。后面的讨论把方案分成识别、人工热区和先识别再校对。第一版代码走的是人工热区加插件朗读,没有识别步骤。

音频上下文放在 data 里再直接赋值,没有走界面更新。播放只用到这个对象,不依赖它出现在模板上。销毁在组件卸下时。若创建失败,detached 里的判断会跳过。成功路径假设 res.filename 可以用解构取出同名属性,和「它本身就是地址字符串」不是同一种取值。

插件和选择器都绑在这一次点击上

每次点击都 requirePlugin。插件名是 WechatSI。没有在创建组件时取一次。热区文字空着也会送去合成。find 返回第一个命中的区域,重叠时后面的区域点不到。没有命中则什么都不做,没有「未点中」的提示。

指示器是可选的 view,不拦截点击的说明没有写。若指示器盖住图片且没有把点击交回去,bind:tap 在 image 上就收不到这一点。样式文件把容器设为相对定位、宽度 100%。指示器的具体层级不在点击函数里。

热区用 rpx 画框,点击坐标没有按同一尺度比较

播放地址应取返回值上的文件名本身,不要再对字符串解构。热区的单位要和点击坐标一致,放大时要乘上同一系数。插件朗读和坐标是否点中是先后两步,文件名取空时,点中也不会出声。

相关文章

分享: