【发布时间】:2015-11-13 13:56:07
【问题描述】:
我的网页在切换标签时滚动,我正在尝试找出导致此滚动的原因。我可以确认我观察到的行为实际上是滚动,而不是页面高度变化的结果,因为window.pageYOffset 在切换选项卡时会发生变化。
如何找到导致此滚动的代码?
我尝试在 Chrome 中添加滚动事件侦听器断点,但调用堆栈仅列出了此调用:
elemData.handle (jquery.js:4334) 指向滚动事件处理代码:eventHandle = elemData.handle = function( e ) {...} 未捕获触发此滚动事件的调用。
然后我阅读了关于使用 JavaScript 的 Object.defineProperty() 方法设置属性更改断点的教程:http://johnkpaul.com/blog/2013/07/20/break-on-property-change/ 并为 window.pageYOffset 编写了一个自定义设置方法,但它没有在页面滚动时触发。这是我使用的代码:
Object.defineProperty(window,'pageYOffset',{
set:function(val){
window.pageYOffset=val;
debugger;
}
});
我们可以让上述任何一种方法都可以识别滚动触发代码吗?人们是否已经在使用另一种方法来完成这项任务?
【问题讨论】:
-
如果您点击激活表格的东西是一个锚点,并且您使用
href="#tabname"来标识选项卡,那么可能导致滚动的是浏览器本身:它正试图转到该锚点目标。因此,您将无法在其上设置断点。但如果我是对的,幸运的是,您不必:只需阻止click事件的默认操作(即跟随链接),这将停止滚动。 -
defineProperty调用不起作用也很好。 (我并不惊讶它没有;主机提供的对象不符合 JS 规则。)如果有,你就会得到堆栈溢出,因为代码当然是 in 您的set函数正在为属性分配一个值...它调用set函数,递归地,永远(嗯,永远,直到你用完堆栈)。 -
谢谢!您对导致浏览器滚动到该元素的锚标记的 ID 是正确的。我通过反复试验找到了它,但仍然想了解是否有办法通过断点捕获有问题的代码。关于
defineProperty()方法,我应该如何构造setter 方法以避免递归?我按照我链接的博客的模板进行操作。
标签: javascript jquery angularjs debugging browser