window.load не всегда срабатывает на Chrome?

У меня есть этот usercript:

// ==UserScript==
// @name          test
// @namespace     test
// @description   show's an alert on load
// @include       http://*
// @include       https://*
// ==/UserScript==

window.addEventListener('load', function(){alert("loaded");}, false);

Это отлично работает в Firefox на всех страницах, но в некоторых случаях вообще не работает в Chrome.

Одним из примеров является этот веб-сайт: http://lexin.nada.kth.se/lexin/ При вводе ссылки в адресе и нажатии ввода, страница загружается в обычном режиме, но предупреждение не появляется. Если вы нажмете F5, чтобы обновить страницу, появится всплывающее окно.

Есть ли какое-то объяснение этому странному поведению?

2 ответа

Решение

Причина проблемы в том, что скрипт Content иногда выполняется, когда документ уже полностью загружен. Это иллюстрируется с помощью следующего сценария содержимого ("Пользовательский сценарий"):

// ==UserScript==
// @name          Test
// @namespace     Test
// @include       *
// ==/UserScript==

window.addEventListener('load', function(){alert("loaded");}, false);
alert(document.readyState);   // When this prints "complete", onload never runs

Чтобы решить эту проблему, используйте @run-at document-start мета-правило, которое заставляет скрипт выполняться до создания документа:

...
// @run-at   document-start
// ==/UserScript==

Этот вызов может быть загружен слишком поздно на странице. Добавьте этот код в самый верх страницы и посмотрите, исправит ли это.

Если это не так, пожалуйста, опубликуйте дополнительную информацию. (Где выполняется звонок? Еще немного информации на странице? Это вызывается из внешнего файла.js?)

Другие вопросы по тегам