Можно ли управлять документом 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?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
20
0
15 532
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Решение:

в svg:

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

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

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

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

Несколько лет назад меня попросили создать игру на основе Ajax для двух игроков с использованием SVG. Возможно, это не совсем то решение, которое вы ищете, но оно может помочь вам отслеживать события в вашем 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, но в этом его суть.

Я исследовал svg с помощью JavaScripts. См. Блог: Масштабирование графики SVG с помощью сценариев JavaScripts

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

Также см. плагин jQuery SVG

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

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

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

На самом деле все проще, чем вы ожидаете. На самом деле вам не нужно читать запутанное руководство, чтобы понять концепцию, и вам не нужно использовать 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>
    

Другие вопросы по теме