21

我制作了一个 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 文档中调用它们?

4

7 回答 7

12

解决方案:

在 svg 中:

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

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

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

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

于 2008-09-26T08:55:58.297 回答
6

事情实际上比你想象的要简单。你不需要阅读复杂的教程来理解这个概念,你也不需要使用 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>
    
于 2011-08-24T23:46:03.413 回答
5

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

仅供参考,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,但这就是它的要点。

于 2008-09-27T19:01:23.940 回答
4

我会参考 David Dailey 博士作为你会发现的最棒的 SVG / JS 信息 http://srufaculty.sru.edu/david.dailey/svg/

于 2008-11-03T02:12:47.507 回答
1

我已经通过 JavaScripts 探索了 svg。请参阅博客:使用 JavaScript 缩放 SVG 图形

于 2008-11-03T02:03:27.680 回答
1

另请参阅jQuery SVG 插件

于 2008-12-11T23:03:20.020 回答
0

有关 IE6 的支持,请查看SVGWeb

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

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

于 2010-10-10T10:40:06.287 回答