これは些細なことでした。
仕様 ( 8.4 Parsing HTML fragmentおよび8.2.3.5 Other parsing state flags ) で述べられているように、以下を引用します。
innerHTML
ブラウザを使用する場合
新しいドキュメント ノードを作成し、それを HTML ドキュメントとしてマークします。
コンテキスト要素があり、コンテキスト要素の Document が quirks モードの場合、Document を quirks モードにします。それ以外の場合、コンテキスト要素があり、コンテキスト要素のドキュメントが限定互換モードの場合、ドキュメントを限定互換モードにします。それ以外の場合は、ドキュメントを非互換モードのままにします。
新しい HTML パーサーを作成し、作成したばかりの Document ノードに関連付けます。...
<script>
内部を解析するとき
パーサーが作成されたときにパーサーが関連付けられているドキュメントに対してスクリプトが有効になっている場合、スクリプト フラグは「有効」に設定され、それ以外の場合は「無効」に設定されます。
スクリプト フラグは、パーサーが元々 HTML フラグメント解析アルゴリズム用に作成された場合でも有効にすることができます (その場合、スクリプト要素は実行されません)。
で注入する限り、実行されませんinnerHTML
。
また、使用すると、作成された要素が永続的に実行されるのinnerHTML
を防ぎます。 <script>
仕様 ( 4.3.1 The script element ) に記載されているように、引用:
src、type、charset、async、および defer 属性を動的に変更しても、直接的な影響はありません。これらの属性は、以下で説明する特定の時間にのみ使用されます。
以下で説明する結論は、をsrc
に注入するときにのみ属性を解析するということです (を使用したときに作成された一時的なものを含め、どれであっても)。<script>
document
innerHTML
そのため、ドキュメントにスクリプトを挿入して実行したい場合は、 を使用する必要がありますscript = document.createElement('script')
。
src
とのような属性を設定しtype
、場合によっては ( を使用して) 内部の内容を設定しscript.appendChild(document.createTextNode(content))
、 に追加しますdocument.body
。