JavaScript: Как загрузить JS асинхронно?

На моем веб-сайте я пытаюсь, выполняет самую быструю загрузку страницы как возможную.

Я заметил, что кажется, что мой JavaScript не загружается асинхронно. Изображение, связанное ниже.

сопроводительный текст http://img249.imageshack.us/img249/2452/jsasynch2.png

То, как мой веб-сайт работает, - то, что он должен загрузить два внешних файла JavaScript:

  • Google Maps v3 JavaScript, и
  • JQuery JavaScript

Затем у меня есть встроенный JavaScript в HTML, который не может быть выполнен, пока те два файла выше не загружаются.

После того как это загружает эти внешние файлы JavaScript, это затем, и только затем, может динамично представить страницу. Причина, почему моя страница не может загрузиться и до Google Maps и до JQuery, загружается, то, что - моя страница, на основе геолокации (использующий Gmaps) пользователя затем отобразит страницу на основе того, где они расположены (например, Нью-Йорк, Сан-Франциско, и т.д.). При значении два человека в различных городах, просматривающих мой сайт, будут видеть различные первые полосы.

Вопрос: Как я могу заставить свои файлы JavaScript загружать асинхронно так, чтобы мое полное время загрузки страницы было самым быстрым?

ОБНОВЛЕНИЕ:

Если бы я должен был загрузить, так или иначе, карты Google и JQuery асинхронно, как я создал бы событие, которое будет запущено, после того как обе карты Google и JQuery загрузили, так как моя страница имеет трудную зависимость от тех файлов для выполнения.

ОБНОВЛЕНИЕ 2

Даже при том, что существует 3 ответа ниже, ни один все еще на самом деле не отвечает на проблему, которую я имею. Любая справка значительно ценилась бы.

8
задан Teddyk 10 May 2010 в 17:21
поделиться

6 ответов

Загрузки HTTP обычно ограничиваются браузерами двумя одновременными загрузками на домен . Вот почему некоторые сайты имеют динамический контент на www.domain.tla и изображения и javascript на static.domain.tla .

Но браузеры действуют несколько иначе со скриптами, пока скрипт загружается, однако браузер не запускает никаких других загрузок, даже на других именах хостов .

Стандартное решение - переместить скрипты в нижнюю часть страницы, но есть обходной путь, который может сработать, а может и не сработать: Вставьте DOM-элемент скрипта с помощью Javascript .

7
ответ дан 5 December 2019 в 07:57
поделиться

Кто-то попросил меня прокомментировать эту ветку, но это было до того, как @lonut опубликовал ответ. Код @lonut - очень хорошее решение, но у меня есть несколько комментариев (критических и не очень):

Во-первых, код @lonut предполагает, что сценарии НЕ имеют зависимости нагрузки от других сценариев. Это немного сложно объяснить, поэтому давайте рассмотрим простой пример jquery.min.js и prototype.js. Предположим, у нас есть простая страница, которая просто загружает эти два сценария следующим образом:

<script src="jquery.min.js"></script>
<script src="prototype.js"></script>

Помните - на странице больше ничего нет - никакого другого кода JavaScript. Если вы загрузите эту страницу, загрузятся два сценария, и все в порядке. Что произойдет, если вы удалите скрипт jquery.min.js? Если вы получаете ошибки из prototype.js, потому что он пытается ссылаться на символы, определенные в jquery.min.js, тогда prototype.js имеет зависимость загрузки от jquery.min.js - вы не можете загрузить prototype.js, если jquery.min.js не имеет уже загружен. Если, однако, вы не получите никаких ошибок, то два сценария можно загрузить в любом порядке. Если у вас нет зависимостей нагрузки между внешними скриптами, код @lonut великолепен. Если у вас есть зависимости нагрузки - это становится очень сложно, и вам следует прочитать главу 4 в «Даже более быстрые веб-сайты».

Во-вторых, одна проблема с кодом @lonut заключается в том, что некоторые версии Opera будут вызывать loadCallback дважды (один раз из обработчика onload и второй раз из обработчика onreadystatechange). Просто добавьте флаг, чтобы убедиться, что loadCallback вызывается только один раз.

В-третьих, большинство браузеров сегодня открывают более двух соединений на одно имя хоста. См. Обзор параллельных подключений .

4
ответ дан 5 December 2019 в 07:57
поделиться

Вы можете использовать что-то вроде этого, что довольно хорошо работает в большинстве браузеров. По крайней мере, в IE6 есть некоторые проблемы, но у меня нет времени на их изучение.

var require = function (scripts, loadCallback) {
    var length        = scripts.length;
    var first         = document.getElementsByTagName("script")[0];
    var parentNode    = first.parentNode;
    var loadedScripts = 0;
    var script;

    for (var i=0; i<length; i++) {
        script = document.createElement("script");
        script.async = true;
        script.type = "text/javascript";
        script.src = scripts[i];

        script.onload = function () {
            loadedScripts++;

            if (loadedScripts === length) {
                loadCallback();
            }
        };

        script.onreadystatechange = function () {
            if (script.readyState === "complete") {
                loadedScripts++;

                if (loadedScripts === length) {
                    loadCallback();
                }
            }
        };

        parentNode.insertBefore(script, first);
    }
};


require([
    "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js",
    "http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js",
    "http://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/yuiloader/yuiloader-min.js"
], function () {
    console.log(jQuery);
    console.log($);
    console.log(YAHOO);
});
4
ответ дан 5 December 2019 в 07:57
поделиться

Независимо от того, в каком порядке они загружают , сценарии должны быть проанализированы / выполнены в том порядке, в котором они появляются на странице (если вы не используете DEFER).

Итак, вы можете поместить обе карты Google Maps в первую очередь, ЗАТЕМ JQuery. Затем где-нибудь в теле вашей страницы:

<script language="Javascript">

    function InitPage() {
       // Do stuff that relies on JQuery and Google, since this script should
       // not execute until both have already loaded.
       }

    $(InitPage);   // this won't execute until JQuery is ready

</script>

Но у этого есть недостаток, заключающийся в блокировании других ваших подключений при загрузке начала страницы, что не очень хорошо для производительности страницы.

Вместо этого вы можете оставить JQuery в HEAD, но загрузить скрипты Google из функции InitPage (), используя функцию загрузки Javascript JQuery, а не Google JSAPI. Затем начните рендеринг, когда будет выполнена функция обратного вызова . То же, что и выше, но с этой функцией InitPage () вместо:

  function InitPage() {
     $.getScript('Google Maps Javascript URL', function() {
        // Safe to start rendering now
        });
1
ответ дан 5 December 2019 в 07:57
поделиться

Переместите ваши javascript-файлы (