vue 里 document.getElementById 无法获取 dom 怎么解决

238 天前
 FrankAdler

自己搭了一个 audiobookshelf 服务听点有声读物,发现章节列表无法定位到当前章节,调试了一下找到问题了,但是作为一个后端,vue 实在是不熟,感觉这不到 100 行的代码里涉及很多 vue 知识点,一下子不知道如何修复。。

我看了下,大概是 27 行这里点击 LabelViewChapters

https://github.com/advplyr/audiobookshelf/blob/master/client/components/player/PlayerUi.vue#L27

弹出一个窗口,代码在这个文件

https://github.com/advplyr/audiobookshelf/blob/master/client/components/modals/ChaptersModal.vue#L71

然后调用 scrollToChapter 滚动到正在播放的章节,但是 document.getElementById 找不到当前章节的 dom ,导致逻辑停止,我在 this.$nextTick(this.scrollToChapter) 外面包一个 setTimeout 问题就解决了,所以问题还是出在查找前 dom 还没渲染出来的问题上?但是不知道如何不用setTimeout解决。

大家可以在这里讨论如何解决,也可以直接去提交 pr ,4.9K star 的项目还是很不错的,下次说不定你就可以拿$111 了。

1345 次点击
所在节点    Vue.js
8 条回复
leokun
238 天前
FrankAdler
238 天前
@leokun 试了下好像不行,isReady 返回 true ,document.getElementById 还是 null
hevi
238 天前
FrankAdler
238 天前
@hevi 看起来可以,不过这个项目的 chapters 是个对象数组,看起来要遍历查找,跟你的 demo 不太一样。
另外我也想知道现有的 dom 查找问题如何解决,感觉改动可能更小。
relsoul
238 天前
盲猜 modal 弹窗先渲染了,但是内部可能有一些逻辑做了一些处理,导致 modal 先出来,但是 container 没渲染出来。。 没时间搞环境 可以从 settimeout(func,0)开始试试。
FrankAdler
238 天前
@relsoul 就是不想用 settimeout 才发这个帖子
hafuhafu
237 天前
MutationObserver
FrankAdler
237 天前

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1024048

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX