現在のスクリプト要素を取得する方法:
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
)で動作
- 動的に挿入されたスクリプトに対応
問題
- script タグにカスタム属性を追加する必要があります
id
属性は、一部のブラウザーで一部のエッジ ケースのスクリプトに奇妙な動作を引き起こす可能性があります。
3.data-*
属性を使用してスクリプトを選択します
スクリプトに属性を与えると、スクリプトdata-*
内から簡単に選択できるようになります。
<script data-name="myscript">
var me = document.querySelector('script[data-name="myscript"]');
</script>
これには、前のオプションよりも利点がほとんどありません。
利点
- シンプルかつ明示的。
- 非同期スクリプト (
defer
& async
)で動作
- 動的に挿入されたスクリプトに対応
問題
- script タグにカスタム属性を追加する必要があります
- HTML5、および
querySelector()
すべてのブラウザで準拠していない
id
属性を使用するよりも広くサポートされていません
- エッジケースを回避
<script>
します。id
- ページ上で別の要素が同じデータ属性と値を持つ場合、混乱する可能性があります。
4. src でスクリプトを選択します
データ属性を使用する代わりに、セレクターを使用してソースごとにスクリプトを選択できます。
<script src="//example.com/embed.js"></script>
埋め込み.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
- 動的に挿入されたスクリプトでは機能しません