Як отримати поточний елемент сценарію:
1. Використовуйте document.currentScript
document.currentScript
поверне <script>
елемент, сценарій якого зараз обробляється.
<script>
var me = document.currentScript;
</script>
Переваги
- Просте і явне. Надійний.
- Не потрібно змінювати тег сценарію
- Працює з асинхронними сценаріями (
defer
& async
)
- Працює зі сценаріями, вставленими динамічно
Проблеми
- Не працюватимуть у старих браузерах та IE.
- Не працює з модулями
<script type="module">
2. Виберіть сценарій за ідентифікатором
Надання сценарію атрибута 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>
Переваги
- Простий.
- Майже повсюдно підтримується
- Не потрібні спеціальні атрибути чи ідентифікатор
Проблеми
- Хто НЕ працює з асинхронними скриптами (
defer
& async
)
- Чи має НЕ працювати зі сценаріями , вставлених динамічно