是否可以找到导致页面滚动的函数

Is it possible to find the function that caused page scroll

我试图找出哪个函数导致页面在悬停元素时滚动,但到目前为止我一无所获。

元素没有附加特定的监听器,据我所知,它是通过 mouseover 监听器或类似的触发的,元素包含许多附加到它们的监听器。

此外,这不是浏览器功能,它是 javascript 特有的,因为当我取消大部分代码时它不会发生。

我已经尝试过 null 我知道的滚动方法是这样的:

[
    'scroll',
    'scrollTo',
    'scrollBy',
    'scrollByLines',
    'scrollByPages',
    'scrollX',
    'scrollY',
    'scrollMaxX',
    'scrollMaxY',
    'scrollHeight',
    'scrollIntoView',
    'scrollTop',
    'scrollTopMax'
].forEach(function(a) {
    window[a] = null;
    document.documentElement[a] = null;
})

希望当神秘函数尝试调用滚动方法时会抛出错误,但它仍然可以正常滚动,没有任何问题。

我也试过监听滚动事件,但没有返回参数让我更接近负责的功能。

我试过在缩小的源代码中寻找它,但常见的 scroll 搜索 returns 266 个结果,我什至不确定它是否使用典型的滚动方法。

有什么方法可以找到使页面滚动的函数?

<div onmouseover="scrollWin()">Hover over me and it scrolls down the page</div>
<p>You will need stuff here to see the scroll work</p>
<script>
function scrollWin() {
    window.scrollBy(0, 100);
}
</script>

经过 3 天的努力寻找这个神秘的函数,我在第二次发布相同的问题后找到了它,导致页面滚动的函数最终成为 .focus() 函数。很久以前就记得了,但是自从知道之后就没用过,而且和其他的滚动函数也不太容易联系起来,所以一直很纠结。

感谢所有参与其中的人。希望将来其他人会发现这很有用。

我们最近在我们的应用程序中遇到了非常相似的意外滚动,最终将罪魁祸首缩小到 Modernizr 的 CSS 连字符功能检测。

错误报告在这里: https://github.com/Modernizr/Modernizr/issues/2172

对于您的情况,滚动是由对 .focus() 的调用引起的,因此它避开了我们最初搜索不需要的 "scroll" 代码调用。

2020 年,转到 Chrome 的开发工具,Sources 选项卡,然后在右侧窗格中滚动到最底部找到 Event Listener Breakpoints

您会在 Control 组中找到 scroll。每当触发滚动事件时,单击复选框将停止执行(这是一个断点),并且您将能够在 Call Stack 组下的同一窗格(右侧)中跟踪执行此操作的代码(它可能是调试器启动后右窗格中的第一组。

在我的例子中是一个带有自动对焦输入的组件 属性

<input type="text" autoFocus={true} />

我删除了 属性

<input type="text" />