【问题标题】:Is it possible to find the function that caused page scroll是否可以找到导致页面滚动的功能
【发布时间】:2015-03-08 10:45:54
【问题描述】:

我试图找出悬停元素时哪个函数导致页面滚动,但到目前为止我什么也没得到。

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

这也不是浏览器功能,它是 javascript 特有的,因为当我将大部分代码设为 null 时,它不会发生。

我已经尝试nulling 我知道的滚动方法如下:

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

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

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

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

有什么方法可以找到使页面滚动的功能吗?

【问题讨论】:

  • 找到mouseover事件的来源并检查这个函数。也尝试使用类似这样的东西来运行处理程序:getEventListeners(document.querySelector('.link'));
  • @dfsq 鼠标悬停处理许多其他功能,所有这些功能都被缩小了,我已经解释过这些元素有很多附加到它们的侦听器。
  • @vsync 这是滚动的页面,因为我可以清楚地看到页面在移动,并且如果我将侦听器附加到窗口,则会发生滚动事件。
  • 即使有数百个监听器,您也可以使用 getEventListeners 将它们全部列出。
  • @dfsq 我能用这么多导致更多调用堆栈的侦听器做什么,其中大部分由.call().apply() 分发?它最终将与逐行调试整个代码相同。

标签: javascript html debugging


【解决方案1】:

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

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

【讨论】:

  • 这会停止“滚动”事件的执行,但触发它的跟踪会丢失,因此无济于事。您只能看到正在运行的 javascript 线程的当前堆栈跟踪,但如果设置 body.scrollTop=0 则 javascript 已经消失并且不再在列表中可见。
  • 正如@elixon 所说,这无助于找到滚动事件的来源。
  • 它也不适用于元素级滚动。
【解决方案2】:

在尝试找到这个神秘功能 3 天后,在第二次发布相同的问题后,我发现导致页面滚动的功能最终是 .focus() 功能。很久以前就想起来了,但是自从知道它之后就再也没有用过,而且与其他所有滚动功能都不太容易联系起来,这让我很为难。

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

【讨论】:

  • 谢谢!就我而言,我正在使用旧版 WebForms 应用程序,由于 form 元素上的 DefaultFocus 属性,页面滚动到顶部:msdn.microsoft.com/en-us/library/…...
【解决方案3】:

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

此处的错误报告: https://github.com/Modernizr/Modernizr/issues/2172

与您的情况一样,滚动是由对 .focus() 的调用引起的,因此它避开了我们对不需要的“滚动”代码调用的初始搜索。

【讨论】:

    【解决方案4】:
    <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>
    

    【讨论】:

    • 你必须创建函数,在这种情况下它是 scrollWin()
    • 如果您可以编辑您的答案并解释您显示的代码的作用,以及该代码为何/如何回答问题,这将使您的答案更有帮助。
    • 这个答案与我问的问题完全无关。我想发现(调试可能是一个更好的词)哪个函数负责页面滚动,而不是创建一个新函数。在我的问题开始时,我明确地说“我正在尝试查找导致页面滚动的功能......”,find - 不是createmake。就连标题本身也很清楚。
    • 这个怎么样。你想知道哪个函数负责页面滚动吗?在哪一页?如果我知道的话,它可能是内容附加,也许你并没有真正看到卷轴。您的第一句话清楚地表明您正在尝试找到一个创建页面滚动的功能。我给了你一个例子,以及一个如何使用它的例子。另外,也许尝试搜索其他可能性,例如 jquery:stackoverflow.com/questions/19442717/…
    • 您没有正确阅读内容,我清楚地说“我正在尝试查找导致页面滚动的功能”而不是“尝试创建导致页面滚动的功能”。在我的整个问题中,我从来没有要求创建任何滚动页面的功能,我试图找到负责滚动我正在研究的页面的功能,我已经说过它实际上是一个页面滚动,因为它触发当我向同一事件添加侦听器时的“滚动”事件。请停止建议我创建更多滚动功能,甚至使用无用的库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多