Подтвердить что ты не робот

Перезагрузка страницы в Chrome без необходимости запускает связанные события непосредственно перед перезагрузкой страницы

Надеюсь, у кого-то есть хороший ответ на это:

Почему Chrome (14.0) запускает события документа и события загрузки окна при обновлении страницы? Обратите внимание, что я не говорю о том, что происходит, когда загружается новая страница, но до ее загрузки. См. Следующий код:

<form name="form1" method="post" action="tmp.aspx?a=1" id="form1">
<script type="text/javascript">

    $(document).ready(function () { console.log('document/ready' + new Date()); });

    $(window).load(function () { console.log('window/load' + new Date()); });

</script>

<a href="tmp.aspx?a=1">tmp</a>
</form>

При первом посещении страницы я получаю два выхода на консоли, один для документа/готовый и один для окна/загрузки. Когда я обновляю страницу, еще два быстро выводятся, и сразу после этого еще два (с нового просмотра страницы). Если вместо этого я просто перейду по ссылке (tmp.aspx), которая сразу возвращается на ту же страницу, этого не произойдет.

Я уверен, что для этого есть хорошее объяснение.

Привет!

EDIT: Дополнительные вызовы $(document).ready() и $(window).load() сделаны до того, как эта страница обновилась. Поэтому, когда я сначала загружаю страницу, методы их вызывают один раз, затем я нажимаю "Обновить" и, прежде чем страница перезагрузится, методы вызываются снова. После этого, когда страница только что была перезагружена, методы называются ТРЕТЬЯМ временем.

4b9b3361

Ответ 1

Поведение, наблюдаемое в 14.0.835.202. edit: (в Windows Seven x64)

Это не ошибка jquery: DOMContentLoaded запускается в другой раз перед загрузкой страницы.

Простой тест для проверки:

 function startpage() {   
     console.log('page loaded');
   }   

   function unloadPage(){
       console.log("page unloaded");
   }
document.addEventListener("DOMContentLoaded", startpage, false);
window.onbeforeunload = unloadPage;

После обновления вы должны увидеть:

page loaded
page loaded // should not be here and is not on Firefox.
page unloaded
loaded

В консоли (с сохранением)

Я думаю, что это просто ошибка Chrome. Не консольный, так как timestamping доказывает, что это не дубликат.

Изменить: та же самая версия Chrome, но работа с OSX выглядит нормально (см. комментарий ниже). Он, как правило, подтверждает, что это ошибка.

Ответ 2

В Chrome 13 для Mac я не вижу такого поведения. После того, как вы загрузите страницу в первый раз, и перед тем, как вы нажмете обновление, вы удалите консоль? Есть ли вероятность, что вы видите старый вывод консоли (я знаю, что некоторым браузерам нравится хранить предыдущую консоль на странице)?

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

Ответ 3

Насколько я знаю, нажатие ссылки #xxx (или ссылка на ту же страницу с или без #xxx) не вызывает события window.load и document.ready.

Если вы хотите, чтобы ссылка вызывала событие, сделайте что-то вроде

$('a#xxx').click(function(){
    //Your code here
}

где xxx - это идентификатор ссылки.

Если ссылка предназначена для перезагрузки страницы, используйте

window.location.reload()

в обработчике событий click.

Ответ 4

Я тестировал это на Chromium 14 в Windows. Поведение не наблюдается.

Ответ 5

Похоже, что ошибка консоли Chrome/webkit. Используя chrome 14 на Ubuntu, я могу воспроизвести ошибку, выполнив следующие шаги.

Сначала создайте страницу, содержащую следующий код js

var timesLoaded = 0;

function loadHandler() {
    console.log(timesLoaded, "times loaded");
    timesLoaded++;
}   

function unloadHandler(){
    console.log("unload after ", timesLoaded, " loads");
}

$(document).ready(loadHandler);
$(window).unload(unloadHandler);
  • Откройте страницу с помощью Google Chrome
  • Нажмите F12, чтобы открыть консоль и увидеть сообщение с 0-кратным временем загрузки
  • Добавить точку останова в первой строке функции unloadHandler
  • Чтобы увидеть двойное сообщение, вы должны щелкнуть где-нибудь на странице (например, выделить фокус из консоли и на загруженную страницу).
  • Обновить страницу
  • Возможно, вы снова увидите сообщение с "0 раза"

Важно то, что ваш код не выполняется дважды. Просто так, что по какой-то причине консоль webkit dev снова отображает одно и то же сообщение. Чтобы дополнительно исследовать ошибку, вы можете сделать следующее:

  • Загрузите предыдущую страницу html
  • Добавить точку останова разгрузки (просто чтобы страница не обновлялась)
  • Щелкните правой кнопкой мыши на первой записи консоли (загружено 0 раз)
  • Нажмите элемент проверки (да консоль - это просто приложение html/js)
  • Найдите элемент, к которому принадлежит запись (он должен быть элементом div -console-group-message
  • Щелкните правой кнопкой мыши на элементе и нажмите "Перерыв по модификациям субтитров"
  • Обновить страницу (снова щелкнув где-нибудь на странице html, чтобы развернуть консольное окно
  • Перед тем, как появится второе раздражающее сообщение, отладчик отобразит консольный код, который пытается добавить сообщение.

Ответ 6

Просто добавьте некоторые примечания к тестированию, используя chrome 15.0.874.102 и windows 7 x86:

Это script, который я использовал для тестирования из моего понимания вопроса:

<html>
    <head>
        <script language="javascript">
            var r = Math.floor(Math.random() * 101);

            function reloadLink() {
                console.log('----Reload Link----');
            }

            function startpage() {
                console.log('---Loaded. ID: ' + r + ' Time: '+new Date());
            }

            function unloadPage() {
                console.log('Un-loaded. ID: ' + r + ' Time: '+new Date());
            }

            document.addEventListener("DOMContentLoaded", startpage, false);
            window.onbeforeunload = unloadPage;

        </script>
        <title>Testing Chrome</title>
    </head>
    <body>
        <a href="" onclick="reloadLink();">Reload Page</a>
    </body>
</html>

Ниже приведен кумулятивный журнал, каждое новое добавление выделено жирным шрифтом:

При загрузке начальной страницы я получаю:

--- Loaded. ID: 68 Время: Вт Окт 25 2011 21:35:18 GMT + 0100 (GMT Дневное время)

Нажатие клавиши F5 фокусируется на HTML-странице:

<я > --- Loaded. ID: 68 Время: Вт Окт 25 2011 21:35:18 GMT + 0100 (GMT Дневное время) <Б >
--- Loaded. ID: 68 Время: Вт 25 окт 2011 21:35:18 GMT + 0100 (GMT Daylight Time) < -----
Un-загружен. ID: 68 Время: Вт Окт 25 2011 21:36:12 GMT + 0100 (GMT Дневное время)
--- Loaded. ID: 78 Время: Вторник 25 окт 2011 21:36:12 GMT + 0100 (GMT Дневное время)

Нажмите ссылку на странице HTML, чтобы перезагрузить страницу:

<я > --- Loaded. ID: 68 Время: Вт Окт 25 2011 21:35:18 GMT + 0100 (GMT Дневное время)
--- Loaded. ID: 68 Время: Вт Окт 25 2011 21:35:18 GMT + 0100 (GMT Дневное время)
Un-загружен. ID: 68 Время: Вт Окт 25 2011 21:36:12 GMT + 0100 (GMT Дневное время)
--- Loaded. ID: 78 Время: Вторник 25 окт 2011 21:36:12 GMT + 0100 (GMT Дневное время)
---- Перезагрузить ссылку ----
Un-загружен. ID: 78 Время: Вт Окт 25 2011 21:38:25 GMT + 0100 (GMT Дневное время)
--- Loaded. ID: 22 Время: Вторник 25 окт 2011 21:38:25 GMT + 0100 (GMT Дневное время)

Нажатие клавиши F5 фокусируется на консоли:

<я > --- Loaded. ID: 68 Время: Вт Окт 25 2011 21:35:18 GMT + 0100 (GMT Дневное время)
--- Loaded. ID: 68 Время: Вт Окт 25 2011 21:35:18 GMT + 0100 (GMT Дневное время)
Un-загружен. ID: 68 Время: Вт Окт 25 2011 21:36:12 GMT + 0100 (GMT Дневное время)
--- Loaded. ID: 78 Время: Вторник 25 окт 2011 21:36:12 GMT + 0100 (GMT Дневное время)
---- Reload Link ----
Un-загружен. ID: 78 Время: Вт Окт 25 2011 21:38:25 GMT + 0100 (GMT Дневное время)
--- Loaded. ID: 22 Время: Вт Окт 25 2011 21:38:25 GMT + 0100 (GMT Дневное время)
Un-загружен. ID: 22 Время: Вторник 25 окт 2011 21:41:53 GMT + 0100 (GMT Дневное время)
--- Loaded. ID: 15 Время: Вт Окт 25 2011 21:41:54 GMT + 0100 (GMT Дневное время)

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


Добавление к заключению:

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

ScreenshotПоказать изображение - Временная шкала 1 (начальная загрузка) ScreenshotПоказать изображение - Временная шкала 2 (перезагрузка F5)