Можно ли манипулировать 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?
Ответы
Ответ 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/
Ответ 5
Я исследовал svg с помощью JavaScripts. Смотрите блог: Масштабирование графики SVG с помощью JavaScripts
Ответ 6
Также см. jQuery SVG-плагин
Ответ 7
Для поддержки в IE6 просмотрите SVGWeb.
Есть примеры того, как управлять SVG с помощью JavaScript в примере кода, поставляемого с библиотекой.
В архивах списка рассылки также имеется достаточное количество информации.