SVG脚本编程简介

本文主要介绍SVG的脚本编程,并分别给出放大、缩小,查询,鼠标事件等实例。

一、            SVG简介

SVG,全称为Scalable Vector Graphics(可伸缩矢量图形)。它是W3C制定的、用矢量描述图形的XML应用标准。它有着许多的优点,比如可扩充性(scalable),动态的,交互性强。SVG支持无极放大,对SVG图片进行任意比例的放大都不会损害图片的显示(没有太多的失真),其他诸如BMP,JPEG格式的图片都不支持无级放大。SVG有动画元素,只要在SVG文件中嵌入SVG动画元素就可以实现动画效果了。同时 SVG也定义了丰富的事件,包括鼠标事件和键盘事件,只要对SVG进行相关的脚本编程就可以实现SVG文件的交互操作。

SVG带有许多基本的图形元素,只要通过组合基本图形元素就可以构建出SVG文件。

二、            SVG脚本编程

在SVG中,可以通过脚本编程来实现一些比较复杂的交互操作。SVG用<script>元素来在SVG文档中插入脚本,它的功能几乎和HTML中的<script>标记一样。其一般格式为:

<script type=”text/javascript”>

<![CDATA[

<!—这里插入脚本程序段-->

]]>

</script>

<script>有两个属性,type=”content-type”,这里指明所用的script语言的类型。默认情况下script采用的语言是javascript语言。Xlink:href="/blog/”<";uri>”指明引用外部脚本文件的url。下面的例子演示了SVG中的鼠标事件。

<svg width="400" height="200">

<script><![CDATA[

function showmsg()

{

alert("you had clicked the green rect");

}

]]></script>

<g id="rect1">

<rect id="rectangle" οnclick="showmsg()" x="50" y="50" width="100" height="50" style="fill:green"/></g>

</svg>

在文本中输入上面代码,用IE打开,然后用鼠标点击绿色的矩形,将会提示“你点击了矩形”的信息。

所以如果要实现对SVG的脚本编程,只需要在相关的元素上增加事件处理函数(οnclick="showmsg()"),然后在<script>标记中实现相关函数就可以了。

另外时间处理函数的实现除可以放在SVG的<script>标记中外,也可以放在SVG嵌入的父HTML文件中,这样的话也可以方便的实现SVG和HTML的数据交换。例如下面的例子。

Svg文件:1.svg

<svg width="400" height="200">

<g id="rect1">

<rect id="rectangle" οnclick="showmsg()" x="50" y="50" width="100" height="50" style="fill:green"/></g>

</svg>

HTML文件:a.html

<html><head><title>SVG事件</title>

<script language=javascript>

<!—

function showmsg()

{

Alert("you had clicked the green rect ");

}

//-->

</script>

<body >

<embed name="id1" pluginspage=”http://www.adobe.com/svg/viewer/install/” align="top" src="/blog/1.svg" height="200px" width="200px" type="image/svg+xml">

</body>

</html>

当你打开a.html文件后,你会发现效果跟上面的例子一样。

SVG支持的事件有很多,比较常用的有onclick,onmousedown,onmouseup,onmouseout,onmousemove,onload等等。更多的事件请查看:
三、            脚本编程应用实例

本部分将通过几个实例来分析脚本程序在SVG中的应用。

1、鼠标事件(演示鼠标事件的使用方法,以及常用的事件)

请看下面的例子:

<svg width="400" height="200">

<script><![CDATA[

function mout()

{

alert("you are out");

}

]]></script>

<g id="rect1">

<rect id="rectangle1"   οnmοuseοut="mout()" x="50" y="50" width="150" height="150" style="fill:red"/>

</g>

</svg>

用IE打开上面的SVG文件,当你的鼠标移开红色的矩形框的时候,将会弹出提示信息"you are out"。

下面给出常见的鼠标事件和其触发条件。

onmouseout
当鼠标移开一个物体(element)的时候触发该事件

onmousedown
当在一个物体(element)上按下鼠标键时触发该事件

onmouseup
当在一个物体(element)上松开鼠标键时触发该事件

onmousemove
当鼠标在一个物体(element)上移动时触发该事件

onclick
当鼠标点击物体(element)的时候将触发该事件

更多的事件请参看http://www.w3.org/TR/SVG/interact.html。

对鼠标事件需要注意的是有时候可能同时有几个事件同时发生,我们可以通过试验得出响应事件的执行顺序。

2、放大、缩小(演示脚本语言对SVG中相关元素的属性控制)

SVG的浏览器插件带有放大、缩小的功能,但是在实际的应用中,我们需要自己编程实现SVG图象文件的放大、缩小。下面的例子通过SVG的更改viewbox属性来实现放大、缩小功能。(处理函数放在父HTML文件中)

SVG文件:1.svg

<svg viewBox="0 0 400 200"   id="mainview">

<g>

<text id="texte" x="200" y="100" style="text-anchor:middle;font-size:25;font-family:Arial;fill:red">haha ,here!</text>

</g>

</svg>

HTML文件:aa.html

<html><head><title>SVG事件</title>

<body >

<script language="javascript" >

function fda()

{

var SvgMainMapDoc=id1.getSVGDocument();

var OverMapview=SvgMainMapDoc.getElementById("mainview");

OverMapview.setAttribute("viewBox","100 50 200 100");

}

function sxiao()

{

var SvgMainMapDoc=id1.getSVGDocument();

var OverMapview=SvgMainMapDoc.getElementById("mainview");

OverMapview.setAttribute("viewBox","-200 -100 800 400");

}

</script>

<embed name="id1" pluginspage=http://www.adobe.com/svg/viewer/install/ align="top" src="/blog/1.svg" height="200px" width="400px" type="image/svg+xml">

<input type="button" value="放大" name="fda" οnclick="fda()">

<input type="button" value="缩小" name="sxiao" οnclick="sxiao()">

</body>

</html>

用IE打开aa.html,按下放大,缩小按钮将可以看到放大、缩小的效果。HTML中通过getSVGDocument()获取SVG文档的 DOM(文档对象模型),然后再通过getElementById和ID来获取element的指针,然后通过setAttribute来设置 element(即本例中ID为mainview的svg元素)。上面用到的几个函数都是DOM函数,更多的DOM函数及介绍可以在http://pilat.free.fr/routines/js_dom.htm上获得。

下面介绍一下通过viewbox放大、缩小的原理。Viewbox中有四个数字,分别表示最小的x坐标,y坐标,最大x坐标和最小x坐标之差,最大 y坐标和最小y坐标之差。也就是说viewbox表示的是当前的显示范围,因此只要改变viewbox的值就可以实现SVG图象的放大和缩小。

3、属性查询、高亮显示

属性查询在现实中有着许多的应用,通过查询可以得出我们感兴趣的东西。下面介绍如果实现对SVG属性的查询。

SVG文件:1.svg

<svg viewBox="0 0 400 400"   id="mainview">

<g id="id1">

<rect id="rectangle" name="a1" x="0" y="0" width="50" height="50" style="fill:green"/>

<rect id="rectangle1" name="a2" x="50" y="50" width="50" height="50" style="fill:green"/>

<rect id="rectangle2" name="a3" x="100" y="100" width="50" height="50" style="fill:green"/>

<rect id="rectangle3" name="a4" x="150" y="150" width="50" height="50" style="fill:green"/>

<rect id="rectangle4" name="a5" x="200" y="200" width="50" height="50" style="fill:green"/>

<rect id="rectangle5" name="a6" x="250" y="250" width="50" height="50" style="fill:green"/>

<rect id="rectangle6" name="a7" x="300" y="300" width="50" height="50" style="fill:green"/>

<rect id="rectangle7" name="a1" x="350" y="350" width="50" height="50" style="fill:green"/>

</g>

</svg>

HTML文件:aa.html

<html><head><title>查询SVG属性</title>

<body >

<script language="javascript" >

function search(searchvalue)

{

var SvgMainMapDoc=id1.getSVGDocument();

SvgObj=SvgMainMapDoc.getElementById('g1');

SvgObj1=SvgObj.getChildNodes;

for(iCount=1;iCount<((SvgObj1.length)-1);iCount+=2)

{

if(SvgObj1.item(iCount).getAttribute("name")==searchvalue)

{

SvgStyle1=SvgObj1.item(iCount).getStyle();

SvgStyle1.setProperty('fill','green');

}

}

}

function clearaa()

{

var SvgMainMapDoc=id1.getSVGDocument();

SvgObj=SvgMainMapDoc.getElementById('g1');

SvgObj1=SvgObj.getChildNodes;

for(iCount=1;iCount<((SvgObj1.length)-1);iCount+=2)

{

SvgStyle1=SvgObj1.item(iCount).getStyle();

SvgStyle1.setProperty('fill','red');

}

}

</script>

<embed name="id1" pluginspage="http://www.adobe.com/svg/viewer/install/" align="top" src="/blog/1.svg" height="200px" width="400px" type="image/svg+xml">

<form name="searchvalue">

<input name="value1"   size="12"><input   type="button" value="查询" name="search1" οnclick="search(this.form.value1.value)">

<input   type="button" value="清除" name="clear" οnclick="clearaa()">

</form>

</body>

</html>

用IE打开aa.html,输入查询的值如”a1”,选择查询将可以看到有两个矩形高亮显示,这是查询的结果。清除可以消除高亮显示。

下面分析一下查询的过程。通过getSVGDocument()获取SVG文档的DOM(文档对象模型),然后再通过getElementById 和ID(”id1”)来获取element的指针,再通过getChildNodes来获得其子节点,最后通过item(序号)来访问其子节点,并逐个判断其name属性的值是否跟要查询的值相同,从而决定是否高亮显示。这里需要注意的是子节点的序号是从1开始,并且以2递增的。

转载于:https://www.cnblogs.com/cuihongyu3503319/archive/2007/09/30/911462.html

SVG脚本编程简介(转)相关推荐

  1. 【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[1]:验证模型

    CKB 脚本编程简介[1]: 验证模型 本文作者:Xuejie原文链接:Introduction to CKB Script Programming 1: Validation Model 本文译者: ...

  2. Photoshop脚本编程简介

    自动化对每个设计师的工作来说是很有用的.它可以在重复的任务上节省宝贵的时间,还能够帮我们更快捷.更容易的解决一系列问题. 你可以使用photoshop的动作来使工作流程自动化,这是很流行的,大多数人都 ...

  3. Linux命令行与shell脚本编程大全:第2版

    <Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...

  4. 《jQuery与JavaScript入门经典》——第 1 章 动态Web编程简介 1.1理解Web服务器浏览器范式...

    本节书摘来自异步社区<jQuery与JavaScript入门经典>一书中的第1章,第1.1节,作者:[美]Brad Dayley著,更多章节内容可以访问云栖社区"异步社区&quo ...

  5. arcgis下的python编程-面向ArcGIS的Python脚本编程

    面向arcgis的python脚本编程是一本指导ArcGIS for Desktop专业用户进行Python开发的指南,本书将教会您如何通过编写Python代码处理空间数据并在ArcGIS中自动化实现 ...

  6. 基于arcgis的python脚本编程视频-面向ArcGIS的Python脚本编程 PDF 高清版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于ArcGIS.Python.脚本编程方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小49.9 MB,Paul编写,目前豆瓣.亚 ...

  7. Shell脚本编程剖析(更新完毕)

    课程简介:     课程包含了Linux/UNIX系统下的Bash编程知识和实例.通过循序渐进的脚本编程知识讲解,学员可以系统的学习脚本编程基础,课程中同时穿插了脚本实例和作业,以强化学员Bash编程 ...

  8. python for arcgis_面向ArcGIS的Python脚本编程 ([美]赞德伯根) 中文pdf扫描版[50MB]

    Python作为一种高级程序设计语言,凭借其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言.使用Python作为ArcGIS的脚本语言将大大提升ArcGIS数据处理的效率,更好地实现ArcGI ...

  9. arcgis工具python源码_面向Arcgis的python脚本编程_数据

    [实例简介] <面向ArcGIS的Python脚本编程>是一本指导ArcGIS for Desktop专业用户进行Python开发的指南.该书将教会您如何通过编写Python代码处理空间数 ...

最新文章

  1. oracle block media recovery,Oracle非归档模式Media Recovery错误之--ORA-26040
  2. 百万人才工程创新大讲堂开课啦!
  3. C语言函数参数既做出参又做入参的代表
  4. corosync+pacemaker在centos7上的安装,配置简述
  5. ElementUI弹框组件 messageBox 如何换行 ?
  6. win7系统搭建tftp服务器,Win7旗舰版如何开启TFTP服务器|开启Win7旗舰版TFTP服务器的方法...
  7. 电脑可以开机但是黑屏_铅锤哥:十五种电脑开机黑屏的原因与解决思路
  8. Java中this关键字的使用
  9. 暑期集训 Day2 简单博弈论
  10. MySQL 使用utf8mb4代替utf8
  11. 地狱少女...._习惯累积沉淀_新浪博客
  12. 胡理辉:风电王国里的流程管控人
  13. javascript 递归乘阶
  14. 利用字典实现大侠个人信息查询程序
  15. matlab绘制累计频率曲线图,累积频率曲线怎么画,怎么画累计曲线图
  16. 活期账户10亿个+日均交易4亿笔,建设银行如何啃下系统转型的“硬骨头”?
  17. 【JDK7】新特性(5) fork/join 框架
  18. UnityHLSLShader 函数笔记
  19. 安全基础--23--应急响应(上)
  20. 大学物理---统计物理(热学部分)

热门文章

  1. html文件div盒子浮动,css基础03-盒模型、网站布局思想、浮动以及浮动带来的影响...
  2. 用matlab做单摆,单摆模型MATLAB程序
  3. 详解CoordinatorLayout
  4. 前端路由的概念与原理
  5. safari浏览器横屏怎么设置_Safari浏览器的几个小技巧你掌握了吗?
  6. MySQL退出选择表格_MySQL常用命令
  7. linux标准分发版的描述信息,如何查看Linux中系统版本信息
  8. linux处理机调度实验报告,处理机调度试验
  9. linux查看wan的ip地址,查看wan口ip地址操作方法
  10. 10没有基于策略的qos_基于强化学习的用户移动场景下空中基站3D位置高效部署...