Вот пример использования:
Предположим, у нас есть проблема с веб-страницей, которая приводит к прокрутке страницы на мобильном устройстве в некоторый момент после DOMContentLoaded сработал.
Мы можем законно предположить, что есть что-то, что работает с document.documentElement.scrollTop (например, присваивает ему значение 0 ).
Предположим, мы также знаем, что существуют сотни мест, где это может произойти.
Для устранения проблемы мы можем подумать о следующих стратегиях:
проверить каждуюобработчик событий, который может установить значение 0 scrollTop , один за другим
попытаться использовать функцию debug , доступную в 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);
Проблема второго подхода заключается в том, что он не работает с собственными средствами получения / установки.
Проблема третьего подхода заключается в том, что, хотятеперь мы можем легко отследить, что присваивает значение свойству scrollTop , мы обезьяны исправляем нативные методы получения / установки и рискуем вызвать ненужные побочные эффекты.
Отсюда вопрос: есть либолее элегантное решение для отладки собственных методов получения и установки для узлов хоста веб-браузера (например, документа, окна, местоположения и т. д.)?