以文本方式查看主题 - W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL (http://bbs.xml.org.cn/index.asp) -- 『 SVG/GML/VRML/X3D/XAML 』 (http://bbs.xml.org.cn/list.asp?boardid=21) ---- SVG parseXML故障 (http://bbs.xml.org.cn/dispbbs.asp?boardid=21&rootid=&id=83745) |
-- 作者:Cwjnet -- 发布时间:3/7/2010 3:01:00 PM -- SVG parseXML故障 function attrCallback(data) { if (data.success) { var unit = parseXML(data.content, svgDoc); var id = get_attr_value(unit, "", "id"); var unit2 = svgDoc.getElementById(id); if (!unit2) alert("undefined:" + id); //为了说明问题出现在parseXML语句上,下面这一条语句屏蔽后同样会出错。 //这一句是真正需要用的。 //unit2.parentNode.replaceChild(unit.firstChild, unit2); } else { alert("success="+data.success); } } 请看以上代码,目的是想从服务器接收SVG图形数据,然后显示在界面上。 这段代码是可以用的,但是执行几次以后就不正常了。 经过很多调试以后才发现问题出现在var unit = parseXML(data.content, svgDoc); 在多次执行以后parseXML转换的unit对象不再完整了, 虽然unit对象还在,并且printNode(unit)的内容结果也和预期的一样, 但是unit的结构已经不完整了,本来应该有的子节点可以会没有了一部分。 不知道哪位高手能够解释一下这个parseXML到底是怎么回事。 是否和内存泄露、parseXML有状态等有关? [此贴子已经被作者于2010-3-8 21:36:55编辑过]
|
-- 作者:Cwjnet -- 发布时间:3/8/2010 1:47:00 PM -- var unit = parseXML(data.content, svgDoc); //.firstChild; //.getDocumentElement();//,svgDoc); if (!get_attr_value(unit, "metadata/custom", "Type")) { alert("parseXML failed\r\n" + unit + "," + unit.parentNode + "\r\n" + printNode(unit)); return; } //代码到这里时说明parseXML转换是成功的 //get_attr_value(unit, "metadata/custom", "Type")是一个自定义的函数, //就是从unit结构中取一个预期的数据项, //如果能够取到数据,说明unit结果是完整的,否则就是不完整的。 //但是很奇怪,通过printNode(unit)打印显示的结果,内容还是完整的。 //为了避免代码在别的地方引入错误 //我特意将这一段转换成功的数据进行重复转换, //最后在点击5、6次到20来次不等的次数里就会捕获到错误。 //而且测试越到后来错误的概率会越来越多,直到再也不能成功转换。 //好像某一种垃圾在parseXML内部留下来了。 while (confirm("parseXML ok\r\n" + unit + "\r\n" + printNode(unit))) { unit = parseXML(data.content, svgDoc); if (!get_attr_value(unit, "metadata/custom", "Type")) { alert("parseXML failed\r\n" + unit + "," + unit.parentNode + "\r\n" + printNode(unit)); return; } } var id = get_attr_value(unit, "", "id"); 有哪一位高人请指点一下啊,这到底是什么问题? |
-- 作者:Cwjnet -- 发布时间:3/17/2010 1:01:00 PM -- 上面这段代码如果把 unit = parseXML(data.content, svgDoc); 改成 unit = parseXML(data.content);//, svgDoc); 则不会有任何故障,任意转换多少次都没问题。 只是到了下面 unit2.parentNode.replaceChild(unit.firstChild, unit2); 的时候就不能用了,报了一个文档错误,因为 unit = parseXML(data.content, svgDoc); 转换出来的是SVGElement类型,是 unit2.parentNode.replaceChild(unit.firstChild, unit2); 可以使用的类型,而 unit = parseXML(data.content);//, svgDoc); 转换出来的是Element类型,没法被replaceChild接受。 一种是能转换但是不能替换,一种是能替换却不能正常转换,晕倒。我用的是SVGView3.03版本。 我就搞不懂了adobe公司为什么要把这东西搞的怎么复杂啊,设置一个菜单也是这样。 是不是故意这样子整的啊,弄得我们不能正常使用SVG,只好去用flash了。 这里好像能回答问题的人不多啊,还是我的问题太难了? |
-- 作者:Cwjnet -- 发布时间:3/19/2010 11:27:00 AM -- 已经解决。SVG有一个调用父窗口脚本的功能, 我可以把请求的命令提交给宿主窗口的脚本来实现, 在宿主窗口中利用jquery的ajax技术获取xml数据,然后编写一个n=createNode(xml,svgdoc)函数来创建一个等效的svg节点,就可以使用unit.parentNode.replaceChild(n,unit)成功替换了。 欢迎SVG开发者前来技术交流。 再次鄙视adobe公司。parseXML是一个挂羊头卖狗肉的东西。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
597.656ms |