JavaScript中SVG节点的简洁构造

JavaScript中SVG节点的简洁构造,javascript,dom,svg,Javascript,Dom,Svg,考虑以下SVG块: 创建这些元素的对应JavaScript是: var defs=document.createElements('http://www.w3.org/2000/svg","defs",; var radialGradient=document.createElements('http://www.w3.org/2000/svg","标记",; radialGradient.id='梯度'; setAttribute('cx','50%'); setAttribute('cy

考虑以下SVG块:


创建这些元素的对应JavaScript是:

var defs=document.createElements('http://www.w3.org/2000/svg","defs",;
var radialGradient=document.createElements('http://www.w3.org/2000/svg","标记",;
radialGradient.id='梯度';
setAttribute('cx','50%');
setAttribute('cy','50%');
setAttribute('fx','50%');
setAttribute('fy','50%');
setAttribute('r','50%');
var stop1=document.createElements('http://www.w3.org/2000/svg","路径",;
stop1.setAttribute('offset','0%');
stop1.setAttribute('style','stop color:#568f82;stop opacity:1');
径向梯度。附属物(stop1);
var stop2=document.createElements('http://www.w3.org/2000/svg","路径",;
stop2.setAttribute('offset','100%');
stop2.setAttribute('style','stop color:#568f82;stop opacity:0');
径向梯度。附属物(stop2);
defs.appendChild(径向梯度);
this.svgElement.appendChild(defs);
有没有办法在JavaScript中内联使用XML标记?我尝试过类似以下的东西,但没有任何运气:

var defs=document.createElements('http://www.w3.org/2000/svg","defs",;
defs.innerHTML=
'' +
'    ' +
'    ' +
'';
似乎
innerHTML
不是
SVGElement
的属性

var parser = new DOMParser();
var doc = parser.parseFromString(stringContainingXMLSource, "image/svg+xml");
请注意,父节点需要有一个显式名称空间,以便正确解析它,即字符串需要如下所示:

var stringContainingXMLSource = '<radialGradient xmlns="http://www.w3.org/2000/svg" id="gradient" ...
一些UAs也允许doc.rootElement而不是doc.documentElement,但显然不是全部

请注意,父节点需要有一个显式名称空间,以便正确解析它,即字符串需要如下所示:

var stringContainingXMLSource = '<radialGradient xmlns="http://www.w3.org/2000/svg" id="gradient" ...
一些UAs也允许doc.rootElement而不是doc.documentElement,但显然不是全部

请注意,父节点需要有一个显式名称空间,以便正确解析它,即字符串需要如下所示:

var stringContainingXMLSource = '<radialGradient xmlns="http://www.w3.org/2000/svg" id="gradient" ...
一些UAs也允许doc.rootElement而不是doc.documentElement,但显然不是全部

请注意,父节点需要有一个显式名称空间,以便正确解析它,即字符串需要如下所示:

var stringContainingXMLSource = '<radialGradient xmlns="http://www.w3.org/2000/svg" id="gradient" ...

一些UAs也允许doc.rootElement而不是doc.documentElement,但显然不是全部。

没有直接标记属性,但您可以使用
DOMParser.parseFromString()
将一些XML解析为新的SVG文档,并跨它导入
importNode
。或者,您可以使用
innerHTML
设置容器HTML元素的内容,并从结果中提取SVG节点

但是,一旦您想要引入可变内容或属性值,字符串挂起就会变得有点麻烦,很容易在不记住正确转义的情况下进行字符串连接,从而导致跨站点脚本问题。如果可以的话,能够将所有东西都保存在对象和属性的世界中,而不是编码的标记中,这很好

诚然,uber verbose DOM API并没有让这变得容易,但您可以编写快捷函数来为自己调用DOM方法,这样您就可以编写如下内容:

xml(SVG, 'defs', {}, [
    xml(SVG, 'radialGradient', {id: 'gradient', cx: '50%', cy: '50%', fx: '50%', fy: '50%' r: '50%'}, [
        xml(SVG, 'path', {offset:   '0%', 'stop-color': '#568f82', 'stop-opacity': 1}),
        xml(SVG, 'path', {offset: '100%', 'stop-color': '#568f82', 'stop-opacity': 0})
    ])
])

这更容易处理。

没有直接标记属性,但您可以使用
DOMParser.parseFromString()
将一些XML解析为新的SVG文档,并跨它导入
importNode
。或者,您可以使用
innerHTML
设置容器HTML元素的内容,并从结果中提取SVG节点

但是,一旦您想要引入可变内容或属性值,字符串挂起就会变得有点麻烦,很容易在不记住正确转义的情况下进行字符串连接,从而导致跨站点脚本问题。如果可以的话,能够将所有东西都保存在对象和属性的世界中,而不是编码的标记中,这很好

诚然,uber verbose DOM API并没有让这变得容易,但您可以编写快捷函数来为自己调用DOM方法,这样您就可以编写如下内容:

xml(SVG, 'defs', {}, [
    xml(SVG, 'radialGradient', {id: 'gradient', cx: '50%', cy: '50%', fx: '50%', fy: '50%' r: '50%'}, [
        xml(SVG, 'path', {offset:   '0%', 'stop-color': '#568f82', 'stop-opacity': 1}),
        xml(SVG, 'path', {offset: '100%', 'stop-color': '#568f82', 'stop-opacity': 0})
    ])
])

这更容易处理。

没有直接标记属性,但您可以使用
DOMParser.parseFromString()
将一些XML解析为新的SVG文档,并跨它导入
importNode
。或者,您可以使用
innerHTML
设置容器HTML元素的内容,并从结果中提取SVG节点

但是,一旦您想要引入可变内容或属性值,字符串挂起就会变得有点麻烦,很容易在不记住正确转义的情况下进行字符串连接,从而导致跨站点脚本问题。如果可以的话,能够将所有东西都保存在对象和属性的世界中,而不是编码的标记中,这很好

诚然,uber verbose DOM API并没有让这变得容易,但您可以编写快捷函数来为自己调用DOM方法,这样您就可以编写如下内容:

xml(SVG, 'defs', {}, [
    xml(SVG, 'radialGradient', {id: 'gradient', cx: '50%', cy: '50%', fx: '50%', fy: '50%' r: '50%'}, [
        xml(SVG, 'path', {offset:   '0%', 'stop-color': '#568f82', 'stop-opacity': 1}),
        xml(SVG, 'path', {offset: '100%', 'stop-color': '#568f82', 'stop-opacity': 0})
    ])
])

这更容易处理。

没有直接标记属性,但您可以使用
DOMParser.parseFromString()
将一些XML解析为新的SVG文档,并跨它导入
importNode
。或者,您可以使用
innerHTML
设置容器HTML元素的内容,并从结果中提取SVG节点

但是,一旦您想要引入可变内容或属性值,字符串挂起就会变得有点麻烦,很容易在不记住正确转义的情况下进行字符串连接,从而导致跨站点脚本问题。如果可以的话,能够将所有东西都保存在对象和属性的世界中,而不是编码的标记中,这很好

诚然,uber verbose DOM API并没有让这变得容易,但您可以编写快捷函数来为自己调用DOM方法,这样您就可以编写如下内容:

xml(SVG, 'defs', {}, [
    xml(SVG, 'radialGradient', {id: 'gradient', cx: '50%', cy: '50%', fx: '50%', fy: '50%' r: '50%'}, [
        xml(SVG, 'path', {offset:   '0%', 'stop-color': '#568f82', 'stop-opacity': 1}),
        xml(SVG, 'path', {offset: '100%', 'stop-color': '#568f82', 'stop-opacity': 0})
    ])
])
这更容易应付