【问题标题】:window.ScrollTo(x, y) not working when searching for an element搜索元素时window.ScrollTo(x,y)不起作用
【发布时间】:2022-01-28 20:19:03
【问题描述】:

我有一个文档,其中包含具有唯一 ids 的某些元素。此页面包含数百个不同的 div,每个 div 都有其唯一的 ID。例如,考虑以下情况:

<div id='root'>
    <div id='my-1-id'>1</div>
    <div id='my-2-id'>2</div>
    <div id='my-3-id'>3</div>
    <div id='my-4-id'>4</div>
    <div id='my-5-id'>5</div>

    // Even more divs

    <div id='my-1000-id'>1000</div>
</div>

在我的React 组件中,我实现了LazyRendering 功能,以便在用户向下滚动页面时加载document(这是非常自定义的行为)。

但是,现在,我希望实现一个功能,使用document.getElementById 浏览页面的某些部分。但是在页面上查找所有内容都不起作用,因为没有一次性呈现完整的文档。因此,如果用户在页面顶部并使用此功能在页面底部查找某些内容(即尚未“延迟渲染”的部分),那么document.getElementById 将返回 null。

作为所有这些的结果,我希望实现一个函数,该函数将简单地遍历文档以搜索此元素。举个例子:

const lookForElement = (id) => {
    let element = document.getElementById(id)
    while (!element) {
        window.ScrollTo(0, 200) //NOT scrolling
        element = document.getElementById(id)
    }
    return element
}

如您所见,如果未找到该元素,则继续滚动 200 像素高度,直到找到该元素。但是window.ScrollTo(0, 200) 不起作用,并且页面始终固定在页面的原始高度。我做错了什么?

【问题讨论】:

  • 你需要给 DOM 时间做出反应。使用超时或间隔
  • 感谢您的建议。您的意思是在查找元素时设置超时?我可以看到的问题是滚动甚至没有发生。因此,即使我以setTimeout(() =&gt; {element = document.getElementById(id)}, 500) 为例,窗口的高度也保持不变。所以我得到了一个无限循环。

标签: javascript html reactjs dom


【解决方案1】:
  1. 是scrollBy
  2. 您需要给 DOM 一些时间来做出反应

let testCounter = 0,
id2look4 = ""
const lookForElement = (id) => {
    if (testCounter++ > 3) { // mocking the existance of the div we look for
      document.getElementById("root").innerHTML += `<div id="${id2look4}">ID to look for</div>`
    }

    let element = document.getElementById(id2look4)
    if (element) {
      alert("found")
      element.scrollIntoView()
      return 
    }  
    window.scrollBy(0,200) 
    
    setTimeout(lookForElement,100)
}
id2look4 = "my-1000-id";
lookForElement()
div { height: 500px; border: 1px solid black; }
<div id='root'>
    <div id='my-1-id'>1</div>
    <div id='my-2-id'>2</div>
    <div id='my-3-id'>3</div>
    <div id='my-4-id'>4</div>
    <div id='my-5-id'>5</div>

    // Even more divs

    <div id='my-1500-id'>5</div>
</div>

测试时删除它

    if (testCounter++ > 3) {
      document.getElementById("root").innerHTML += `<div id="${id2look4}">ID to look for</div>`
    }

【讨论】:

  • 谢谢。我试试看。
  • 我已经实现了相同的功能,但由于某种原因,即使使用scrollBy(x, y),我也无法让滚动工作。我不知道为什么会这样。
  • 没有示例数据很难判断。也许滚动没有触发延迟加载?
  • 是的,这是有道理的。我正在尝试尽可能多地复制我的代码来演示。同时,我如何在您的示例中验证滚动实际上正在滚动?我试过console.log(window.innerHeight),但我想这总是窗口的高度。我怎样才能得到我们在页面上的位置?我想从你的例子中,我们真的不能知道是否有一个实际的滚动或不正确?因为在任何情况下,当testCounter 达到 4 时,您总是能够滚动到视图中,因为您正在将 &lt;div&gt; 添加到 DOM。
  • 你当然需要在你的页面中没有我的 testcounter 脚本,如果没有你想要的 id 的 div,我的脚本应该永远滚动你的页面
猜你喜欢
  • 2017-06-29
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2021-04-06
  • 2010-10-01
相关资源
最近更新 更多