Встроенный SVG в документе HTML рассматривается синтаксическим анализатором как внешний элемент . Затем его содержимое анализируется анализатором SVG, и, таким образом, все содержимое этого SVGElement анализируется как SVG.
SVG имеет свое собственное определение элемента , и здесь у вас есть SVGScriptElement, а не HTML:
<svg>
<script>
const thisScript = document.currentScript;
console.log('HTMLScriptElement?', thisScript instanceof HTMLScriptElement); // false
console.log('SVGScriptElement?', thisScript instanceof SVGScriptElement); // true
</script>
</svg>
Теперь, что касается того, почему содержимое элемента <svg:script>
анализируется так, как если бы он был XML, прежде чем он будет выполнен, нам нужно немного вернуться назад во времени.
SVG1.1 определил его элемент как
Категория:
Ни один
Модель содержимого:
Любые элементы или символьные данные.
Атрибуты: ...
Это означает, что SVG1.1, в отличие от HTML, позволяет своему элементу иметь другое содержимое, нежели символьные данные . (HTML4 определил модель содержимого сценария как Данные сценария , которые в конечном итоге сопоставлены с CDATA ).
SVG tiny 1.2 с тех пор последовал за HTML и действительно обрабатывает контент как символьные данные, но, к сожалению, браузеры реализовали только vector-эффекты из этой бедной версии tiny1.2, поэтому разбираем скрипт тег все еще сделан согласно 1.1 правилам.
[Но входящий SVG2] (https://www.w3.org/TR/SVG/interact.html#ScriptElement должен следовать здесь, пока он еще обсуждается, что означает, что в ближайшем будущем нам больше не нужно будет оборачивать наш код в блоки //<![CDATA[
, даже если это будет решение для вашего случая:
<svg>
<script>
console.log("out", ">"); // >
//<![CDATA[
// ^- this forces the SVG parser to treat the content as Character Data
console.log("in", ">"); // >
//]]>
</script>
</svg>
Однако будьте осторожны, блоки <![CDATA[
недопустимы в HTML (отсюда //
js комментарии), за исключением внешних элементов , таких как SVG и MathML, поэтому вместо этого вы можете просто захотеть переместите свой скрипт из элемента , чтобы он был частью вашего HTML-документа напрямую.