Как я могу сослаться на элемент скрипта, который загрузил JavaScript, который в настоящее время работает?
Вот ситуация. У меня есть «главный» скрипт, загружаемый высоко на странице, в первую очередь под тегом HEAD.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="scripts.js"></script>
В "scripts.js" есть скрипт, который должен уметь загружать другие скрипты по требованию. Обычный метод не совсем подходит для меня, потому что мне нужно добавить новые скрипты без ссылки на тег HEAD, потому что элемент HEAD не закончил рендеринг:
document.getElementsByTagName('head')[0].appendChild(v);
Я хочу сослаться на элемент script, который загрузил текущий скрипт, чтобы затем я мог добавить свои новые динамически загруженные теги script в DOM после него.
<script type="text/javascript" src="scripts.js"></script>
loaded by scripts.js--><script type="text/javascript" src="new_script1.js"></script>
loaded by scripts.js --><script type="text/javascript" src="new_script2.js"></script>
javascript
element
parent
Shog9
источник
источник
Ответы:
Как получить текущий элемент скрипта:
1. Используйте
document.currentScript
document.currentScript
вернет<script>
элемент, чей скрипт в данный момент обрабатывается.Преимущества
defer
&async
)Проблемы
<script type="module">
2. Выберите скрипт по id
Придание скрипту атрибута id позволит вам легко выбрать его по id изнутри использования
document.getElementById()
.Преимущества
defer
&async
)Проблемы
id
Атрибут может вызвать странное поведение для скриптов в некоторых браузерах для некоторых крайних случаев3. Выберите скрипт, используя
data-*
атрибутПридание скрипту
data-*
атрибута позволит вам легко выбрать его изнутри.Это имеет несколько преимуществ по сравнению с предыдущим вариантом.
Преимущества
defer
&async
)Проблемы
querySelector()
не совместим во всех браузерахid
атрибута<script>
сid
крайними случаями.4. Выберите скрипт по src
Вместо использования атрибутов данных вы можете использовать селектор для выбора сценария по источнику:
В embed.js:
Преимущества
defer
&async
)Проблемы
id
атрибута5. Просмотрите все сценарии, чтобы найти нужный.
Мы также можем зациклить каждый элемент скрипта и проверить каждый отдельно, чтобы выбрать тот, который мы хотим:
Это позволяет нам использовать обе предыдущие методики в старых браузерах, которые плохо поддерживают
querySelector()
атрибуты. Например:Это наследует преимущества и проблемы любого подхода, но не полагается на него,
querySelector()
поэтому будет работать в старых браузерах.6. Получить последний выполненный скрипт
Поскольку сценарии выполняются последовательно, последним элементом сценария очень часто будет текущий запущенный сценарий:
Преимущества
Проблемы
defer
&async
)источник
script
находится вtemplate
вставленном в Shadow DOMПоскольку сценарии выполняются последовательно, выполняемый в данный момент тег сценария всегда является последним тегом сценария на странице до тех пор. Итак, чтобы получить тег script, вы можете сделать:
источник
Вероятно, самое простое, что нужно сделать, - это присвоить тегу script
id
атрибут.источник
Скрипты выполняются последовательно, только если они не имеют атрибута «defer» или «async». Знание одного из возможных атрибутов ID / SRC / TITLE тега script может работать и в этих случаях. Так что предложения Грега и Джастина верны.
В
document.currentScript
списках WHATWG уже есть предложение .РЕДАКТИРОВАТЬ : Firefox> 4 уже реализует это очень полезное свойство, но оно недоступно в IE11 в последний раз, когда я проверял, и доступно только в Chrome 29 и Safari 8.
РЕДАКТИРОВАТЬ : Никто не упомянул коллекцию «document.scripts», но я считаю, что следующее может быть хорошей кросс-браузерной альтернативой для получения текущего запущенного скрипта:
источник
Вот немного полифилла, который использует,
document.CurrentScript
если он существует, и возвращается к поиску скрипта по идентификатору.Если вы включите это в начало каждого тега скрипта, я думаю, вы сможете последовательно знать, какой тег скрипта запускается, и вы также сможете ссылаться на тег скрипта в контексте асинхронного обратного вызова.
Не проверено, поэтому оставьте отзыв для других, если вы попробуете.
источник
id
Атрибут недействителен вscript
элементе , хотя. Какие проблемы могут возникнуть при таком подходе?id
атрибут.id
,class
Иslot
определяются на уровне DOM, а не на уровне HTML. Если вы перейдете к глобальным атрибутам в HTML и прокрутите список, вы увидите, что «стандарт DOM определяет требования к пользовательскому агенту для атрибутов class, id и slot для любого элемента в любом пространстве имен». затем «Атрибуты class, id и slot могут быть указаны для всех элементов HTML». Спецификация DOM покрывает это здесь .Он должен работать при загрузке страницы и при добавлении тега сценария с javascript (например, с ajax)
источник
Выполните следующие простые шаги, чтобы получить ссылку на текущий исполняемый блок скрипта:
Пример (ABCDE345678 - уникальный идентификатор) :
Кстати, для вашего случая вы можете просто использовать старомодный метод document.write () для включения другого скрипта. Поскольку вы упомянули, что DOM еще не обработан, вы можете воспользоваться тем, что браузер всегда выполняет сценарий в линейной последовательности (за исключением отложенного, который будет отображаться позже), поэтому остальная часть вашего документа все еще «не существует». Все, что вы пишете через document.write (), будет помещено сразу после скрипта вызывающей стороны.
Пример оригинальной HTML-страницы :
Содержание script.js :
После визуализации структура DOM станет:
источник
Подход к работе с асинхронными и отложенными сценариями заключается в использовании обработчика onload - установите обработчик onload для всех тегов сценария, и первый из них должен быть вашим.
источник
Чтобы получить скрипт, загруженный в данный момент, вы можете использовать
Вам нужно сохранить ссылку в начале вашего скрипта, чтобы вы могли позвонить позже
источник
Рассмотрим этот алгоритм. Когда ваш скрипт загружается (если есть несколько идентичных скриптов), просмотрите document.scripts, найдите первый скрипт с правильным атрибутом «src», сохраните его и пометьте как «посещенный» с атрибутом data или уникальным className.
Когда следующий скрипт загрузится, снова просмотрите файл document.scripts, пропустив любой скрипт, уже помеченный как посещенный. Возьмите первый невидимый экземпляр этого скрипта.
Это предполагает, что идентичные сценарии, вероятно, будут выполняться в том порядке, в котором они загружены, с головы до тела, сверху вниз, с синхронного на асинхронный.
Это просканирует весь сценарий на наличие первого соответствующего сценария, который не помечен специальным атрибутом.
Затем пометьте этот узел, если он найден, атрибутом данных, чтобы при последующем сканировании он не был выбран. Это похоже на алгоритмы обхода графа BFS и DFS, где узлы могут быть помечены как «посещенные» для предотвращения повторного посещения.
источник
У меня есть это, которое работает в FF3, IE6 и 7. Методы в загруженных скриптах по требованию не доступны, пока загрузка страницы не завершится, но это все еще очень полезно.
источник
Если вы можете принять имя файла скрипта, вы можете найти его. Пока что я действительно протестировал только следующую функцию в Firefox.
источник
Я обнаружил, что следующий код является наиболее последовательным, производительным и простым.
источник