2012-11-04 44 views
0

我正在尝试使用Javascript加载SVG。我经常成功地做到这一点,但这次它有一个奇怪的回报。使用Javascript生成SVG

这里是我的JS

var xmlns = 'http://www.w3.org/2000/svg'; 
var container = document.getElementById('svgContainer'); 
var svg = document.createElementNS(xmlns, 'svg'); 
svg.setAttribute('xmlns', xmlns); 
svg.setAttribute('version', '1.2'); 
var defs = document.createElementNS(xmlns, 'defs'); 
var lg = document.createElementNS(xmlns, 'linearGradient'); 
lg.setAttribute('id', 'lg'); 
defs.appendChild(lg); 
var stop1 = document.createElementNS(xmlns, 'stop'); 
stop1.setAttribute('offset', '0'); 
stop1.setAttribute('style', 'stop-color:#ffffff;stop-opacity:1'); 
lg.appendChild(stop1); 
var stop2 = document.createElementNS(xmlns, 'stop'); 
stop2.setAttribute('offset', '1'); 
stop2.setAttribute('style', 'stop-color:#000000;stop-opacity:1'); 
lg.appendChild(stop2); 
var rg = document.createElementNS(xmlns, 'radialGradient'); 
rg.setAttribute('cx', '171.20810'); 
rg.setAttribute('cy', '196.85463'); 
rg.setAttribute('r', '200.00000'); 
rg.setAttribute('fx', '171.20810'); 
rg.setAttribute('fy', '196.85463'); 
rg.setAttribute('id', 'rg'); 
rg.setAttribute('xlink:href', '#lg'); 
rg.setAttribute('gradientUnits', 'userSpaceOnUse'); 
rg.setAttribute('gradientTransform', 'matrix(1.040418,0.796229,-0.814518,1.064316,153.4218,-150.4353)'); 
defs.appendChild(rg); 
svg.appendChild(defs); 
var g = document.createElementNS (xmlns, 'g'); 
g.setAttribute('transform', 'scale(0.2,0.2)'); 
svg.appendChild(g); 
container.appendChild(svg); 
var path = document.createElementNS (xmlns, 'path'); 
path.setAttribute('d', 'M 450.00000 255.00000 A 200.00000 205.00000 0 1 1 50.000000,255.00000 A 200.00000 205.00000 0 1 1 450.00000 255.00000 z'); 
path.setAttribute('style', 'opacity:1.0000000;fill:url(#rg);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:8.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1'); 
g.appendChild(path); 

所以它产生正确的顺序完美的HTML DOM元素,但它并没有显示任何东西。当我从源代码复制HTML并粘贴它时,它呈现HTML但不是Javascript,但它是完全相同的代码。您可以看到源here

奇怪的是,当我将radialGradient放入DOM中时,它可以工作。你可以在here看到它。

那么我应该怎么做?这个问题出现在所有的浏览器上。

谢谢你的帮助。

===编辑===
与罗伯特Longson的帮助下,我设法解决这个问题,检查出来here

回答

2

您不能设置的XLink:通过使用setAttribute HREF,您必须使用setAttributeNS例如

var xlinkns = 'http://www.w3.org/1999/xlink'; 
rg.setAttributeNS(xlinkns, 'xlink:href', '#lg'); 

以这种方式更改您的jsfiddle使其适用于Firefox。我没有测试其他UA,但他们也应该工作。

+0

在Chrome上无法正常工作,但我这样做了:rg.setAttributeNS(“http://www.w3.org/1999/xlink”,'xlink:href','#lg');这工作!非常感谢 ! – Shadowbob