Подтвердить что ты не робот

Можно ли манипулировать SVG-документом, встроенным в HTML-документ с JavaScript?

Я сделал изображение 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?

4b9b3361

Ответ 1

Решение:

в svg:

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

в html (используя прототип для добавления прослушивателей событий):

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

Вам нужно прослушать событие загрузки на изображении. После загрузки изображения вы можете использовать element.contentDocument для доступа к переменной документа в документе svg. Любые методы, добавленные к этому, будут доступны.

Ответ 2

Вещи на самом деле проще, чем вы ожидаете. Вам не нужно читать запутанный учебник, чтобы понять концепцию, и вам не нужно использовать JQuery. Вот основной макет:

  • Функция JavaScript в вашем html-документе.

    <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>
    

Ответ 3

Несколько лет назад меня попросили создать 2-игровую Ajax-игру, используя SVG. Возможно, это не то решение, которое вы ищете, но оно может помочь вам прослушать события в вашем SVG. Здесь контроллер SVG:

fyi, SVG перетаскивался и отбрасывался (это был Strategyo)

/****************** 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, но это его суть.

Ответ 4

Я бы обратился к доктору Дэвиду Дэили как к самой удивительной информации SVG/JS, которую вы найдете http://srufaculty.sru.edu/david.dailey/svg/

Ответ 7

Для поддержки в IE6 просмотрите SVGWeb.

Есть примеры того, как управлять SVG с помощью JavaScript в примере кода, поставляемого с библиотекой.

В архивах списка рассылки также имеется достаточное количество информации.