Интерактивность
Использование скриптов
SVG - документы поддерживают скриптовые языки (в частности, JavaScript), которые позволяют создавать сложные веб-интерфейсы и приложения. Скрипт может выполняться в момент загрузки документа или в результате выполнения пользователем какого-либо события, например, щелчка мыши. Различают следующие события:
- onload - происходит в момент загрузки документа.
- onclick - происходит при нажатии и отпускании кнопки мыши в одной и той же области экрана.
- onactivate - происходит при переключении фокуса ввода на элемент.
Все события мыши, рассмотренные нами ранее, сохраняют свое значение, в их названиях лишь добавляется приставка on: onmousedown, onmouseover, onmousemove, onmouseup, onmouseout.
Для работы с элементами и атрибутами используются следующие методы:
- getElementById - обращение к элементу по его id
- getStyle - получение содержимого атрибута style.
- setProperty - установка отдельного свойства атрибута style.
- getAttribute - получение значения атрибута данного элемента.
- setAttribute - установка значения атрибута.
- cloneNode - создание нового узла документа на основании существующего.
Для помещения кода в SVG - документ применяется элемент script:
....... <script> <![CDATA[ <!--Код находится здесь--> ]> </script > .........
Допускается применение внешних файлов с кодом. Для помещения такого файла в SVG - документ используется следующий синтаксис:
....... < script xlink:href="myScript.js" language="JavaScript"/> ..........
Здесь помещена ссылка на файл myScript.js.
Все остальные свойства скриптового языка - переменные, операторы, функции, поддерживаются SVG - графикой в полной мере. По сути, можно абстрагироваться от SVG -основы документа и работать с его содержимым как с обычной HTML - страницей. В таблице 12.4 приводятся примеры скриптов2Если вы не знакомы с JavaScript, то понимать эти примеры будет сложно. Для быстрого вникания в суть можно проработать небольшие пособия по JavaScript и DOM: (http://www.xml.nsu.ru/) .
№ | Код | Вид в браузере |
---|---|---|
12.4.1 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="300" height="250" xmlns="http://www.w3.org/2000/svg" version="1.1"> <title>Лекция 12. Интерактивность</title> <desc> Пример script1.svg </desc> <!-- Определение ECMAScript для изменения размера окружности по щелчку --> <script type="text/ecmascript"> <![CDATA[ function circle_click(evt) { var circle = evt.target; var currentRadius = circle.getAttribute("r"); if (currentRadius == 50) circle.setAttribute("r", currentRadius*2); else circle.setAttribute("r", currentRadius*0.5); } ]]> </script> <!-- Окружность с обработчиком события --> <circle onclick="circle_click(evt)" cx="150" cy="125" r="50" fill="red"/> </svg>Листинг 12.4.1. Пример script1.svg |
![]() |
Описание | ||
Изменение размера окружности по щелчку. ECMAScript - это интерпретируемый язык программирования, стандартизированный международной организацией ECMA. JavaScript, JScript и ActionScript являются расширением стандарта ECMA-262. | ||
№ | Код | Вид в браузере |
12.4.2 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" version="1.1"> <title>Лекция 12. Интерактивность</title> <desc> Пример script2.svg </desc> <!-- Вставка JavaScript --> <script type="text/javascript"> <![CDATA[ function changeColor(evt) { var redValue,greenValue,blueValue; var targetshape= evt.getTarget(); redValue = Math.round(Math.random()*255); greenValue = Math.round(Math.random()*255); blueValue = Math.round(Math.random()*255); targetshape.setAttribute("fill", "rgb(" + redValue + "," + greenValue + "," + blueValue + ")"); } // ]]></script> <rect x="5" y="5" width="190" height="190" fill="none" stroke="green" stroke-width="2"/> <!-- Окружность, цвет которой будет меняться случайным образом --> <circle cx="100" cy="100" r="75" fill="blue" onclick="changeColor(evt)" /> </svg>Листинг 12.4.2. Пример script2.svg |
![]() |
Описание | ||
Изменение случайным образом цвета окружности при щелчке на ней мышью. | ||
№ | Код | Вид в браузере |
12.4.3 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="200" height="240" xmlns="http://www.w3.org/2000/svg" version="1.1"> <title>Лекция 12. Интерактивность</title> <desc> Пример script3.svg </desc> <!-- Вставка JavaScript --> <script type="text/javascript"> <![CDATA[ function ChangeColor() { var redValue,greenValue,blueValue,rgb; redValue = Math.round(Math.random()*255); greenValue = Math.round(Math.random()*255); blueValue = Math.round(Math.random()*255); rgb="rgb("+redValue +","+greenValue+","+blueValue +")"; return rgb; } function ValueColor(click_evt) { var svgdoc,ValueRGB,HexValueRGB, hex,hredValue,hgreenValue, hgblueValue,DataOutput; svgdoc=click_evt.target.ownerDocument; // Вызываем функцию ChangeColor: ValueRGB=ChangeColor(); // Вычисляем шестнадцатеричные значения цвета: hex=ValueRGB.substring(4,ValueRGB.length-1); hex=hex.split(","); hredValue=parseInt(hex[0]).toString(16).toUpperCase(); hredValue=(hredValue.length==1)?"0"+hredValue:hredValue; hgreenValue=parseInt(hex[1]).toString(16).toUpperCase(); hgreenValue=(hgreenValue.length==1)?"0"+hgreenValue:hgreenValue; hgblueValue=parseInt(hex[2]).toString(16).toUpperCase(); hgblueValue=(hgblueValue.length==1)?"0"+hgblueValue:hgblueValue; HexValueRGB="#"+hredValue+hgreenValue+hgblueValue; DataOutput=ValueRGB+" | "+HexValueRGB; // Изменяем цвет окружности и выводим надпись: click_evt.target.style.setProperty("fill",ValueRGB,""); svgdoc.getElementById("Output").firstChild.data=DataOutput; } // ]]></script> <rect x="5" y="5" width="190" height="230" fill="none" stroke="green" stroke-width="2"/> <!-- Окружность, цвет которой будет меняться случайным образом --> <circle cx="100" cy="100" r="75" fill="blue" onclick="ValueColor(evt)" /> <text id="Output" x="10" y="200" class="t2" fill="green" font-size="14px"> </text> </svg>Листинг 12.4.3. Пример script3.svg |
![]() |
Описание | ||
Изменение случайным образом цвета окружности при щелчке на ней мышью. Индекс цвета в десятичной и шестнадцатеричной формах выводятся в текстовое поле. | ||
№ | Код | Вид в браузере |
12.4.4 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="300" height="250" xmlns="http://www.w3.org/2000/svg" version="1.1"> <title> Лекция 12. Интерактивность</title> <desc> Пример DragAndDrop.svg </desc> <script type="text/ecmascript"> <![CDATA[ var click = false, object ="" var x_obj = 0, y_obj = 0, x_trans = 0, y_trans = 0 var appui=false //Установка новых координат объекта при щелчке. function clicked(evt) { click = true object = evt.target trans = evt.target.getAttributeNS(null , "transform") trans = trans.substring(10,trans.length - 1) trans = trans.split(",") x_trans = trans[0] - 0 y_trans = trans[1] - 0 x_obj = evt.screenX - 0 y_obj = evt.screenY - 0 } //Перемещение объекта function move_object(evt) { if (click) { xm = evt.screenX - 0 ym = evt.screenY - 0 object.setAttributeNS(null, "transform", "translate("+( x_trans + xm - x_obj) + ", " + ( y_trans + ym - y_obj) +")") } } ]]> </script> <g onmousedown="clicked(evt)" onmousemove="move_object(evt)" onmouseup="click=false"> <rect transform="translate(20,20)" x="10" y="10" width="180" height="80" fill="green"/> <polygon transform="translate(20,20)" points="20,20 180,20 20,90" fill="blue"/> <circle transform="translate(20,20)" cx="90" cy="60" r="25" fill="red" /> <text transform="translate(150,150)" font-family="Comic Sans MS" fill="red" font-size="16"> Drag and drop</text> </g> </svg>Листинг 12.4.4. Пример DragAndDrop.svg |
![]() |
Описание | ||
Операция Drag and Drop - перетаскивание объектов. Надпись можно выделять и перетаскивать. На диске, прилагаемом к книге, вы найдете пример перетаскивания объектов с возможностью изменения размера изображений (рис. 12.2): | ||
№ | Код | Описание |
12.4.5 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="200" height="100" xmlns="http://www.w3.org/2000/svg" version="1.1"> <title> Лекция 12. Интерактивность</title> <desc> Пример Menu.svg </desc> <a xlink:href=""> <text x="30" y="30" style="fill:red" onclick="svgDocument.rootElement.setAttribute('zoomAndPan','disable')"> Отключить масштаб <set attributeName="fill" attributeType="CSS" to="blue" begin="mouseover"/> <set attributeName="fill" attributeType="CSS" to="red" begin="mouseout"/> </text> </a> <a xlink:href=""> <text x="30" y="60" style="fill: red" onclick="svgDocument.rootElement.setAttribute('zoomAndPan','magnify')"> Включить масштаб <set attributeName="fill" attributeType="CSS" to="blue" begin="mouseover"/> <set attributeName="fill" attributeType="CSS" to="red" begin="mouseout"/> </text> </a> </svg>Листинг 12.4.5. Пример Menu.svg |
Управление контекстным меню, отображаемым для данного документа плагином "Adobe SVG Viewer". Отключение и включение доступности масштаба. |
Вид в браузере | ||
![]() |
Мы рассмотрели простые примеры, демонстрирующие возможности SVG. Сложность приложений, использующих SVG - графику, ограничена лишь рамками JavaScript, DOM, а также фантазией и знаниями разработчика.