【问题标题】:Is it possible to manipulate an SVG document embedded in an HTML doc with JavaScript?是否可以使用 JavaScript 操作嵌入在 HTML 文档中的 SVG 文档?
【发布时间】:2010-09-13 09:23:04
【问题描述】:

我制作了一个 SVG 图像,或者更像是迷你应用程序,用于查看数据图表。我想将其包含在 HTML 页面中,并在 SVG 图像上调用方法。

例子:

<object id="img" data="image.svg" width="500" height="300"/>
<script>document.getElementById("img").addData([1,23,4]);</script>

是否可以调用 SVG 文档上的方法?如果是这样,我如何声明要在 SVG 文件中公开的方法,以及如何从 HTML 文档中调用它们?

【问题讨论】:

    标签: javascript html svg


    【解决方案1】:

    解决方案:

    在 svg 中:

    <script>document.method = function() {}</script>
    

    在html中(使用原型添加事件监听器):

    <script>$("img").observe("load", function() {$("img").contentDocument.method()});
    

    你需要监听图片上的加载事件。加载图像后,您可以使用 element.contentDocument 访问 svg 文档上的文档变量。添加到其中的任何方法都将可用。

    【讨论】:

      【解决方案2】:

      几年前,我被要求使用 SVG 创建一个基于 Ajax 的 2 人游戏。它可能不是您正在寻找的解决方案,但它可以帮助您侦听 SVG 中的事件。这是 SVG 控制器:

      fyi,SVG 正在被拖放(它是 Stratego)

      /****************** Track and handle SVG object movement *************/
      var svgDoc;
      var svgRoot;
      var mover='';       //keeps track of what I'm dragging
      
      ///start function////
      //do this onload
      function start(evt){
          //set up the svg document elements
          svgDoc=evt.target.ownerDocument;
          svgRoot=svgDoc.documentElement;
          //add the mousemove event to the whole thing
          svgRoot.addEventListener('mousemove',go,false);
          //do this when the mouse is released
          svgRoot.addEventListener('mouseup',releaseMouse,false); 
      }
      
      // set the id of the target to drag
      function setMove(id){ mover=id; }
      
      // clear the id of the dragging object
      function releaseMouse(){ 
          if(allowMoves == true){ sendMove(mover); }
          mover=''; 
      }
      
      // this is launched every mousemove on the doc
      // if we are dragging something, move it
      function go(evt){
          if(mover != '' && allowMoves != false) {
              //init it
              var me=document.getElementById(mover);
      
              //actually change the location
              moveX = evt.clientX-135; //css positioning minus 1/2 the width of the piece
              moveY = evt.clientY-65;
              me.setAttributeNS(null, 'x', evt.clientX-135);
              me.setAttributeNS(null, 'y', evt.clientY-65);
          }
      }
      
      function moveThis(pieceID, x, y) {
          $(pieceID).setAttributeNS(null, 'x', x);
          $(pieceID).setAttributeNS(null, 'y', y);
      }
      

      我的应用是纯 SVG + JavaScript,但这就是它的要点。

      【讨论】:

        【解决方案3】:

        我已经通过 JavaScripts 探索了 svg。见博客:Scaling SVG Graphics with JavaScripts

        【讨论】:

          【解决方案4】:

          我认为 David Dailey 博士是您会发现的最棒的 SVG / JS 信息 http://srufaculty.sru.edu/david.dailey/svg/

          【讨论】:

            【解决方案5】:

            【讨论】:

              【解决方案6】:

              有关 IE6 的支持,请查看SVGWeb

              库提供的示例代码中有关于如何使用 JavaScript 操作 SVG 的示例。

              邮件列表的档案中也有相当数量的信息。

              【讨论】:

                【解决方案7】:

                事情实际上比你想象的要简单。你不需要阅读复杂的教程来理解这个概念,你也不需要使用 JQuery。这是基本布局:

                • 您的 html 文档中的 JavaScript 函数。

                  <script type="text/javascript">
                  function change(){
                      var s=document.getElementById("cube");
                      s.setAttribute("stroke","0000FF");
                  }
                  </script>
                  
                • 我们试图操纵的 SVG 元素。

                  <svg width=100 height=100 style='float: left;'>
                    <rect x="10" y="10" width="60" height="60" id="cube" onclick="change()" stroke=#F53F0C stroke-width=10 fill=#F5C60C />
                  </svg>
                  
                • 会触发更改的内联按钮。请注意,在我的示例中,也可以通过单击多维数据集本身来触发事件。

                  <button onclick="change()">Click</button>
                  

                【讨论】:

                  猜你喜欢
                  • 2013-10-03
                  • 1970-01-01
                  • 2020-03-13
                  • 1970-01-01
                  • 2022-11-03
                  • 1970-01-01
                  • 2018-01-29
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多