Как получить текущий элемент скрипта:
1. Используйте document.currentScript
document.currentScript
вернет элемент <script>
, сценарий которого в данный момент обрабатывается.
<script>
var me = document.currentScript;
</script>
Преимущества
- Просто и явно. Надежный.
- Не нужно изменять тег сценария
- Работает с асинхронными сценариями (
defer
& async
)
- Работает со скриптами, вставляемыми динамически
Проблемы
- Не будет работать в старых браузерах и IE.
2. Выбрать скрипт по id
Предоставление скрипту атрибута id позволит вам легко выбрать его по id изнутри, используя document.getElementById()
.
<script id="myscript">
var me = document.getElementById('myscript');
</script>
Преимущества
- Просто и явно. Надежный.
- Почти повсеместно поддерживается
- Работает с асинхронными сценариями (
defer
& async
)
- Работает со скриптами, вставляемыми динамически
Проблемы
- Требуется добавить пользовательский атрибут в тег скрипта
id
Атрибут может вызвать странное поведение для скриптов в некоторых браузерах для некоторых крайних случаев
3. Выберите скрипт, используя атрибут data-*
Предоставление сценарию атрибута data-*
позволит вам легко выбрать его изнутри.
<script data-name="myscript">
var me = document.querySelector('script[data-name="myscript"]');
</script>
Это имеет несколько преимуществ по сравнению с предыдущим вариантом.
Преимущества
- Просто и явно.
- Работает с асинхронными сценариями (
defer
& async
)
- Работает со скриптами, вставляемыми динамически
Проблемы
- Требуется добавить пользовательский атрибут в тег скрипта
- HTML5 и
querySelector()
не совместимы во всех браузерах
- Менее широко поддерживается, чем использование атрибута
id
- Обойдется
<script>
с id
крайними случаями.
- Может запутаться, если другой элемент имеет такой же атрибут данных и значение на странице.
4. Выберите скрипт по src
Вместо использования атрибутов данных вы можете использовать селектор для выбора сценария по источнику:
<script src="//example.com/embed.js"></script>
В embed.js:
var me = document.querySelector('script[src="//example.com/embed.js"]');
Преимущества
- Надежный
- Работает с асинхронными сценариями (
defer
& async
)
- Работает со скриптами, вставляемыми динамически
- Не требуется пользовательских атрибутов или идентификатора
Проблемы
- Работает ли не для локальных сценариев
- Будет причиной проблем в различных средах, таких как разработка и производство
- Статично и хрупко. Изменение местоположения файла скрипта потребует модификации скрипта
- Менее широко поддерживается, чем использование атрибута
id
- Будет причиной проблем, если вы загрузите один и тот же скрипт дважды
5. Переберите все скрипты, чтобы найти тот, который вам нужен
Мы также можем перебрать каждый элемент скрипта и проверить каждый отдельно, чтобы выбрать тот, который нам нужен:
<script>
var me = null;
var scripts = document.getElementsByTagName("script")
for (var i = 0; i < scripts.length; ++i) {
if( isMe(scripts[i])){
me = scripts[i];
}
}
</script>
Это позволяет нам использовать оба предыдущих метода в старых браузерах, которые не поддерживают querySelector()
хорошо с атрибутами. Например:
function isMe(scriptElem){
return scriptElem.getAttribute('src') === "//example.com/embed.js";
}
Это наследует преимущества и проблемы любого подхода, но не основывается на querySelector()
, поэтому будет работать в старых браузерах.
6. Получить последний выполненный скрипт
Поскольку сценарии выполняются последовательно, последним элементом сценария очень часто будет текущий запущенный сценарий:
<script>
var scripts = document.getElementsByTagName( 'script' );
var me = scripts[ scripts.length - 1 ];
</script>
Преимущества
- Simple.
- Почти повсеместно поддерживается
- Не требуется пользовательских атрибутов или идентификатора
Проблемы
- Работает ли * с асинхронными сценариями (
defer
& async
)
- Работает ли не со сценариями, вставляемыми динамически