Я использую динамическую загрузку script для уменьшения продолжительности начальной загрузки страницы. Чтобы гарантировать доступность функций и объектов, определенных script, мне нужно убедиться, что script был полностью загружен.
Я разработал свою собственную Javascript-библиотеку с этой целью и, таким образом, провел довольно много исследований по этому вопросу, изучив, как это делается в разные библиотеки. Во время обсуждения, связанного с этой проблемой, Кайл Симпсон, автор LABjs, заявил, что:
LABjs (и многие другие загрузчики) установлены как "onload", так и "onreadystatechange" на всех элементах script, зная, что некоторые браузеры будут запускать один, а некоторые будет стрелять другой...
Вы можете найти пример этого в текущей версии jQuery на момент написания этой статьи, v1.3.2:
// Attach handlers for all browsers
script.onload = script.onreadystatechange = function(){
if ( !done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete") ) {
done = true;
success();
complete();
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
head.removeChild( script );
}
};
Что касается уровня техники, но при анализе странного поведения в Opera 9.64, я пришел к выводу, что, используя эту технику, обратный вызов onload был запущен слишком рано.
Я опубликую свои собственные выводы в ответ на этот вопрос и хотел бы собрать дополнительные доказательства и отзывы сообщества.