Javascript 哈希不起作用,因为它似乎是一个时间延迟

Javascript 哈希不起作用,因为它似乎是一个时间延迟,javascript,reactjs,url,Javascript,Reactjs,Url,我有一个可以导航到的域,如下所示: mydomain.com 页面加载良好。从那里,我可以添加哈希以访问页面的以下部分: mydomain.com#some_place 这似乎可以正常工作。该页面已完全加载 但是,如果我复制粘贴整个域并将其散列到URL中,然后按enter键 mydomain.com#some_place 它不会去某个地方,只是加载,就好像散列不在那里一样 如何进一步排除故障?在useEffect钩子中,将页面重定向到document.location.href,这是带有哈

我有一个可以导航到的域,如下所示:

mydomain.com
页面加载良好。从那里,我可以添加哈希以访问页面的以下部分:

mydomain.com#some_place
这似乎可以正常工作。该页面已完全加载

但是,如果我复制粘贴整个域并将其散列到URL中,然后按enter键

mydomain.com#some_place
它不会去某个地方,只是加载,就好像散列不在那里一样


如何进一步排除故障?

在useEffect钩子中,将页面重定向到document.location.href,这是带有哈希的URL

此外,document.location.hash还提供您的哈希

编辑: 以下是经过测试的更新解决方案:

  useEffect(() => {
    if (document.location.hash) {
      const hashElement = document.querySelector(document.location.hash);
      hashElement.scrollIntoView();
    }
  }, []);

在useEffect挂钩中,将页面重定向到document.location.href,这是带有哈希的URL

此外,document.location.hash还提供您的哈希

编辑: 以下是经过测试的更新解决方案:

  useEffect(() => {
    if (document.location.hash) {
      const hashElement = document.querySelector(document.location.hash);
      hashElement.scrollIntoView();
    }
  }, []);

您可以获取哈希值,然后使用以下命令将页面滚动到元素:

React.useEffect(() => {
    const url = window.location.hash
    const elem = document.getElementById(url)
    elem.scrollIntoView()
}, [])

在此处阅读更多信息:

您可以获取哈希值,然后使用以下命令将页面滚动到元素:

React.useEffect(() => {
    const url = window.location.hash
    const elem = document.getElementById(url)
    elem.scrollIntoView()
}, [])

在此处阅读更多信息:

一旦您的所有组件都安装完毕,请使用内置组件安装生命周期方法以及

  this.useScrollTo(element);
其中我们this.useCollTo的定义如下

  useScrollTo(element) {
    const elementPosition = element.getBoundingClientRect().top;
    const offsetPosition = elementPosition - 80;
    window.scrollTo({
      top: offsetPosition,
      behavior: "smooth"
    });
  }

一旦您的所有组件都安装完毕,请使用内置的componentDidMount生命周期方法以及

  this.useScrollTo(element);
其中我们this.useCollTo的定义如下

  useScrollTo(element) {
    const elementPosition = element.getBoundingClientRect().top;
    const offsetPosition = elementPosition - 80;
    window.scrollTo({
      top: offsetPosition,
      behavior: "smooth"
    });
  }

是否有一种方法可以通过编程读取散列,然后在DOM加载完成后通过编程滚动页面?浏览器不应该知道在页面加载之前不查找散列吗?WTF?是否有一种方法可以通过编程读取散列,然后在DOM加载完成后通过编程滚动页面?浏览器不应该知道在页面加载之前不查找散列吗?WTF?老实说我不知道。这里是我刚刚想到的另一个解决方案:const hashElement=document.querySelectordocument.location.hash;hasElement.scrollIntoView;显然,这一个不做任何刷新。只要在你的useEffect或ComponentDidMount中使用它,我会测试它给我第二次尝试,它在我的代码中起作用。它跳转到哈希链接,您必须在HTML中有一个id=hash的元素才能工作。useffect=>{if document.location.hash{const hashElement=document.querySelectordocument.location.hash;hashElement.scrollIntoView;}}},[];componentDidMount用于类组件,useEffect用于功能组件。你不需要它,它只是你处理功能组件副作用的方式。如果您有类组件,那么无论如何都必须使用componentDidMount。我还测试了我的解决方案,但不知道为什么它会抛出错误。最终,querySelector和getElementById可以执行相同的任务,这只是一个细微的使用差异。我很高兴这对你有用我不知道该说实话。这里是我刚刚想到的另一个解决方案:const hashElement=document.querySelectordocument.location.hash;hasElement.scrollIntoView;显然,这一个不做任何刷新。只要在你的useEffect或ComponentDidMount中使用它,我会测试它给我第二次尝试,它在我的代码中起作用。它跳转到哈希链接,您必须在HTML中有一个id=hash的元素才能工作。useffect=>{if document.location.hash{const hashElement=document.querySelectordocument.location.hash;hashElement.scrollIntoView;}}},[];componentDidMount用于类组件,useEffect用于功能组件。你不需要它,它只是你处理功能组件副作用的方式。如果您有类组件,那么无论如何都必须使用componentDidMount。我还测试了我的解决方案,但不知道为什么它会抛出错误。最终,querySelector和getElementById可以执行相同的任务,这只是一个细微的使用差异。我很高兴它对您的位置有效。哈希会给您哈希,但getElementById只接受哈希,如果您使用querySelector而不是getElementByIdlocation,这会起作用。哈希会给您哈希,但getElementById只接受哈希,如果您使用querySelector而不是getElementById,这会起作用