在 Typescript 中调用 getElementById() 之前如何确保文档已准备就绪

How to make sure document is ready before calling getElementById() in Typescript

提问人:reeeeeeeeeeee 提问时间:2/3/2023 最后编辑:reeeeeeeeeeee 更新时间:2/3/2023 访问量:93

问:

我有一个组件,它加载一些 HTML(通过标记的库从 MD 转换)并将其播放到页面上,如果单击一行,文档将滚动到页面上具有匹配标题 ID 的相应 HTML 元素。

import { marked } from 'marked';


const [content, setContent] = React.useState('');
React.useEffect(() => {
    if (!source) {
        return;
    }
    getRequest(source)
        .then(response => {
            if (!response.ok) {
                return Promise.reject(response);
            }
            return response.text().then(faq => {
                // sets page to html
                setContent(marked(faq));
                const nearestHeader = document.getElementById(headerID);
                if (nearestHeader) {
                    // if search result is clicked, jump to result's nearest header
                    nearestHeader.scrollIntoView(true);
                    setRowClicked(false);
                }
            });
        })
        .catch(e => Dialog.error('Failed to load page.', e));
}, [source, rowClicked]);

但是,当我去测试此代码时,即使我验证了 headerID 与我要导航到的现有 HTML 元素的 ID 匹配,“nearestHeader”对象也始终为 null。如何在不使用额外库的情况下尝试 getElementById 调用之前确保文档已准备就绪/加载?

HTML 打字稿 dom domdocument getelementbyid

评论


答:

0赞 reeeeeeeeeeee 2/3/2023 #1

通过添加另一个 useEffect 调用来解决,该调用等待首先设置页面的内容。从设置内容的初始 useEffect() 调用中删除了 nearestHeader 代码

React.useEffect(() => {
    const nearestHeader = document.getElementById(headerID);
    if (nearestHeader) {
        nearestHeader.scrollIntoView(true);
        setRowClicked(false);
    }
}, [content]);