Динамично загрузите файл JavaScript
Как может Вы надежно и динамично загружать файл JavaScript? Это желание может использоваться, чтобы осуществить модуль или компонент это когда ' initialized' компонент динамично загрузит, всем были нужны сценарии библиотеки JavaScript по требованию.
Клиент, который использует компонент isn' t требуемый загрузить все файлы сценария библиотеки (и вручную вставить '< script>'; признаки в их веб-страницу), которые осуществляют этот компонент - просто ' main' составляющий файл сценария.
Как господствующие библиотеки JavaScript достигают этого (Прототип, jQuery, и т.д.)? Сделайте эти инструменты сливают несколько файлов JavaScript в единственный ' без ограничений на свободное распространение; build' версия файла сценария? Или сделайте они делают любую динамическую погрузку вспомогательного ' library' сценарии?
Дополнение к этому вопросу: есть ли способ обращаться с событием после того, как динамично включенный файл JavaScript будет загружен? У прототипа есть 'document.observe' для событий всего документа. Пример:
document.observe("dom:loaded", function() {
// initially hide all containers for tab content
$$('div.tabcontent').invoke('hide');
});
Каковы доступные события для элемента сценария?
Вы можете написать динамические признаки сценария (использующий Прототип):
Проблема здесь состоит в том, что мы не знаем , когда внешний файл сценария полностью загружен.
Мы часто хотим наш подчиненный кодекс по очень следующей строке и любим писать что-то как:
Есть умный способ ввести зависимости от сценария без потребности отзывов. Вы просто должны потянуть сценарий через синхронный запрос AJAX и оценка сценарий на глобальном уровне.
Если Вы используете Прототип, метод Script.load похож на это:
Нет никакого импорта / включают / требуют в JavaScript, но есть два главных способа достигнуть того, что Вы хотите:
1 - Вы можете загрузить его требованием AJAX, тогда используют оценку.
Это - самый прямой путь, но it' s ограниченный Вашей областью из-за параметров настройки безопасности JavaScript и оценкой использования открывает дверь ошибкам и хакерским проникновениям.
2 - Добавьте признак сценария с URL сценария в HTML.
Определенно лучший способ пойти. Вы можете загрузить сценарий даже от иностранного сервера и it' s убирают, поскольку Вы используете анализатор браузера, чтобы оценить кодекс. Вы можете поместить < сценарий/> признак в главе веб-страницы, или у основания тела.
Оба из этих решений обсуждены и иллюстрированы здесь.
Теперь, есть большая проблема, о которой Вы должны знать. Выполнение, которое подразумевает, что Вы удаленно загружаете кодекс. Современные веб-браузеры будут загружать файл и продолжать выполнять Ваш текущий сценарий, потому что они загружают все асинхронно, чтобы улучшить действия.
Это означает это, если Вы используете эти уловки непосредственно, Вы won' t быть в состоянии использовать Ваш недавно нагруженный кодекс следующая строка после того, как Вы попросили, чтобы он был загружен, потому что это будет все еще загружать.
НАПРИМЕР: my_lovely_script.js содержит MySuperObject
Тогда Вы перезагружаете страницу, поражающую F5. И это работает! Путание...
Таким образом, что делать с этим?
Ну, Вы можете использовать хакерское проникновение, которое автор предлагает в связи, которую я дал Вам. Таким образом, для людей второпях, он использует en событие, чтобы управлять функцией обратного вызова, когда сценарий загружен. Таким образом, Вы можете поместить весь кодекс, пользующийся отдаленной библиотекой в функции обратного вызова. НАПРИМЕР:
Тогда Вы пишете кодекс, который Вы хотите использовать ПОСЛЕ ТОГО, КАК сценарий загружен в функции лямбды:
Тогда Вы управляете всем этим:
Хорошо, я получил его. Но it' s боль, чтобы написать весь этот материал.
Ну, в этом случае Вы можете использовать как всегда фантастическая свободная структура jQuery, которые позволяют Вам сделать ту же самую вещь в одной линии:
Я использовал намного менее сложная версия недавно с jQuery:
Это работало отлично в каждом браузере, в котором я проверил его: IE6/7, Firefox, Сафари, Opera.
Обновление: версия jQuery меньше:
Я сделал в основном то же самое, что Вы сделали Адама, но с небольшой модификацией, чтобы удостовериться я прилагал к главному признаку, чтобы сделать работу. Я просто создал включать функцию (кодекс ниже), чтобы обращаться и со сценарием и с css файлами.
Эта функция также проверяет, чтобы удостовериться что сценарий или файл CSS hasn' t уже загруженный динамично. Это не проверяет на закодированные ценности руки и, возможно, был лучший способ сделать это, но это служило цели.
другой потрясающий ответ
https://stackoverflow.com/a/950146/671046
Вот является некоторый пример кода I' ve нашел..., что у кого-либо есть лучший путь?
Если Вам уже загрузили jQuery, Вы должны использовать $ .getScript.
Это имеет преимущество перед другими ответами здесь в этом, у Вас есть построенный в функции обратного вызова (чтобы гарантировать, что сценарий загружен перед подчиненными кодовыми пробегами) и Вы можете управлять кэшированием.
Просто узнанный о замечательной особенности в [YUI 3] [1] (во время написания доступного в выпуске предварительного просмотра). Вы можете легко вставить зависимости в библиотеки YUI и в " external" модули (что Вы ищете) без слишком большого количества кодекса: [Погрузчик YUI] [2].
Это также отвечает на Ваш второй вопрос относительно функции, вызванной, как только внешний модуль загружен.
Пример:
i' ve использовал еще одно решение, которое я нашел в сети..., этот находится под creativecommons, и это проверяет, был ли источник включен до вызывания функции ...
Вы можете найти файл здесь: include.js
Я думаю, просто добавив, что сценарий к телу был бы легче тогда добавление его к последнему узлу на странице. Как насчет этого:
Если Вы хотите СИНХРОНИЗАЦИЯ погрузка сценария, Вы должны добавить текст сценария непосредственно к признаку ГОЛОВЫ HTML. Добавление его как < сценарий src =" myscript.js" > вызовет ASYNC груз. Чтобы загрузить текст сценария от внешнего файла синхронно, используйте XHR. Ниже быстрого образца (это использует части других ответов в этом и других постов):
There' s новое предложил стандарт ECMA, названный динамический импорт, недавно включенный в Хром и Сафари.
Сохраните его хорошим, коротким, простым, и ремонтируемым!:]
Этот кодекс - просто короткий функциональный пример, который мог требовать функциональности дополнительной функции для полной поддержки на любом (или данный) платформа.
Техника, которую мы используем на работе, должна просить файл JavaScript, используя запрос AJAX и затем оценку () возвращение. Если you' ре, пользующееся библиотекой прототипа, они поддерживают эту функциональность в своем Аяксе. Требование запроса.
jQuery решил это для меня с его .append () функция
используемый это, чтобы загрузить полный jQuery ui пакет
/*
ИМЯ ФАЙЛА: project.library.js
ИСПОЛЬЗОВАНИЕ: грузы любая библиотека JavaScript */ вар dirPath = "../js/"; библиотека вара = [" функции js" " swfobject.js" " jQuery jeditable.mini.js" " jQuery ui 1.8.8.custom.min.js\U 0026\quot; " ui/jquery.ui.core.min.js" " ui/jquery.ui.widget.min.js" " ui/jquery.ui.position.min.js" " ui/jquery.ui.button.min.js" " ui/jquery.ui.mouse.min.js" " ui/jquery.ui.dialog.min.js" " ui/jquery.effects.core.min.js" " ui/jquery.effects.blind.min.js" " ui/jquery.effects.fade.min.js" " ui/jquery.effects.slide.min.js" " ui/jquery.effects.transfer.min.js"];
для (сценарий вара в библиотеке) { $ (' head') .append (' < тип сценария =" text/javascript" src =" ' + dirPath + библиотека [сценарий] + ' " > </script> '); }
Использовать - в главе Вашего html/php/etc после того, как Вы импортируете jquery.js, как который Вы просто включали бы этот файл так, чтобы загрузить в полноте Вашей библиотеки, прилагающей его голове...
Я потерян во всех этих образцах, но сегодня я должен был загрузить внешний .js от своего главного .js, и я сделал это:
Здесь простой с поддержкой IE и отзывом:
Я знаю, что мой ответ - бит поздно для этого вопроса, но, здесь является большой статьей в www.html5rocks.com - Глубоко ныряют в темные воды погрузки сценария.
В той статье приходят к заключению, что в отношениях поддержки браузера, лучший способ динамично загрузить файл JavaScript, не блокируя довольный предоставление - следующий путь:
Рассмотрение you' ve четыре сценария, названные 'script1.js, script2.js, script3.js, script4.js' тогда, Вы можете сделать это с применение async = ложный :
Теперь, Спек говорит : Загрузите вместе, выполните в заказе как только вся загрузка.
Firefox < 3.6, в Opera говорится: Я понятия не имею, какова эта «async» вещь, но это именно так происходит, я выполняю сценарии, добавленные через JS в заказе, они добавлены.
Сафари 5.0 говорит: Я понимаю «async», но не понимаю урегулирование это к «ложному» с JS. Я выполню Ваши сценарии, как только они приземляются в любом заказе.
IE < 10 говорит: Никакая идея о «async», но есть работа, используя «onreadystatechange».
Все остальное говорит: я - Ваш друг, мы собираемся сделать это книгой.
Теперь, полный кодекс с IE < 10 работ:
Что-то вроде этого...
Здесь простой пример для функции, чтобы загрузить файлы JS. Важные моменты:
<! - отрывок конца - >
Теперь Вы используете его просто