динамическая загрузка тегов скрипта не работает должным образом - PullRequest
1 голос
/ 20 декабря 2009

У нас есть приложение, которое использует библиотеки Google Closure и Dojo. На нашей странице индекса есть следующее, которое работает как ожидалось:


<script type="text/javascript" src="runtime/src/lib/google-closure-rev26/closure/goog/base.js"></script>
<script type="text/javascript" src="runtime/src/lib/dojo_release_132_src/dojo/dojo.js"></script>
<script type="text/javascript" src="runtime/src/core/loader.js"></script>

Мы бы хотели использовать только один тег script в исходном HTML-источнике. Поэтому мы попытались сделать следующее:


<head>
   <script type="text/javascript" src="runtime/src-bootstrap.js"></script>
</head>

и затем в src-bootstrap.js:


var head = document.getElementsByTagName("head")[0];

var s1 = document.createElement("script");
s1.type = "text/javascript";
s1.src = "runtime/src/lib/google-closure-rev26/closure/goog/base.js";


var s2 = document.createElement("script");
s2.type = "text/javascript";
s2.src = "runtime/src/lib/dojo_release_132_src/dojo/dojo.js";

var s3 = document.createElement("script");
s3.type = "text/javascript";
s3.src = "runtime/src/core/loader.js";

head.appendChild(s1);
head.appendChild(s2);
head.appendChild(s3);

Однако в FF это не работает. core / loader.js запускается до полной загрузки dojo. Есть идеи, почему это не работает?

Ответы [ 3 ]

4 голосов
/ 20 декабря 2009

Для механизма такого типа вам лучше использовать document.write () для включения ваших скриптов. Техника, которую вы используете в настоящее время, подходит для сценариев с отложенной загрузкой, и она загружает и выполняет сценарии асинхронно: http://www.nczonline.net/blog/2009/06/23/loading-javascript-without-blocking/

... или у вас может быть процесс сборки, который на самом деле объединяет эти файлы, и просто запрашивает один скрипт, который также сэкономит на количестве запросов, поскольку в действительности вы увеличили количество запросов.

1 голос
/ 20 декабря 2009

Я полагаю, что, поскольку вы создаете элементы с помощью DOM, а не используете их в качестве разметки, браузер не ждет завершения одного сценария, прежде чем выполнить следующий (как в случае прямой <script></script><script></script> установка).

Как насчет добавления сценариев в каскадной форме (закрытие Google добавляет s2 в конце, Dojo s3) или, как предлагает Ли Ковальковски, написание <script> команд с использованием document.write()?

0 голосов
/ 21 июня 2013

Вообще говоря - добавьте пространство имен под окном и отредактируйте ваши внешние ресурсы-

  1. оставить один файл action.js или main.js локально, в который будет добавлен метод, предпочтительно в глобальном контексте (имеется в виду под окном ..).

  2. отредактируйте ваш внешний ресурс, добавив 1 дополнительную строку в конце, вызвав метод на action.js или main.js, когда загрузка будет завершена, "callback like" выполнит тот метод, который вы мы добавляли в DOM ранее. он работает очень похоже на JSONProtocol.

  3. он творит чудеса даже с самой сложной комбинацией динамически загружаемых ресурсов.

см. Пример для этого очень похожего решения, предоставленного для динамической загрузки Google-Closure-Library в другой поток (https://stackoverflow.com/a/17226714/257319)

...