Так что я нашел ответ сам. TL; DR : элемент был создан с document.createElementNS
с неизвестным пространством имен (или пустым), что сделало его Element
, а не SVGElement
.Стили не определены для base Elements
в соответствии со спецификацией.
Таким образом, очевидно, что ключ должен был проверить тип элемента - и Chrome, и Firefox показали, что SVG создан как base * 1009.*:
![Element is created as a base Element, rather than an HTMLElement or SVGElement](https://i.stack.imgur.com/qXyCS.png)
Следующий вопрос: как это произошло?TL; DR для этого раздела: из-за ошибки в новом экспериментальном компиляторе Angular (возможно) он был добавлен с недопустимым пространством имен, а остальное соответствует спецификации.
Поиск в источнике Angular показал, как он создает элементы: createElementNS .
Быстрый эксперимент с этой функцией подтвердил первоначальное предположение, что проблема была в интерфейсе элемента (Element
), и ее можно воспроизвести, передав недопустимое пространство имен.
И спецификация DOM точно показала, почему это происходит:
шаги createElementNS :
внутренние шаги createElementNS ...:...4. Вернуть результат создания элемента данного документа, localName, namespace , префикс is и с установленным флагом синхронных пользовательских элементов.
Создание элемента определяется следующим образом:
Чтобы создать элемент с заданным документом, localName, пространством имен и необязательным префиксом is и флагом синхронных пользовательских элементов, запустите этишаги:...4. Пусть definition будет результатом поиска пользовательского определения элемента в данном документе, namespace , localName и is.
Looked upопределение в этом случае оказывается NULL
:
Чтобы найти пользовательское определение элемента, заданного документа, пространства имен, localName и, выполните следующие действия.Они вернут либо пользовательское определение элемента, либо ноль:1. Если пространство имен не является пространством имен HTML, возвращает ноль .
Возвращаясь к createElementNS
шагам до этого:
...7. В противном случае: [определение равно нулю]
- Пусть interface будет элементом interface для localName и пространства имен.
- Установить результат для нового элемента, который реализует интерфейс , без атрибутов, для пространства имен задано пространство имен, для префикса пространства имен задан префикс, для локального имени задано значение localName, для пользовательского состояния элемента задано значение "uncustomized"msgstr ", определение пользовательского элемента установлено в ноль, значение установлено в is, а документ узла установлен в document....
И, наконец, 1087 * интерфейс элемента определяется следующим образом: :
Интерфейс элемента для любого имени и пространства имен - Элемент , если не указано иное.
Что касается невозможности добавления пользовательских стилей, это связано с отсутствующим свойством style
вбаза Element
.Вероятно, это связано со спецификацией атрибута style
:
Все HTML-элементы могут иметь установленный атрибут содержимого стиля.Это атрибут стиля, определенный в спецификации атрибутов стиля CSS.
HTML-элементы :
Для упрощенияПри переходе с HTML на XML UA, соответствующие этой спецификации, будут помещать элементы в HTML в пространство имен http://www.w3.org/1999/xhtml, по крайней мере, для целей DOM и CSS.Термин «элементы HTML» относится к любому элементу в этом пространстве имен, даже в документах XML.
Однако свойство style
существует в SVGElement
и, возможно, в некоторых других базовых прототипах, поэтому необходимобыть некоторые другие спецификации, которые позволяют это.Но я думал, что это выходит за рамки моего первоначального вопроса.
И на этом мои исследования заканчиваются.