【问题标题】:What is the difference between createElementNS with a prefix and without it?带前缀和不带前缀的 createElementNS 有什么区别?
【发布时间】:2017-05-04 19:40:30
【问题描述】:

在链接到 XHTML 页面的 JS 中,我使用 createElementNS 创建新元素,如下所示:

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

我不明白在第二个参数中使用命名空间前缀创建的元素与没有它创建的元素之间有什么区别。例如,这些 CSS 规则对 both 元素具有相同的效果:

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

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

那么创建带有命名空间前缀和不使用命名空间前缀的元素有什么区别?

【问题讨论】:

    标签: javascript dom xhtml xml-namespaces


    【解决方案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 不是它们的本地名称。

    【讨论】:

    • 如果第一个参数中指定的命名空间已在前面的文档。 developer.mozilla.org/en-US/docs/Web/API/Document/…
    • @Scott Marcus:啊,但是怎么会呢?规范和 MDN 似乎都没有明确说明这一点,所以一定有我遗漏的东西。
    • 是的,我听到了,但是 MDN 页面确实显示它在没有明确的 QName 的情况下被使用,但是在文档中已经声明了相同的命名空间(带有前缀),所以看起来如果您正在指定一个已经用前缀声明的命名空间,那么您指定的新元素将隐式具有正确的 QName。
    • 此链接:w3.org/TR/xml-names/#NT-QName 似乎表明 QName 是有效的,带或不带前缀。我通过以下链接中的#2(QName 制作)找到了该页面:dom.spec.whatwg.org/#validate
    • 是的,我也是这么理解的。我还看到这个“定义:限定名称是受命名空间解释的名称。” 在此页面上:w3.org/TR/xml-names/#dt-qualname,这(如果您考虑一下)意味着在某些已经用前缀声明的显式命名空间将受到“命名空间解释”的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多