... JavaScript в ГОЛОВЕ ... динамически вставляет асинхронно ЗАГРУЗКА тег сценария перед тем последний сценарий на странице ...
Я принимаю the loader script is inline, а это означает, что выделенный бит фактически относится к «текущему» элементу сценария, т.е. загрузчику. Это происходит потому, что только html, предшествующий тегу сценария загрузчика, был проанализирован и интерпретирован, поэтому вставленный тег скрипта на самом деле все еще находится в head
, а не в нижней части страницы. Таким образом, целевой скрипт ограничивается выполнением операций DOM только для предыдущих элементов, если только вы не переверните код в готовый обратный вызов DOM ... это то, чего вы пытаетесь избежать в первую очередь!
В основном вы хотите загрузить весь html, чтобы страница была видимой/сканируемой, начать загрузку изображений/таблиц стилей (что происходит в неблокирующих потоках) и , затем загрузить любой javascript. Один из подходов заключается в put your target script at the bottom of the page, просто выберите их порядок правильно (интерактивность сначала, усовершенствования второй, сторонняя аналитика/интеграция в социальные сети/что-то еще супер-тяжелое последнее) и приспосабливаются к вашим потребностям. Технически it still blocks the page load, но есть все сценарии, оставленные в нижней части страницы в любом случае (и поскольку они находятся внизу, вы сможете напрямую манипулировать DOM, как только они будут загружены, за вычетом некоторых особенностей IE7).
Существует соответствующий rant/overview Я хотел сделать ссылку на который предоставляет достойные примеры и некоторую газораспределительную мелочь на использовании и злоупотреблении DOM готовых обратных вызовов, а также "other side of the story" о том, почему звездной производительности может иметь меньшую ценность, чем нормальный системы управления зависимостями. Тема последнего слишком широка, чтобы быть исчерпанной в одном ответе, но что-то вроде requirejs documentation должно дать вам представление о том, как работает шаблон.
Возможно, еще одним шаблоном для рассмотрения является создание приложения для одной страницы SPA, которое использует асинхронный доступ к фрагментам контента, а не «традиционную» навигацию между полными страницами. Шаблон имеет недооцененную, но довольно значительную выгоду от производительности от not having to parse and re-execute shared javascript on every page, которая также будет учитывать вашу (действительную) озабоченность по поводу производительности сторонних js. В конце концов, только a good caching policy будет делать чудеса для времени загрузки, но плохой код javascript или избыточные накладные расходы на каркасах остаются.
Обновление: Выяснено. С учетом вашего конкретного сценария (т.нет контроля над Разметкой самого по себе, и хочет быть последним сценарием для выполнения), вы должны обернуть вставку элемента асинхронного сценария в DOM в 0ms setTimeout
обратного вызов:
setTimeout(function(){
//the rest is how GA operates
var targetScript = document.createElement('script');
targetScript.type = 'text/javascript';
targetScript.async = true;
targetScript.src = 'target.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(targetScript, s);
}, 0);
Благодаря одно- поточный характер среды, js setTimeout
обратный вызов в основном добавляется в очередь для выполнения 0мс-задержки , как только поток больше не занят (more thorough explanation here). Поэтому браузер даже не осознает необходимость загрузки, не говоря уже о выполнении целевого скрипта, до тех пор, пока не будет завершен код «более высокий приоритет»! И поскольку DOM работает, когда добавляется тег скрипта, вам не нужно будет проверять его явно в самом целевом скрипте (что удобно, когда оно загружается «мгновенно» из кеша).
Что вы имеете в виду «прежде всего JS был загружен в»? Вы не можете контролировать это, когда динамически генерируют элементы сценария, которые будут загружаться асинхронно. И поскольку висячие скрипты _allways_ приводят к плохому UX, вы должны избегать их, а не включать их в свои требования. – Bergi
[Какая проблема вы пытаетесь решить] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? Может быть, это пример того, где вам нужно это поведение. – Bergi
@Bergi Висячие скрипты из моего контроля, потому что это не веб-страницы, которые я контролирую –