[JavaScript] バグる 自分自身の script 要素を取得するコード
script タグを追記するタイプのブログパーツを導入しようとしたところ不具合が出たので調べてみました。
script 要素を追加して、src に渡されたパラメーターや、自分の周りに動的にいろいろな要素を追加するというのは、よくあると思いますが、自分自身の script 要素を document の最後にある script 要素としているコードはバグります。
検索するとよくあるコードみたいです。
- JavaScript – 自分自身のscriptタグを取得する – Qiita
- 外部ファイルのスクリプトに引数を渡す方法 | JavaScript プログラミング解説
- とてもシンプルに自分自身が属する script 要素を取得 – IT戦記
不具合のある自分自身の script 要素を取得するコード
document から script 要素を取得して、配列の末尾を自分自身としています。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function () { | |
var scripts = document.getElementsByTagName('script'); | |
var src = scripts[scripts.length – 1].src; | |
console.log("私は " + src); | |
})(); |
不具合の出るパターン
自分自身の src を表示するコード(foo.js)の前に、script 要素を document に追加するコードがあります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<body> | |
<div> | |
<script> | |
(function () { | |
var j = document.createElement("script"); | |
j.src = "http://localhost/dummy.js"; | |
document.body.appendChild(j); | |
})(); | |
</script> | |
<script src="foo.js"></script> | |
</div> | |
</body> | |
</html> |
結果
ちなみに、<script src="foo.js"></script>
を div タグの外側に置くと自分自身を取得できますが、ブログパーツ用としては使えません。
さらにちなみに、今回 script 要素を動的に追加してたのは、Zenback でした。