createElement与createElementNS

CoR*_*CoR 60 javascript html5 dom namespaces

这两者之间真正的区别是什么?我的意思是真正的本质区别.常规的未来是createElement什么?

Svg是xml,而不是html.我明白了.所以我们使用createElementNS(ns_string, 'svg') 然后setAttributeNS(null,,).为什么?为什么不setAttributeNS('my_ns',,)呢?

为什么一定ns_stringhttp://www.w3.org/2000/svg而不是一些随机字符串?如果只有一个命名空间,命名空间的目的是什么?

ns常规html 的目的是什么?我应该在现有代码中更改createElementto的所有实例createElementNS吗?

我正在阅读DOM-Level-2规范.但我仍然感到困惑.

Mik*_*uel 48

要了解命名空间试图解决的问题,请考虑文件扩展名.3个字母的文件扩展名在描述文件内容方面做得非常糟糕.它们含糊不清,不带版本信息.XML名称空间使用更大的字符串,URI来解决相同的问题,并使用简短的前缀,因此您可以在同一文档中简洁地混合多种XML.

如果只有一个名称空间,命名空间的目的是什么?

有许多名称空间用于标识不同类型的XML,以及这些类型的不同版本.

SVG和MathML是两种XML,每种都有自己的命名空间,可以嵌入到HTML5中,它们通常使用另一个XML命名空间XLink.许多其他具有相应名称空间的XML模式用于在客户端和服务器之间传递消息以及用于数据存储.

XHTML试图将HTML表达为有效的XML.它有自己的命名空间.

所以我们使用createElementNS(ns_string,'svg')然后使用setAttributeNS(null ,,).为什么?为什么不setAttributeNS('my_ns',,)???

setAttributeNS在使用命名空间URI时,您应该尝试始终使用命名createElementNS空间URI.

XML是通过多个步骤定义的.该规范的第一个版本没有提到名称空间,但留下了足够的语法,以便通过使用前缀和特殊xmlns属性,可以在没有名称空间的XML上指定具有名称空间的XML .该XML规范说:

"XML建议书[XML名称]中的命名空间为包含冒号字符的名称赋予了含义.因此,除了命名空间之外,作者不应在XML名称中使用冒号,但XML处理器必须接受冒号作为名称字符."

XML名称空间允许XML处理应用程序知道它们正在处理什么,并允许多种XML在同一文档中混合在一起.

为什么ns_string必须是" http://www.w3.org/2000/svg "

这包括SVG版本标准化的年份,2000年,因此它携带有用的信息.

当与xmlns:svg它一起使用时,也让浏览器知道svg:前缀意味着SVG而不是XML的其他方言.

  • @CoR,You*do*对常规DOM元素使用名称空间,但仅限于它们不在默认名称空间中.在XHTML文件中,默认命名空间是隐式的,在SVG或XML文件中,它不是. (3认同)
  • @zzzzBov,我同意.我很困惑"在一个XHTML文件中,[但]在SVG或XML文件中",因为SVG和XHTML是XML.我会发现"猫是毛茸茸的,但青蛙和动物不是因为同样的原因而混淆". (3认同)
  • 嗯,所以仅仅 <svg></svg> 是不够的。它必须有一个合适的 xml 命名空间才能成为“真正的”svg……为什么我们不为常规 dom 元素使用命名空间?喜欢 <div> <span> (2认同)
  • @CoR,`<svg>`对于HTML 5解析器来说可能已经足够了,XML渲染器可以使用上下文来告诉它它是一个SVG根元素,但是如果你有一个处理许多不同类型内容的XML解析器,应该使用名称空间.请参阅我刚才添加到答案中的第一段. (2认同)
  • @MikeSamuel,好点.让我编辑说:"SVG或**任何其他XML**文件"我的意思是`XML`在通用中,文件名以`.xml`结尾. (2认同)