带前缀和不带前缀的createElementNS有什么区别?

What is the difference between createElementNS with a prefix and without it?

提问人: 提问时间:12/20/2016 最后编辑:BoltClock 更新时间:12/20/2016 访问量:780

问:

在链接到 XHTML 页面的 JS 中,我使用 创建新元素,如下所示: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; }

接下来,调用 of 返回包含两个元素的 a,而返回一个空的 ,这对我来说似乎很奇怪。document.getElementsByTagNameNS(NS, 'custom')HtmlCollectiondocument.getElementsByTagNameNS(NS, 'p:custom')HtmlCollection

那么,创建带有命名空间前缀的元素和没有命名空间前缀的元素有什么区别呢?

javascript dom xhtml xml命名空间

评论


答:

0赞 BoltClock 12/20/2016 #1

document.createElementNS() 要求第二个参数是限定的标记名称。 是一个限定的标签名称,所以更正确;我怀疑之所以有效是由于遗留原因。p:customdocument.createElementNS(NS, 'p:custom')document.createElementNS(NS, 'custom')

另一方面,document.getElementsByTagNameNS() 期望第二个参数是本地标签名称。 是本地标记名称。(如果没有命名空间,则它也是其限定的名称。customcustom

由于元素是命名空间的,并且它们的限定名称是 ,因此它们的本地名称是 ,因此不返回任何内容,因为不是它们的本地名称。p:customcustomdocument.getElementsByTagNameNS(NS, 'p:custom')p:custom

评论

1赞 Scott Marcus 12/20/2016
如果第一个参数中指定的命名空间已在文档前面使用命名空间前缀声明,则限定名称 (QName) 不一定必须使用命名空间前缀进行限定才能工作。developer.mozilla.org/en-US/docs/Web/API/Document/......createElementNS()
0赞 BoltClock 12/20/2016
@Scott Marcus:啊,但怎么会这样呢?规范和 MDN 似乎都没有明确说明这一点,所以我一定遗漏了什么。
0赞 Scott Marcus 12/20/2016
是的,我听到了,但是 MDN 页面确实显示它是在没有表达的 QName 的情况下使用的,但已经在文档中声明了相同的命名空间(带有前缀),因此,如果您指定了一个已经使用前缀声明的命名空间,那么您指定的新元素, 将隐式具有正确的 QName。
0赞 Scott Marcus 12/20/2016
此链接:w3.org/TR/xml-names/#NT-QName 似乎确实表明 QName 在有或没有前缀的情况下都是有效的。我通过以下链接中的#2(QName production)找到了该页面:dom.spec.whatwg.org/#validate
1赞 Scott Marcus 12/20/2016
是的,我也是这样解释的。我还在此页面上看到这个“定义:限定名称是受命名空间解释约束的名称”:w3.org/TR/xml-names/#dt-qualname,这(如果您考虑一下)意味着在某个已经使用前缀声明的显式命名空间中创建的新元素将受到“命名空间解释”的约束。