uni-app plus.speech.addEventListener 无法移除事件,重复打开新页面,就算是同一个函数也会重复注册。有解决办法么
uni-app plus.speech.addEventListener 无法移除事件,重复打开新页面,就算是同一个函数也会重复注册。有解决办法么
| 开发环境 | 版本号 | 项目创建方式 |
|----------|--------|--------------|
| PC | Windows 11 | CLI |
# 示例代码:
plus.speech.addEventListener 无法移除事件,重复打开新页面,就算是同一个函数也会重复注册
操作步骤:
plus.speech.addEventListener 无法移除事件,重复打开新页面,就算是同一个函数也会重复注册
## 预期结果:
plus.speech.addEventListener 只注册一次,或者可以主动移除
实际结果:
plus.speech.addEventListener 无法移除事件,重复打开新页面,就算是同一个函数也会重复注册
## bug描述:
plus.speech.addEventListener 无法移除事件,重复打开新页面,就算是同一个函数也会重复注册
更多关于uni-app plus.speech.addEventListener 无法移除事件,重复打开新页面,就算是同一个函数也会重复注册。有解决办法么的实战教程也可以访问 https://www.itying.com/category-93-b0.html
plus.speech.removeEventListener试试可以注销监听么
更多关于uni-app plus.speech.addEventListener 无法移除事件,重复打开新页面,就算是同一个函数也会重复注册。有解决办法么的实战教程也可以访问 https://www.itying.com/category-93-b0.html
没有,plus.speech就只暴露了3个方法,开始、结束和注册事件,原型链上不知道有没有,看不到。之前也有哥们提问了但是官方都保持沉默。毕竟Native.js设及三方,而且基本就是个不会维护的项目了,所以uniapp这边保持默认,本着不承认,不回复,不解决的三不原则,毕竟开发者用不了的只是少数关官方什么事。
解决了吗,我快做完了才发现没有取消监听的
plus.speech.addEventListener没有removeEventListener,但是可以在app.vue中使用统一的方法管理,可以避免重复。
如app.vue使用plus.speech.addEventListener(‘recognizing’, () => {uni.$emit(‘recognizing’)}, false);
页面里使用uni.on(‘recognizing’)和uni.off(‘recognizing’)来监听和取消监听
在 uni-app 中使用 plus.speech.addEventListener 时,如果遇到事件监听器无法移除或重复注册的问题,可能是由于以下几个原因导致的:
- 事件监听器未正确移除:确保你在移除事件监听器时使用的是与注册时相同的函数引用。
- 页面生命周期管理不当:在页面卸载时(如
onUnload或beforeDestroy生命周期钩子中),确保正确移除了事件监听器。 - 事件监听器重复注册:在每次页面加载时,确保不会重复注册同一个事件监听器。
解决方案
-
确保使用相同的函数引用: 在注册和移除事件监听器时,使用相同的函数引用。例如:
const speechListener = function(event) { console.log('Speech event:', event); }; // 注册事件监听器 plus.speech.addEventListener('start', speechListener); // 移除事件监听器 plus.speech.removeEventListener('start', speechListener); -
在页面生命周期钩子中管理事件监听器: 在页面的
onLoad或onShow生命周期钩子中注册事件监听器,并在onUnload或onHide中移除它。例如:export default { onLoad() { this.speechListener = function(event) { console.log('Speech event:', event); }; plus.speech.addEventListener('start', this.speechListener); }, onUnload() { plus.speech.removeEventListener('start', this.speechListener); } }; -
避免重复注册: 在注册事件监听器之前,先检查是否已经注册过。例如:
export default { data() { return { isSpeechListenerRegistered: false }; }, onLoad() { if (!this.isSpeechListenerRegistered) { this.speechListener = function(event) { console.log('Speech event:', event); }; plus.speech.addEventListener('start', this.speechListener); this.isSpeechListenerRegistered = true; } }, onUnload() { if (this.isSpeechListenerRegistered) { plus.speech.removeEventListener('start', this.speechListener); this.isSpeechListenerRegistered = false; } } };

