Как вы можете надежно и динамически загрузить файл JavaScript? Это может быть использовано для реализации модуля или компонента, который при «инициализации» будет динамически загружать все необходимые скрипты библиотеки JavaScript по требованию.
Клиент, использующий компонент, не обязан загружать все файлы сценариев библиотеки (и вручную вставлять <script>
теги на свою веб-страницу), которые реализуют этот компонент, - только файл сценария основного компонента.
Как основные библиотеки JavaScript выполняют это (Prototype, jQuery и т. Д.)? Объединяют ли эти инструменты несколько файлов JavaScript в единую распространяемую версию файла сценария для сборки? Или они выполняют динамическую загрузку вспомогательных «библиотечных» скриптов?
Дополнение к этому вопросу: есть ли способ обработать событие после загрузки динамически включенного файла JavaScript? Прототип document.observe
для событий всего документа. Пример:
document.observe("dom:loaded", function() {
// initially hide all containers for tab content
$$('div.tabcontent').invoke('hide');
});
Каковы доступные события для элемента скрипта?
источник
Ответы:
Вы можете написать динамические теги сценария (используя Prototype ):
Проблема в том, что мы не знаем, когда внешний файл скрипта будет полностью загружен.
Мы часто хотим, чтобы наш зависимый код был в следующей строке, и нам нравится писать что-то вроде:
Существует умный способ внедрить зависимости скрипта без необходимости обратных вызовов. Вам просто нужно вытащить скрипт через синхронный AJAX-запрос и проверить скрипт на глобальном уровне.
Если вы используете Prototype, метод Script.load выглядит так:
источник
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)web.archive.org
.В javascript нет импорта / включения / запроса, но есть два основных способа достичь желаемого:
1 - Вы можете загрузить его с помощью вызова AJAX, а затем использовать eval.
Это самый простой способ, но он ограничен вашим доменом из-за настроек безопасности Javascript, а использование eval открывает путь к ошибкам и взломам.
2 - Добавьте тег сценария с URL-адресом сценария в HTML.
Определенно лучший путь. Вы можете загрузить скрипт даже с чужого сервера, и он чист, поскольку вы используете анализатор браузера для оценки кода. Вы можете поместить тег в заголовок веб-страницы или внизу тела.
Оба эти решения обсуждаются и иллюстрируются здесь.
Теперь есть большая проблема, о которой вы должны знать. Это подразумевает, что вы загружаете код удаленно. Современные веб-браузеры загружают файл и продолжают выполнять ваш текущий скрипт, потому что они загружают все асинхронно для улучшения производительности.
Это означает, что если вы будете использовать эти приемы напрямую, вы не сможете использовать свой недавно загруженный код на следующей строке после того, как вы попросили его загрузить, потому что он все еще будет загружаться.
Например: my_lovely_script.js содержит MySuperObject
Затем вы перезагрузите страницу, нажав F5. И это работает! Смешение ...
Так что с этим делать?
Ну, вы можете использовать взлом, который предлагает автор, по ссылке, которую я вам дал. Таким образом, для спешащих людей он использует событие en для запуска функции обратного вызова при загрузке скрипта. Таким образом, вы можете поместить весь код с помощью удаленной библиотеки в функцию обратного вызова. EG:
Затем вы пишете код, который хотите использовать ПОСЛЕ того, как скрипт загружается в лямбда-функцию:
Затем вы запускаете все это:
Ладно, я понял. Но писать все эти вещи - боль.
Ну, в этом случае вы можете использовать как всегда фантастический бесплатный фреймворк jQuery, который позволяет вам делать то же самое в одной строке:
источник
Недавно я использовал гораздо менее сложную версию с jQuery :
Он отлично работал в каждом браузере, в котором я его тестировал: IE6 / 7, Firefox, Safari, Opera.
Обновление: версия без jQuery:
источник
$.getScript
. Смотри мой ответ.Я сделал в основном то же самое, что вы сделали Адам, но с небольшим изменением, чтобы убедиться, что я добавляю тег head, чтобы выполнить работу. Я просто создал функцию включения (код ниже) для обработки как скриптов, так и CSS-файлов.
Эта функция также проверяет, что скрипт или файл CSS еще не были загружены динамически. Он не проверяет значения, закодированные вручную, и, возможно, был лучший способ сделать это, но он служил цели.
источник
еще один потрясающий ответ
https://stackoverflow.com/a/950146/671046
источник
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Вот пример кода, который я нашел ... у кого-нибудь есть лучший способ?
источник
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Если вы уже загрузили jQuery, вы должны использовать $ .getScript .
Это имеет преимущество перед другими ответами здесь в том, что у вас есть встроенная функция обратного вызова (чтобы гарантировать, что скрипт загружается до запуска зависимого кода), и вы можете контролировать кэширование.
источник
Если вы хотите загрузить скрипт SYNC , вам нужно добавить текст скрипта непосредственно в тег HTML HEAD. Добавление его как вызовет загрузку ASYNC . Чтобы синхронно загрузить текст скрипта из внешнего файла, используйте XHR. Ниже приведен краткий пример (он использует части других ответов в этом и других постах):
источник
Я думаю, что просто добавить скрипт в тело было бы проще, чем добавить его в последний узел на странице. Как насчет этого:
источник
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Я использовал еще одно решение, которое я нашел в сети ... Это находится под CreativeCommons, и он проверяет, был ли источник включен до вызова функции ...
Вы можете найти файл здесь: include.js
источник
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Только что узнал о замечательной функции в YUI 3 (на момент написания доступна в предварительной версии). Вы можете легко вставлять зависимости в библиотеки YUI и «внешние» модули (то, что вы ищете) без слишком большого количества кода: YUI Loader .
Он также отвечает на ваш второй вопрос о вызываемой функции, как только загружается внешний модуль.
Пример:
Работал отлично для меня и имеет преимущество управления зависимостями. Обратитесь к документации YUI за примером с календарем YUI 2 .
источник
Существует новый предложенный стандарт ECMA под названием динамический импорт , недавно включенный в Chrome и Safari.
источник
Техника, которую мы используем на работе, состоит в том, чтобы запросить файл javascript с помощью AJAX-запроса, а затем eval (). Если вы используете библиотеку прототипов, они поддерживают эту функцию в своем вызове Ajax.Request.
источник
jquery разрешил это для меня с помощью функции .append () - использовал это для загрузки полного пакета jquery ui
Использовать - в заголовке вашего html / php / etc после импорта jquery.js вы просто включите этот файл, чтобы загрузить всю библиотеку и добавить ее в заголовок ...
источник
Делайте это красиво, коротко, просто и легко! :]
Этот код является просто кратким функциональным примером, который может потребовать дополнительных функциональных возможностей для полной поддержки на любой (или данной) платформе.
источник
Динамический модуль импорта появился в Firefox 67+ .
С обработкой ошибок:
Это также работает для любого вида немодульных библиотек, в этом случае библиотека доступна на объекте окна, по-старому, но только по требованию, что приятно.
Например, используя suncalc.js , на сервере должна быть включена поддержка CORS !
https://caniuse.com/#feat=es6-module-dynamic-import
источник
Есть сценарии, которые предназначены специально для этой цели.
yepnope.js встроен в Modernizr, а lab.js - более оптимизированная (но менее удобная для пользователя версия).
Я бы не советовал делать это с большой библиотекой, такой как jquery или прототип - потому что одно из основных преимуществ загрузчика скриптов - это возможность загружать скрипты рано - вам не нужно ждать, пока jquery и все ваши элементы dom загрузятся, прежде чем запустить проверку, чтобы увидеть, хотите ли вы динамически загрузить скрипт.
источник
Я написал простой модуль, который автоматизирует работу по импорту / включению скриптов модуля в JavaScript. Попробуйте и оставьте отзыв! :) Для подробного объяснения кода обратитесь к этому сообщению в блоге: http://stamat.wordpress.com/2013/04/12/javascript-require-import-include-modules/
источник
Я потерян во всех этих примерах, но сегодня мне нужно было загрузить внешний .js из моего основного .js, и я сделал это:
источник
Вот простой с обратным вызовом и поддержкой IE:
источник
Я знаю, что мой ответ немного запоздал на этот вопрос, но вот отличная статья на www.html5rocks.com - Глубокое погружение в мутные воды загрузки скриптов .
В этой статье делается вывод о том, что в отношении поддержки браузера лучший способ динамической загрузки файла JavaScript без блокировки отображения контента заключается в следующем:
Учитывая, что вы назвали четыре сценария,
script1.js, script2.js, script3.js, script4.js
вы можете сделать это с помощью async = false :Теперь, Spec говорит : скачать вместе, выполнить по порядку, как только все загрузки.
Firefox <3.6, Opera говорит: я понятия не имею, что это за «асинхронная» вещь, но так получилось, что я выполняю сценарии, добавленные через JS, в порядке их добавления.
Safari 5.0 говорит: « Я понимаю« асинхронный », но не понимаю, как установить« ложный »с JS. Я выполню ваши сценарии, как только они приземлятся, в любом порядке.
IE <10 говорит: нет понятия об «асинхронности», но есть обходной путь, использующий «onreadystatechange».
Все остальное говорит: я твой друг, мы собираемся сделать это по книге.
Теперь полный код с IE <10:
Несколько трюков и минимизация позже, это 362 байта
источник
Что-то вроде этого...
источник
Вот простой пример для функции загрузки файлов JS. Соответствующие пункты:
$.ajax
или$.getScript
вы можете использовать одноразовые номера, решая, таким образом, проблемы с CSPunsafe-inline
. Просто используйте собственностьscript.nonce
Теперь вы используете его просто
источник
Абсурдная строчка, для тех, кто считает, что загрузка библиотеки js не должна занимать больше одной строки кода: P
Очевидно, что если скрипт, который вы хотите импортировать, является модулем, вы можете использовать
import(...)
функцию.источник
С Promises вы можете упростить это, как это. Функция загрузчика:
Использование (async / await):
Использование (обещание):
ПРИМЕЧАНИЕ: было одно подобное решение, но оно не проверяет, загружен ли уже скрипт, и загружает скрипт каждый раз. Этот проверяет свойство src.
источник
все основные библиотеки javascript, такие как jscript, prototype, YUI, поддерживают загрузку файлов сценариев. Например, в YUI после загрузки ядра вы можете сделать следующее, чтобы загрузить элемент управления календаря.
источник
Я подправил некоторые из вышеприведенного поста с рабочим примером. Здесь мы можем дать CSS и JS в том же массиве также.
источник
Для тех из вас, кто любит однострочники:
Скорее всего, вы можете получить ошибку, например:
В этом случае вы можете вернуться к:
источник