Обнаружение завершения загрузки
[..] На одной веб-странице предлагалось настроить некоторые обработчики событий, которые будут вызываться после завершения загрузки.Мы делаем это, добавляя следующие строки в предыдущий код:
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.onreadystatechange= function () {
if (this.readyState == 'complete') helper();
}
script.onload= helper;
script.src= 'helper.js';
head.appendChild(script);
Здесь мы устанавливаем два разных обработчика событий для вновь созданного тега script.В зависимости от браузера, один или другой из этих двух обработчиков должен вызываться после завершения загрузки скрипта.Обработчик onreadystatechange работает только в IE.Обработчик onload работает в браузерах Gecko и Opera.
Тест "this.readyState == 'complete" "на самом деле не работает полностью.ReadyState теоретически проходит через ряд состояний:
- 0 неинициализирован
- 1 загрузка
- 2 загружена
- 3 интерактивна
- 4 выполнено
Но на самом деле состояния могут быть пропущены.По моему опыту работы с IE 7 вы получаете либо загруженное событие, либо завершенное событие, но не оба.
Возможно, это связано с тем, загружаете ли вы из кэша или нет, но, похоже,другие факторы, которые влияют на то, какие события вы получаете.Иногда я получаю загрузку или интерактивные события, а иногда нет.Возможно, тест должен быть "this.readyState == 'загружен' || this.readyState == 'complete'", но это может вызвать срабатывание дважды.
http://unixpapa.com/js/dyna.html
ОБНОВЛЕНИЕ
Пожалуйста, вы можете заменить ваш script.onreadystatechange
обратный вызов этим:
newjs.onreadystatechange = function () {
if (newjs.readyState === 'loaded' || newjs.readyState === 'complete') {
newjs.onreadystatechange = null;
alert('script is complete or loaded.");
}
};
Еще одна вещь, которую я заметил, это то, чтовы проводите сравнение строк с оператором ==
.Это может вводить в заблуждение.Используйте ===
вместо этого.