我要实现一个不改变页面以及svg文件的前提下,通过js动态加载svg,动态为svg添加事件,重构右键菜单等功能。
环境是IE+SvgViewer。我的思路是在页面onload时给页面的某个层里动态添加一个<embed id="NavigateControl"  name="svg" type="image/svg+xml" src="11.svg" width="100%" height="100%" >标签,然后操作svg文件,所有操作都是在页面onload时进行的。
然后问题就出来了        try {
            CurveControl = document.getElementById('NavigateControl');    //NavigateControl就是embed标签的id
            if(CurveControl==null)
                return;
            svgDoc = CurveControl.getSVGDocument();    //到这里就会出错了,提示没有当前方法。
            //得到了svgDoc之后我就可以对svg操作了。
        }
        catch(e) {
            alert(e);
        }
CurveControl.getSVGDocument()这个方法在<embed id="NavigateControl"  name="svg" type="image/svg+xml" src="11.svg" width="100%" height="100%" >标签写死在页面中时就可以成功取得SVGDocument,可是在动态添加的情况下就不好用了,我应该怎么取得SVGDocument呢,或者我的思路不对?

解决方案 »

  1.   

    CurveControl.src = '1.svg';
    CurveControl.onload = function() {
          .....};可能是svg还没load完,所以你取不到
      

  2.   

        if(document.readyState=="complete")
    {
            try {
                CurveControl = document.getElementById('NavigateControl');
                if(CurveControl==null)
                    return;
                svgDoc = CurveControl.getSVGDocument();
            }
            catch(e) {
                alert(e);
            }
    我这样了,仍然不行。
      

  3.   

    参考:http://helius1214.javaeye.com/blog/619508
      

  4.   

    document.readyState.......
    那是本画面,相当于DOMContentLoad,还不如onload呢,你照着我的样子做了吗?
      

  5.   


    CurveControl.src = '1.svg';貌似不能这样设置src属性。
      

  6.   


    里面贴的代码我试了,依然是获取不到SVGDocument。
    62行的 var svgdoc=getSVGDocument(svg);  svgdoc运行时为null。
      

  7.   

    function winLoad() {
    alert(document.getElementById('NavigateControl').id); //这个可以弹出NavigateControl,没问题
    CurveControl=document.getElementById('NavigateControl');  //这也可以取到
    CurveControl.onload = function() {
        svgDoc = CurveControl.getSVGDocument();  //这里就出问题了,报错,没有该方法,跟我以前错的一样
        alert(svgDoc);
    };
    CurveControl.onload();
    }
      

  8.   

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
    <title>Insert title here</title>
    <script type="text/javascript">
    function load() {
    var embedTag = document.createElement('embed');
    embedTag.type = "image/svg+xml";
    embedTag.width = "640";
    embedTag.height = "480";
    embedTag.onload = function() {
    alert(embedTag.getSVGDocument());
    };
    embedTag.src = "test.svg";
    document.body.appendChild(embedTag);
    }
    </script>
    </head>
    <body onload="load();">

    </body>
    </html><?xml version="1.0" standalone="no"?> 
    <svg xmlns="http://www.w3.org/2000/svg" width="640" height="480" onload="init(evt);">
    <script type="text/javascript">
    <![CDATA[
    function init() {
    alert(1);
    }
    ]]>
    </script>
    <line x1="20" y1="20" x2="70" y2="20" style="stroke:black"/>
    </svg>谁说不行!!!!
      

  9.   

    8楼
    看来是我写错了 - -,你这个是行。
    但我是想给svg里的g标记添加一个onclick事件。
    我应该怎么写?
    刚才试着写了下,没写出来。这个是我的svg<?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
      "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    <svg width="640" height="480" version="1.1"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xmlns="http://www.w3.org/2000/svg">
      <g id="g1"></g>
      <g id="Value1" >
        <rect id="r1" x="100" y="100" width="50" height="30" stroke="black" stroke-width="2" fill="none"/>
        <text id="Text1" x="125" y="125" fill="#000000" stroke="none" font-family="Arial" font-size="20" font-weight="bold" text-anchor="middle" >8.67</text>
      </g>
      <g id="Value2">
        <rect id="r2" x="100" y="200" width="50" height="30" stroke="black" stroke-width="2" fill="none"/>
        <text id="Text2" x="125" y="225" fill="#000000" stroke="none" font-family="Arial" font-size="20" font-weight="bold" text-anchor="middle" >8.66</text>
      </g>
      <g id="aValue3">
        <rect id="r3" x="100" y="300" width="50" height="30" stroke="black" stroke-width="2" fill="none"/>
        <text id="Text3" x="125" y="325" fill="#000000" stroke="none" font-family="Arial" font-size="20" font-weight="bold" text-anchor="middle" >8.65</text>
      </g>
      <g id="Val3ue">
        <rect id="r4" x="100" y="400" width="50" height="30" stroke="black" stroke-width="2" fill="none"/>
        <text id="Text4" x="125" y="425" fill="#000000" stroke="none" font-family="Arial" font-size="20" font-weight="bold" text-anchor="middle" >8.64</text>
      </g>
    </svg>
    这个是我写的添加onclick事件的方法。    function setGElementsOnClick() {
            var mydoc = svgDoc; //svgDoc是之前取到的,我就是不知道在动态添加的embed里,怎么获取svgDoc
            var gElements = mydoc.getElementsByTagName("g");
            var length = gElements.length;
          
            for (var i = 0; i < length; i++) {
                var id = gElements.item(i).getAttribute("id")
                if(0 == id.indexOf("Value")) {
    //                alert(gId.indexOf("Value"));
                    gElements.item(i).setAttribute("onclick","alertIdByClick(evt);");
                }
            }
        }
        function alertIdByClick(evt) {
        if (2 == evt.detail) {
                alert(gId);
        }
        }
      

  10.   


    貌似你这个的embedTag.getSVGDocument()也不行呢。
      

  11.   


    原来你的是在FF下可以。我一直都是用IE打开。我已经说了,环境是IE+SvgViewer,我发现应该是IE加载未完成导致获取不到,但怎样才能获取到svgDoc呢
    3楼给的链接是讲关于IE的,但我运行他那个,还是不行。。下面方法的svgRoot获取不到。//在Html中创建一个SVG节点,指定id,父亲节点,对于IE创建<embed />,其他浏览器创建<SVG />
    function createSVG(id,parent){
        var svg;
        if(isIE){
            svg=document.createElement("embed");
            svg.setAttribute("id",id);
            svg.setAttribute("type",'image/svg+xml');
            svg.setAttribute("src",emptySVGSrc);
        }else {
            svg=document.createElementNS(twConstants.NS_SVG,'svg');
        }
        svg.setAttribute("width",'100%');
        svg.setAttribute("height",'100%');
        parent.appendChild(svg);
        if(isIE){
            doLater(
                function(svg){
                    var svgdoc=getSVGDocument(svg);
                    var svgRoot=getSVGRoot(svg,svgdoc); //运行时,svgRoot为空。
                    svgRoot.setAttribute("height",'100%');
                    svgRoot.setAttribute("width",'100%');
                },100,svg);
        }
        return svg;
    }
    求解决方案
      

  12.   


    for (var i = 0; i < length; i++) {
                var id = gElements.item(i).getAttribute("id")
                if(0 == id.indexOf("Value")) {
    //                alert(gId.indexOf("Value"));
                    gElements.item(i).onclick = alertIdByClick;//即可
                }
            }
    # //画图   
    # IE:VML。   
    # FF:SVG。 
    ie没有svg用vml即可
    http://blog.csdn.net/IBM_hoojo/archive/2010/07/02/5708440.aspx
      

  13.   


    公司让用svg,而且说是只针对IE用户,所以没办法只能IE+SvgViewer了。
    我存在的问题其实就是3楼描述的那样,在IE里使用javascript动态创建SVG对象的问题。但是那里说的方法确实还是有错误,就像我13楼说的那样,也许因为我菜,没能弄明白真正的原理吧。希望能有解决办法。
      

  14.   

    <html>
    <head>
    <title>By Mr.Ms</title>
    </head>
    <body onload="load();"> //onload获取svgDoc,操作svg
        <div id="mainDiv"></div>
    </body>
    <script type="text/javascript">
    //这里调用动态添加embed的方法
    </script>
    </html>
    [/code]这样肯定会在svg加载完成之后才操作,因为调用的javascript方法在onload之前。
      

  15.   


    <html>
    <head>
    <title>By Mr.Ms</title>
    </head>
    <body onload="load();"> //onload获取svgDoc,操作svg
      <div id="mainDiv"></div>
    </body>
    <script type="text/javascript">
    //这里调用动态添加embed的方法
    </script>
    </html>
    这样肯定会在svg加载完成之后才操作,因为调用的javascript方法在onload之前。
      

  16.   


    推荐楼主参考 google的closure library
    相当精彩
      

  17.   

    相同的问题。但是我embed是写死的居然也得不到SVGDocument,麻烦各位大侠指点一二啊!