Я использую динамическую загрузку сценария, чтобы уменьшить длительность начальной загрузки страницы. Чтобы обеспечить доступность функций и объектов, определенных скриптом, мне нужно убедиться, что сценарий полностью загружен.Может ли script.readyState доверять обнаружение конца загрузки динамического скрипта?
С этой целью я разработал my own Javascript library, и поэтому провел довольно много исследований по этому вопросу, изучив, как это делается в разных библиотеках. В ходе обсуждения в связи с этим вопросом, Кайл Симпсон, автор LABjs, заявил, что:
LABjs (и многие другие погрузчики) установить как «OnLoad» и «onreadystatechange» всех элементов сценария, зная что некоторые браузеры будут срабатывать один, а некоторые будет стрелять другой ...
Вы можете найти пример в the current version of jQuery as of this writing, 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 был запущен слишком рано.
Я отправлю свои собственные выводы в ответ на этот вопрос и хотел бы получить дополнительные данные и отзывы от сообщества.
Кто-нибудь найдет текущий код в ветке jQuery 1.x? Похоже, они прекратили использование '.onreadystatechange' и' .onload' и заменили их обещаниями? [Clicky] (https://github.com/jquery/jquery/blob/1.x-master/src/ajax.js) – Campbeln