Для всех основных браузеров (кроме IE) onload
событие JavaScript не запускается при загрузке страницы в результате операции кнопки «Назад» - оно запускается только при первой загрузке страницы.
Может кто-нибудь указать мне пример кросс-браузерного кода (Firefox, Opera, Safari, IE, ...), который решает эту проблему? Я знаком с pageshow
событием Firefox, но, к сожалению, ни Opera, ни Safari не реализуют это.
javascript
pageload
Билл
источник
источник
Ответы:
Ребята, я обнаружил, что JQuery имеет только один эффект: страница перезагружается при нажатии кнопки назад. Это не имеет ничего общего с « готов ».
Как это работает? Ну, JQuery добавляет прослушиватель событий onunload .
По умолчанию это ничего не делает. Но почему-то это вызывает перезагрузку в Safari, Opera и Mozilla - независимо от того, что содержит обработчик событий.
[ edit (Николай) : вот почему так работает: webkit.org , developer.mozilla.org . Пожалуйста, прочитайте эти статьи (или мое резюме в отдельном ответе ниже) и подумайте, действительно ли вам нужно это сделать и замедлить загрузку вашей страницы для пользователей.]
Не можете в это поверить? Попробуй это:
Вы увидите похожие результаты при использовании JQuery.
Вы можете сравнить с этим без onunload
источник
onunload
обработчик (страница уже все уничтожила; зачем ее кэшировать?).Некоторые современные браузеры (Firefox, Safari и Opera, но не Chrome) поддерживают специальный кэш «назад / вперед» (я назову его bfcache - термин, изобретенный Mozilla), используемый при переходе пользователя назад. В отличие от обычного (HTTP) кэша, он фиксирует полное состояние страницы (включая состояние JS, DOM). Это позволяет перезагружать страницу быстрее и в точности так, как ее покинул пользователь.
load
Событие не должно огня , когда страница загружается из этого bfcache. Например, если вы создали свой пользовательский интерфейс в обработчике «load», и событие «load» было запущено один раз при начальной загрузке и во второй раз, когда страница была перезагружена из bfcache, страница в итоге получит дубликаты элементов интерфейса.По этой же причине добавление обработчика «unload» останавливает сохранение страницы в bfcache (что замедляет переход к ней) - обработчик unload может выполнять задачи очистки, которые могут привести страницу в нерабочее состояние.
Для страниц, которые должны знать, когда они перемещаются назад или обратно, Firefox 1.5+ и версия Safari с исправлением для ошибки 28758 поддерживают специальные события, называемые «pageshow» и «pagehide».
Ссылки:
источник
Я столкнулся с проблемой, что мой js не выполнялся, когда пользователь нажимал назад или вперед. Сначала я решил остановить кеширование браузера, но, похоже, это не проблема. Мой javascript был настроен на выполнение после загрузки всех библиотек и т. Д. Я проверил это с помощью события readyStateChange.
После некоторого тестирования я обнаружил, что readyState элемента на странице, где был нажат назад, не «загружен», а «завершен». Добавление
|| element.readyState == 'complete'
к моему условному заявлению решило мои проблемы.Просто подумал, что поделюсь своими выводами, надеюсь, они помогут кому-то еще.
Изменить для полноты
Мой код выглядел следующим образом:
В приведенном выше примере кода переменной сценария был недавно созданный элемент сценария, который был добавлен в DOM.
источник
Хорошо, вот окончательное решение, основанное на первоначальном решении ckramer и примере palehorse, которое работает во всех браузерах, включая Opera. Если вы установили history.navigationMode в «совместимый», тогда функция готовности jQuery будет срабатывать при операциях с кнопками «Назад» в Opera, а также в других основных браузерах.
Эта страница имеет больше информации .
Пример:
Я проверил это в Opera 9.5, IE7, FF3 и Safari, и это работает во всех из них.
источник
Я не мог заставить приведенные выше примеры работать. Я просто хотел вызвать обновление определенных измененных областей div при возврате на страницу с помощью кнопки назад. Уловка, которую я использовал, состояла в том, чтобы установить скрытое поле ввода (называемое «грязным битом») в 1, как только области div изменились от оригинала. Скрытое поле ввода на самом деле сохраняет свое значение, когда я нажимаю назад, поэтому при загрузке я могу проверить этот бит. Если он установлен, я обновляю страницу (или просто обновляю div). Однако при первоначальной загрузке этот бит не установлен, поэтому я не трачу время на загрузку страницы дважды.
И он будет срабатывать правильно, когда я нажму кнопку «Назад».
источник
Если я правильно помню, то добавление события unload () означает, что страница не может быть кэширована (в прямом / обратном кэше) - потому что ее состояние изменяется / может измениться, когда пользователь уходит. Так что - небезопасно восстанавливать состояние последней секунды страницы при возврате к ней путем навигации по объекту истории.
источник
Я думал, что это будет для "onunload", а не для загрузки страницы, так как мы не говорим о запуске события при нажатии "Back"? $ document.ready () - для событий, желаемых при загрузке страницы, независимо от того, как вы попадаете на эту страницу (например, перенаправление, открытие браузера по URL-адресу напрямую и т. д.), а не при нажатии «Назад», если вы не говорите о том, что выстрелить на предыдущей странице, когда он загружается снова. И я не уверен, что страница не кэшируется, так как я обнаружил, что Javascripts все еще есть, даже если в них включен $ document.ready (). Нам приходилось нажимать Ctrl + F5 при редактировании наших сценариев, которые имеют это событие, всякий раз, когда мы их пересматриваем, и мы хотим проверить результаты на наших страницах.
это то, что вы хотели бы для события onunload при нажатии «Назад» и выгрузке текущей страницы, а также срабатывает, когда пользователь закрывает окно браузера. Это больше походило на то, что вы хотели, даже если меня превосходят ответы $ document.ready (). По сути, разница между событием, запускаемым на текущей странице во время ее закрытия, и тем, которое загружается при нажатии кнопки «Назад» во время загрузки. Протестировано в IE 7 хорошо, не могу говорить за другие браузеры, поскольку они не допускаются, где мы находимся. Но это может быть другой вариант.
источник
Я могу подтвердить ckramer, что готовое событие jQuery работает в IE и FireFox. Вот пример:
источник
для людей, которые не хотят использовать всю библиотеку jquery, я извлек реализацию в отдельный код. Это всего 0,4 КБ.
Вы можете найти код вместе с учебником немецкого языка в этой вики: http://www.easy-coding.de/wiki/html-ajax-und-co/onload-event-cross-browser-kompatibler-domcontentloaded.html
источник
Событие готовности jQuery было создано именно для такого рода проблем. Возможно, вы захотите покопаться в реализации, чтобы увидеть, что происходит под одеялом.
источник
ready
похоже, не запускается в Firefox при использовании кнопки «Назад». Смотрите также ответ Николая .Билл, я смею ответить на твой вопрос, однако я не уверен на 100% в своих догадках. Я думаю, что другие браузеры IE при переносе пользователя на страницу в истории не только загрузят страницу и ее ресурсы из кэша, но и восстановят для нее все состояние DOM (чтение сеанса). IE не выполняет восстановление DOM (или не сдавал в аренду), и, таким образом, событие onload кажется необходимым для правильной повторной инициализации страницы.
источник
Я попробовал решение от Билла, используя $ (document) .ready ... но сначала это не сработало. Я обнаружил, что если сценарий размещен после раздела html, он не будет работать. Если это головной раздел, он будет работать, но только в IE. Скрипт не работает в Firefox.
источник
Хорошо, я попробовал это, и это работает в Firefox 3, Safari 3.1.1 и IE7, но не в Opera 9.52.
Если вы используете пример, показанный ниже (на основе примера palehorse), вы получите всплывающее окно с предупреждением при первой загрузке страницы. Но если вы затем перейдете на другой URL, а затем нажмете кнопку «Назад», чтобы вернуться на эту страницу, вы не получите всплывающее окно с предупреждением в Opera (но вы делаете это в других браузерах).
Во всяком случае, я думаю, что это достаточно близко на данный момент. Спасибо всем!
источник
Событие unload не работает нормально в IE 9. Я пробовал его с событием load (onload ()), оно отлично работает в IE 9 и FF5 .
Пример:
источник
Я использовал HTML-шаблон. В файле custom.js этого шаблона была такая функция:
Но эта функция не работала, когда я возвращался после перехода на другую страницу.
Итак, я попробовал это, и это сработало:
Теперь у меня есть 2 «готовых» функции, но они не дают никаких ошибок, и страница работает очень хорошо.
Тем не менее, я должен заявить, что он тестировал на Windows 10 - Opera v53 и Edge v42, но не на других браузерах. Имейте в виду это ...
Примечание: версия jquery была 3.3.1, а версия перехода была 3.0.0
источник