現在のスクリプト要素を取得する方法:
1.使用 document.currentScript
document.currentScript
<script>
スクリプトが現在処理されている要素を返します。
<script>
var me = document.currentScript;
</script>
利点
- シンプルで明示的。信頼性のある。
- スクリプトタグを変更する必要はありません
- 非同期スクリプト(
defer
&async
)で動作します
- 動的に挿入されたスクリプトで動作します
問題
- 古いブラウザとIEでは機能しません。
- モジュールでは機能しません
<script type="module">
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は不要
問題
- しないローカルスクリプトで
- 開発や本番など、さまざまな環境で問題が発生します
- 静的で壊れやすい。スクリプトファイルの場所を変更するには、スクリプトを変更する必要があります
- を使用するよりも広くサポートされていません
id
属性ません
- 同じスクリプトを2回ロードすると問題が発生します
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>
利点
- シンプル。
- ほとんど普遍的にサポートされています
- カスタム属性やIDは不要
問題
- 非同期スクリプト(&)では機能しません
defer
async
- 動的に挿入されたスクリプトでは機能しません