2009-12-19 2 views
1

У нас есть приложение, которое использует как библиотеки закрытия google, так и библиотеки 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> 

Мы хотели бы использовать только один сценарий тег в имеющемся источнике HTML. Таким образом, мы попытались сделать следующее:


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

, а затем в ГРЦ-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 работает до того, как додзё полностью загрузится. Любые идеи, почему это не работает?

ответ

4

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

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

+0

Спасибо, 'document.write ('')' сделал трюк. – Lightbeard

1

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

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

0

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^