2016-12-19 13 views
0

В JS связан с страницей XHTML, я создаю новые элементы, используя createElementNS, например:В чем разница между createElementNS с префиксом и без него?

const NS = 'http://my.site/xmlns'; 
const el1 = document.createElementNS(NS, 'custom'); 
const el2 = document.createElementNS(NS, 'p:custom'); 

Я не могу понять, в чем разница между элементом созданным с префиксом пространства имен во втором аргументе и созданные без Это. Например, эти правила CSS имеют одинаковый эффект на оба элементов:

@namespace p url('http://my.site/xmlns'); 
p|custom { background: yellow; } 

Далее вызов document.getElementsByTagNameNS(NS, 'custom') возвращающей HtmlCollection с как элементов, в то время как document.getElementsByTagNameNS(NS, 'p:custom') возвращает пустой HtmlCollection, что кажется мне странным.

Так в чем же разница между созданием элементов с префиксом пространства имен и без него?

ответ

1

document.createElementNS() ожидает, что вторым параметром будет квалифицированное имя тега. p:custom - это квалифицированное имя тега, поэтому document.createElementNS(NS, 'p:custom') вернее; Я подозреваю, что причина document.createElementNS(NS, 'custom') работ связана с унаследованными причинами.

document.getElementsByTagNameNS(), с другой стороны, ожидает, что вторым параметром будет местное имя тега. custom - локальное имя тега. (Если custom не имеет пространства имен, то это также его полное имя.)

Поскольку ваши элементы в пространстве имен, и их квалифицированное имя не p:custom, их местное название custom, и поэтому document.getElementsByTagNameNS(NS, 'p:custom') возвращает ничего, потому что p:custom не их местное имя.

+0

Квалифицированное имя (QName) необязательно должно быть квалифицировано с префиксом пространства имен для 'createElementNS()' для работы, если пространство имен, указанное в первом аргументе, было объявлено с префиксом пространства имен ранее в документе. https://developer.mozilla.org/en-US/docs/Web/API/Document/createElementNS –

+0

@Scott Marcus: Ах, но как получилось? Ни спецификация, ни MDN не указывают это явно, поэтому должно быть что-то, чего я не вижу. – BoltClock

+0

Да, я слышу вас, но страница MDN показывает, что она используется без выраженного QName, но с тем же самым пространством имен, которое уже было объявлено (с префиксом) в документе, поэтому представляется, что если вы указываете пространство имен, которое уже объявлен с префиксом, что новый элемент, который вы укажете, будет неявно иметь правильное QName. –