以文本方式查看主题

-  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");

有哪一位高人请指点一下啊,这到底是什么问题?
会不会和unit的数据结构有关?因为我这里面是有id的,有onclick等事件的,
普通的parseXML教材例子中都没有这些内容,会不会是有这种限制?
因为id整个SVG文档是需要唯一的,所以parseXML再重构unit时和原图上的id冲突导致
不能正常转换了。或者onclick等事件的包还也会产生影响?
因为教科书上说unit.addEventListener()函数是绑定事件“唯一真正的标准方式”,
而我显然没用到addEventListener这个函数。


--  作者: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