这是一个用例:
假设我们有一个有问题的网页,这导致页面在DOMContentLoaded触发后的某个时间点在移动设备上向上滚动。
我们可以合理地假设有一些东西在document.documentElement.scrollTop上运行(例如,给它赋值0)。
假设我们也知道有数百个地方会发生这种情况。
要调试问题,我们可以考虑以下策略:
检查每个事件处理程序,它可以设置一个值为 0 scrollTop,一个一个
尝试使用Chrome DevTools 中提供的调试功能
- 将本机 scrollTop 覆盖为:
var scrollTopOwner = document.documentElement.__proto__.__proto__.__proto__;
var oldDescr = Object.getOwnPropertyDescriptor(scrollTopOwner, 'scrollTop');
Object.defineProperty(scrollTopOwner, '_oldScrollTop_', oldDescr);
Object.defineProperty(scrollTopOwner, 'scrollTop', {
get:function(){
return this._oldScrollTop_;
},
set: function(v) {
debugger;
this._oldScrollTop_ = v;
}
});
function someMethodCausingAPageToScrollUp() {
document.scrollingElement.scrollTop = 1e3;
}
setTimeout(someMethodCausingAPageToScrollUp, 1000);
第二种方法的问题在于它不适用于本机 getter/setter。
第三种方法的问题是,即使现在我们可以轻松地跟踪为scrollTop属性分配值的内容,但我们会对原生 getter/setter 进行修补,并有可能导致不必要的副作用。
因此问题是:是否有更优雅的解决方案来调试 Web 浏览器主机对象(例如文档、窗口、位置等)的本机 getter 和 setter?