新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论SVG, GML, X3D, VRML, VML, XAML, AVALON, Batik等基于XML的图形技术,以及有关GIS的应用。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - 高级XML应用『 SVG/GML/VRML/X3D/XAML 』 → SVG脚本编程介绍(二) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 9042 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: SVG脚本编程介绍(二) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 SVG脚本编程介绍(二)

    三、           脚本编程应用实例

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

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

    请看下面的例子:

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

    <script><![CDATA[

    function mout()

    {

           alert("you are out");

    }

    ]]></script>

    <g id="rect1">

    <rect id="rectangle1"  onmouseout="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="1.svg" height="200px" width="400px" type="image/svg+xml">

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

    <input type="button" value="缩小" name="sxiao" onclick="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="1.svg" height="200px" width="400px" type="image/svg+xml">

    <form name="searchvalue">

    <input name="value1"  size="12"><input  type="button" value="查询" name="search1" onclick="search(this.form.value1.value)">&nbsp;

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

    </form>

    </body>

    </html>

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

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

    上面给出了脚本编程的例子,如果想了解更多的脚本编程方面的资料,请访问http://www.w3.org/TR/SVG/,里面有详细的SVG资料!


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/12 16:22:00
     
     yuxi2000 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(C++考了100分!)
      文章:61
      积分:324
      门派:XML.ORG.CN
      注册:2004/12/4

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给yuxi2000发送一个短消息 把yuxi2000加入好友 查看yuxi2000的个人资料 搜索yuxi2000在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看yuxi2000的博客2
    发贴心情 
    很好哦
    一定要支持

    ----------------------------------------------
    http://yuxi2000.blogchina.com

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/13 14:24:00
     
     molester 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究汇编)
      文章:48
      积分:224
      门派:XML.ORG.CN
      注册:2004/4/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给molester发送一个短消息 把molester加入好友 查看molester的个人资料 搜索molester在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看molester的博客3
    发贴心情 
    多次放大呢?比如说我在图片上拉一个框,获取点击的坐标,如何将其设置为viewbox的属性,问题就是,我经过一次放大后,获取的坐标就不是绝对坐标,是相对的坐标了。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/14 10:10:00
     
     天啦 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:22
      积分:163
      门派:XML.ORG.CN
      注册:2004/12/29

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给天啦发送一个短消息 把天啦加入好友 查看天啦的个人资料 搜索天啦在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看天啦的博客4
    发贴心情 
    是啊,用心研究肯定能想出解决办法的
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/1/27 16:35:00
     
     _phoenix 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:25
      积分:153
      门派:XML.ORG.CN
      注册:2005/4/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给_phoenix发送一个短消息 把_phoenix加入好友 查看_phoenix的个人资料 搜索_phoenix在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看_phoenix的博客5
    发贴心情 
    正好用得着.
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/12 23:54:00
     
     duoduo2005-1 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:2
      积分:61
      门派:XML.ORG.CN
      注册:2005/9/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给duoduo2005-1发送一个短消息 把duoduo2005-1加入好友 查看duoduo2005-1的个人资料 搜索duoduo2005-1在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看duoduo2005-1的博客6
    发贴心情 
    如何从SVG地图中查询某点的属性数据?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/9/19 21:34:00
     
     cuijie 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:12
      积分:105
      门派:XML.ORG.CN
      注册:2005/9/26

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cuijie发送一个短消息 把cuijie加入好友 查看cuijie的个人资料 搜索cuijie在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看cuijie的博客7
    发贴心情 
    基本概念
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/9/27 8:52:00
     
     starzxy 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:82
      门派:XML.ORG.CN
      注册:2006/2/20

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给starzxy发送一个短消息 把starzxy加入好友 查看starzxy的个人资料 搜索starzxy在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看starzxy的博客8
    发贴心情 
    hao !
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/24 14:09:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/8/6 9:13:17

    本主题贴数8,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    140.625ms