Что заставляет эту веб-страницу прокручиваться вниз при загрузке? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть страница с кучей сторонних JS-скриптов.Когда я загружаю страницу, она прокручивается вниз до определенного div.

Я уже потратил 2 часа, пытаясь выяснить, какой код вызывает прокрутку.

Есть ли способ узнать, какой сценарий / часть кода вызывает прокрутку?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Обновлено

Поскольку у меня нет страницы OP для тестирования, следующий метод поиска зарегистрированного прослушивателя событий фактически НЕ решает проблему, к которой обращается OP.

Однако это общий метод, когда я хочу найти конкретное событие, просто зарезервированное для чьей-либо ссылки.


Если я правильно понимаю ваше значение, вы хотите, чтобы методсказать вам, где происходят конкретные события.Пожалуйста, скажите мне, если это не делает то, что вы хотите.

Вы можете попытаться добавить точку останова в отладчике Chrome.

F12 -> Источники -> Точки останова прослушивателя событий (в списке с этими точками останова, областью действия и т. Д.) -> Управление -> Установите флажок scroll.

Конечно, он может захватывать какое-то другое событие прокрутки, которое вас не интересует, но вы можете проходить его дальше, пока не найдете нужное.

Кроме того, может также быть событие, не связанное с scroll, вам также может понадобиться focus или DOM Mutation -> DOMFocusIn.

Sample

0 голосов
/ 06 декабря 2018

Ого, это было сложно отлаживать.Похоже, в отладчике отсутствуют некоторые функции, такие как отслеживание источника события.

Проблема в WooCommerce.В частности, похоже, что WooCommerce устанавливает autofocus в поле ввода billing_last_name.Затем браузер автоматически прокручивает страницу, чтобы отобразить поле.

Можно надеяться, что есть опция конфигурации для отключения автофокуса, но, похоже, WooCommerce этого не обеспечивает.

Вы можете попробовать добавить это в свою тему

function disable_autofocus_firstname($fields) {
    $fields['billing']['billing_first_name']['autofocus'] = false;
    return $fields;
}
add_filter('woocommerce_checkout_fields', 'disable_autofocus_firstname');

Если это не сработает, вы можете создать правило CSS, чтобы скрыть поле имени биллинга, а затем запустить отложенную функцию JS, чтобы показать поле имени биллинга после полной загрузки страницы.


Как я отлаживал это

В соответствии с запросом ОП, и учитывая предложенную награду, я опишу, как я отлаживал это.

Я немного смущенчто я не просто сказал себе: «Хм, страница прокручивается до формы, курсор находится в первом поле формы, мне интересно, установлен ли на нем автофокус».К сожалению, я не являюсь в основном программистом внешнего интерфейса, и autofocus сначала не пришёл в голову.

Я начал с мысли, что его прокручивают с помощью JavaScript, либо явного вызоваФункция прокрутки или путем установки scrollTop на что-то.Я установил точку останова на событие scroll и попытался определить, где генерируется событие прокрутки.Хотя я нашел событие прокрутки, я не нашел его источника.Все, что я мог определить на этом этапе, это то, что событие прокрутки было нацелено на document, а не на что-то внутри него.

Я использовал monitorEvents для прослушивания событий на document инашел только 3, щелчок и 2 прокрутки, последняя из которых была вызвана функцией отложенной прокрутки вверх, вставленной OP, чтобы обойти первую прокрутку.Я установил точку останова на выполнение этого тайм-аута (не выполняя функцию) в попытке «разделить и завоевать», то есть посмотреть, происходила ли прокрутка до или после этого.Я сохранил эту точку останова до конца моих усилий по отладке.

Странная вещь состояла в том, что обычно страница не прокручивалась до достижения этой точки останова, но иногда это происходило.Я подумал, что это странно, и хотя я не знал, что с этим делать, это заставило меня искать что-то необычное.

Я попытался найти во всем JavaScript «прокрутку» и «обновление» (текст), чтобы найти дополнительные точки останова, чтобы установить, и установить кучу в JavaScript, который делал прокрутку, но ничего не произошло.

Я заметил, что было много JavaScript, динамически обновляющего страницу, и подумал, что, возможно, прокруткабыло из-за какого-то обновления.

Я попытался установить прослушиватель событий jQuery, который регистрировал все события в document (поскольку JS использовал настраиваемые события, не зарегистрированные в monitorEvents, и я уже определил, что document был целью события scroll), чтобы сгенерировать все события и посмотреть, было ли это какое-то пользовательское событие обновления.Было несколько пользовательских событий, и позже я сгенерировал события в консоли, чтобы посмотреть, прокрутится ли страница в ответ.Поскольку я не мог заставить страницу прокручиваться таким образом, я пришел к выводу, что события, скорее всего, зашли в тупик.

Я сменил тактику.Я посмотрел, куда прокручивалась страница, и увидел, что она прокручивает форму WooCommerce на место.Поэтому, остановившись на точке останова выполнения (описанной выше), я удалил всю форму WooCommerce из DOM и убедился, что страница больше не прокручивается.Это убедило меня, что какая бы проблема ни была, она была вызвана WooCommerce

К сожалению, мой Google Fu подвел меня, и я не сразу нашел проблему с помощью поиска Google.Вместо этого я обнаружил, как WooCommerce прокручивает страницу ошибок, чтобы убедиться, что сообщения об ошибках видны.Это привело меня к JavaScript.

Тем не менее, было много JavaScript, большая часть которого динамически создавала форму (локализовала ее на лету), а также куча немецкого языка (на котором я не говорю), и я не нашел никакого JavaScriptвызывая прокрутку.Я действительно хотел сузить, какой JS-файл вызывал прокрутку.

Chrome позволяет вам установить точку останова для «оператора первого сценария» (в разделе Точки прерывания прослушивателя событий -> Сценарии), поэтому я сделал это.Помимо остановки в первой строке каждого файла сценария, он останавливается в начале каждого тега <script> на странице.Я нашел этот тег сценария в нижней части страницы

<script type="text/javascript">

if(typeof jQuery == 'undefined' || typeof jQuery.fn.on == 'undefined') {
    document.write('<script src="https://www.prored3.de/wp-includes/js/jquery/jquery.js"><\/script>');
    document.write('<script src="https://www.prored3.de/wp-includes/js/jquery/jquery-migrate.min.js"><\/script>');
}

</script>

Странная вещь в этом теге сценария состояла в том, что прокрутка произошла сразу после обработки этого тега сценария, но jQuery уже был загружен, поэтому сценарий фактическиНичего не сделал.Я также смог подтвердить через консоль, что как до, так и после этого тега сценария (до и после прокрутки) DOM не был помечен как ready.Это означает, что все обработчики jQuery ready не были запущены к моменту прокрутки.Это исключает большую часть JavaScript и заставляет меня задуматься о том, почему прокрутка произошла после, но не до этого тега.

Я догадался, что внутренне браузер видел вызовы document.write и определил, что DOM не завершендо тех пор, пока он не передал этот тег, но как только он прошел, DOM был завершен, и он мог начать обрабатывать атрибуты уровня страницы.Это, наряду с более ранними наблюдениями, побудило меня более внимательно посмотреть на форму WooCommerce и обнаружить атрибут autofocus, установленный в поле billing_first_name.

Как ни странно, я не смог предотвратить прокрутку, удалив атрибут autofocus.Я не знаю почему, но я предполагаю, что это связано с внутренностями браузера и тем фактом, что DOM не был ready.Однако я смог предотвратить прокрутку, скрыв элемент billing_first_name in put с помощью CSS, что убедило меня в том, что причиной была прокрутка.

Добавление «автофокуса» к моему поиску в Google привело меня к другим жалобам на подобное поведение с WooCommerce, а объединение сообщений привело меня к PHP-решению, которое я разместил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...