metowolf / MetingJS

:cake: A powerful plugin connect APlayer and Meting
https://i-meto.com/about/
MIT License
1.17k stars 158 forks source link

在vue重新渲染的时候报了个错,但没什么问题 #19

Open JackDeng666 opened 5 years ago

JackDeng666 commented 5 years ago

Uncaught TypeError: Cannot read property 'classList' of undefined at e.value (list.js:176) at e.value (player.js:516) at player.js:184

fate0101 commented 4 years ago

首先我用的 pjax,虽然不是 vue,但是导致问题的原因大体相同

由于在pjax完成时Meting会调用 APlayer 的析构,其会取消异步请求,导致其绑定的 switch函数被调用 switch 函数在调用时会更新页面的元素,而 pjax 此时已经刷新了页面,故会抛出一个undefined的异常 error code: this.player.container.querySelectorAll('.aplayer-list li')[this.index].classList.add('aplayer-list-light');

问题来自: this.player.container.querySelectorAll('.aplayer-list li') 取不到 如果使用侵入式编程,解决起来比较麻烦,需要重新打包,也不太友好

以上都是我编的, 虽然插件不太一样,[APlayer-Typecho 的 console.log 把我带到这里] 解释上也有区别,但是原因应该类似

直接给修复建议吧

在 析构前调用

// aplayer 是 new APlayer 返回的对象 
aplayer.list.index = undefined;

会跳过 switch。

makisevon commented 4 years ago

首先我用的 pjax,虽然不是 vue,但是导致问题的原因大体相同

由于在pjax完成时Meting会调用 APlayer 的析构,其会取消异步请求,导致其绑定的 switch函数被调用 switch 函数在调用时会更新页面的元素,而 pjax 此时已经刷新了页面,故会抛出一个undefined的异常 error code: this.player.container.querySelectorAll('.aplayer-list li')[this.index].classList.add('aplayer-list-light');

问题来自: this.player.container.querySelectorAll('.aplayer-list li') 取不到 如果使用侵入式编程,解决起来比较麻烦,需要重新打包,也不太友好

以上都是我编的, 虽然插件不太一样,[APlayer-Typecho 的 console.log 把我带到这里] 解释上也有区别,但是原因应该类似

直接给修复建议吧

在 析构前调用

// aplayer 是 new APlayer 返回的对象 
aplayer.list.index = undefined;

会跳过 switch。

我用的 pjax + metingjs1.20 ,同样报了错 Uncaught TypeError: Cannot read property 'classList' of undefined

添加了以下 js

document.addEventListener('pjax:success', function () {
    for (let i = 0; i < aplayers.length; i++) {
        aplayers[i].list.index = undefined;
    }
    loadMeting();
});

但好像没什么效果...

makisevon commented 4 years ago

在其他人的帮助下找到了另一种解决方案。 删去 Aplayer.min.jsAplayer 类下的析构函数 destroy() 中的 this.audio.src='' 这一句即可。 目前使用中,没有遇到其他问题。