这是标记内的SVG文件中的Javascript。
此SVG显示了我所在城市的乐队时间表。 当鼠标单击a时,脚本将访问XML库并在它们加入时检索每个波段中成员的名称。并将新文本节点添加到包含。
的SVG组这是第一个:
<g class="band" id="hajimama">
<text x="633.333333333" y="50" fill="black" font-size="12">Hajimama</text>
<rect x="633.333333333" y="50" width="413.333333333" height="15" fill="red" onmousedown="growBox(evt);"></rect></g>
这是growBox()函数:
function growBox(evt)
{
var i, g_index;
var r = evt.target;
g_index = find_SVGBand(r);
b = find_XMLBand(b_name);
members = b.getElementsByTagName("member"); //members.length is used for drawing.
stretch = members.length*16;
for (k=g_index+1;k<groups.length;k++)
{
cur_y = parseFloat(get_firstChild(groups[k]).getAttribute("y"));
new_y = cur_y + stretch;
get_firstChild(groups[k]).setAttribute("y",new_y);
groups[k].getElementsByTagName("rect")[0].setAttribute("y",new_y);
}
evt.target.setAttribute('height',stretch);
var s = parseFloat(r.getAttribute("y")) + 5; //write the first member name below the band name
for (k=0;k<members.length;k++) //loop through each member of a band
{
var m=members[k];
var m_name = returnMemberName(m);
q = document.createElement("text");
q.setAttribute("font-size",20);
if (m.getElementsByTagName("instrument")[0].hasChildNodes())
{
if (m.getElementsByTagName("instrument")[0].childNodes[0].nodeValue == "guitar")
inst_clr="#993333";
else if (m.getElementsByTagName("instrument")[0].childNodes[0].nodeValue == "bass")
inst_clr="#339933";
else if (m.getElementsByTagName("instrument")[0].childNodes[0].nodeValue == "drums")
inst_clr="#333399";
}
else
inst_clr="#000000";
q.setAttribute("fill",inst_clr);
//draw names based on start dates
m_start = returnMemberJoinDate(m);
mrect_start = (m_start - 2000) * 80;
q.setAttribute("x",mrect_start);
q.setAttribute("y",s);
mn = document.createTextNode(m_name);
q.appendChild(mn);
r.parentNode.appendChild(q);
q.setAttribute('visibility','visible');
s+=15;
alert(r.parentNode.getAttribute("id") + " " + get_lastChild(r.parentNode).nodeName + " " + get_lastChild(r.parentNode).childNodes[0].nodeValue);
} //for
evt.target.setAttribute('onmousedown','');
addEBox(evt);
}
通过alert()可以看到正确访问数据并且节点正确地附加到节点,因为r.parentNode.getAttribute(“id”)返回节点的id。
为什么文本没有出现的任何想法?
感谢。
答案 0 :(得分:3)
在SVG中,必须在SVG名称空间中创建元素。这意味着createElement不会创建SVG文本元素,而是需要createElementNS。
所以
q = document.createElement("text");
应该是
q = document.createElementNS("http://www.w3.org/2000/svg", "text");
答案 1 :(得分:0)
上面的Roberts代码在IE11上适用于我,谢谢罗伯特!
起初我得到了Object不支持属性或方法&#39; createElementNS&#39;但是发现这是因为在该页面上启用了兼容模式,一旦我删除它就可以正常工作。