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

5 回复

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 时,如果遇到事件监听器无法移除或重复注册的问题,可能是由于以下几个原因导致的:

  1. 事件监听器未正确移除:确保你在移除事件监听器时使用的是与注册时相同的函数引用。
  2. 页面生命周期管理不当:在页面卸载时(如 onUnloadbeforeDestroy 生命周期钩子中),确保正确移除了事件监听器。
  3. 事件监听器重复注册:在每次页面加载时,确保不会重复注册同一个事件监听器。

解决方案

  1. 确保使用相同的函数引用: 在注册和移除事件监听器时,使用相同的函数引用。例如:

    const speechListener = function(event) {
        console.log('Speech event:', event);
    };
    
    // 注册事件监听器
    plus.speech.addEventListener('start', speechListener);
    
    // 移除事件监听器
    plus.speech.removeEventListener('start', speechListener);
    
  2. 在页面生命周期钩子中管理事件监听器: 在页面的 onLoadonShow 生命周期钩子中注册事件监听器,并在 onUnloadonHide 中移除它。例如:

    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);
        }
    };
    
  3. 避免重复注册: 在注册事件监听器之前,先检查是否已经注册过。例如:

    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;
            }
        }
    };
回到顶部