以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 SVG/GML/VRML/X3D/XAML 』 (http://bbs.xml.org.cn/list.asp?boardid=21) ---- 使用脚本动态操作 SVG 文档 (http://bbs.xml.org.cn/dispbbs.asp?boardid=21&rootid=&id=44032) |
-- 作者:卷积内核 -- 发布时间:3/17/2007 4:42:00 PM -- 使用脚本动态操作 SVG 文档 SVG 图像的结构是用 XML 文档表示的,因此可以使用 XML 编程技术如"文档对象模型(Document Object Model,DOM)"来操纵它。本文描述了如何使用 ECMAScript/JavaScript 来支持与 SVG 图像的交互。理论上说我们可以用这些知识实现类似射击游戏这样复杂的图形交互程序。 有两种方法可以对SVG文档的DOM对象进行操作:通过JavaScript在SVG文档内部进行处理;在Batik环境下通过相关接口获取当前显示SVG视图的DOM对象引用使用Java语言对SVG文档进行处理。本文重点描述使用JavaScript对SVG进行操作的相关技术,并在文章最后用一个简单的例子实现Batik下通过Java实现操作DOM对象。另外还用相当的篇幅讨论了常用SVG浏览工具中支持的特殊 ECMAScript/JavaScript 用法,这些方法可以显著提高我们的开发速度。 1. 理解 SVG 对象结构 在 SVG 浏览器上下文环境("上下文环境"一词来自"context"的直译)中,除了 SVG 本身作为 XML 文档所包含的 DOM 对象外,还包含一些其他对象,这些支持对象随着浏览工具的不同而在细节上有所区别。 Window 是一个全局变量,该变量表示 SVG 运行时的浏览器窗口对象。因为脚本的运行就是在 window 对象内部进行的,所以调用该对象方法和属性时可以省去对 window 变量的指定,例如 window.document 可以直接通过 document 实现引用。完全介绍 window 对象的属性和方法内容已经超出了本文的范围,有兴趣的读者可以通过参考资料查阅详细说明。 Document 是 window 对象中的静态全局变量,通过该变量我们可以立即获取当前浏览 SVG 图形的 SVG 文档对象(SVGDocument)。通过获取 SVG 文档对象我们就可以在 DOM 框架下对当前 SVG 文档的内容进行动态操作。 contextMenu 变量只在 Adobo SVG Viewer3.0中有效,该变量同 document 变量一样,也是 window 对象的静态全局变量。它引用了在Adobo SVG Viewer3.0浏览环境下单击鼠标右键时所展示菜单的 XML 文档对象(Document),通过重新构建该变量引用的对象内容,我们可以重新构建浏览时鼠标右键菜单的字体和条目。 |
-- 作者:卷积内核 -- 发布时间:3/17/2007 4:43:00 PM -- 2. 将 JavaScript 脚本放在哪里 使用 JavaScript 首先我们要解决一个简单的问题:我们把脚本代码放在哪里?SVG 标准允许将JavaScript 脚本代码以两种方式来实现:使用 script 元素将 JavaScript 脚本内嵌在 SVG 文件中;或使用script 的 xlink:href 属性从 SVG 文件之外连接 JavaScript 脚本文件。从脚本实现的功能上来说,这两种代码加载方式没有区别,我们可以将共享的脚本代码放在外边连接文件中,把该 SVG 文件个性化的代码嵌在自身的文件中。 下面是一个 SVG 文件和一份 JavaScript 脚本文件,将这两个文件放在同一个文件夹下打开即可运行。 1. <?xml version="1.0" encoding="UTF-8"?>
function Lib_function(str){
特别需要留意的是第 3 行的对名称空间的声明。名称空间的声明指定了这些 SVG 元素位于 SVG 名称空间内,编写这些元素时无需带任何名称空间的前缀。在使用Adobo SVG Viewer3.0浏览 SVG 图像时可以缺省定义这些命名空间,Adobo SVG Viewer3.0浏览环境会默认的将文档内的 XML 元素识别为SVG 元素。但当我们使用Batik 浏览 SVG 图像时,这些命名空间是必须要指定的,否则,脚本的链接和其他一些复杂的功能将不能起作用。
|
-- 作者:卷积内核 -- 发布时间:3/17/2007 4:43:00 PM -- 3. 通过 JavaScript 动态操作 SVG 文档 3.1 通过 DOM 对象操作节点 在 JavaScript 环境下,通过 DOM 定义的接口,我们可以在 SVG 的 XML 树中漫游,可以对找到的节点属性重新赋值,还可以在当前文档中删除节点或添加新创建的节点。 下面的例子展示了通过 DOM 接口如何删除现有节点,添加新的节点并为新节点设置了超级链接地址: <g onclick="operate_Dom()" id="g5" transform="translate(0 80)">
|
-- 作者:卷积内核 -- 发布时间:3/17/2007 4:46:00 PM -- 4. 由浏览工具提供的脚本支持 在 W3C 的 SVG 标准之外,各种品牌的 SVG 浏览器还提供了一些在 SVG 编程中支持的特殊函数和对象,用于实现一些特殊功能或提高开发效率。其中有些函数是各个产品都实现了的,这就大大降低了我们在移植过程中的难度。 4.1 数据通讯函数 函数名称:getURL(uri, GetURLHandler) function loadFile () {
由 Adobo 实现的 getURL 方法在加载文件时可以智能的判断加载文件的文件类型和编码方式,你可以加载gzip 压缩的 xml 文件,比如压缩存储格式的.svgz 文件在加载后会自动进行必要的解压操作。在加载文本文件的时候还可以根据加载文件的编码格式(ASCII ,UTF-8,UTF-16)进行自动识别。 警告:在Adobe SVG Viewer 的早期版本(3.0以前)中可以为 getURL 的 url 参数设定任意路径的文件,远程攻击者可以利用这个漏洞读取系统本地或远程文件,泄露敏感信息。不过 IE6 SP1 对从 Internet 域读取本地文件内容做了限制,因此 IE6 SP1 不存在此问题,也可以通过下载 Adobe SVG Viewer3.01 版本来弥补这个漏洞。弥补漏洞后只可以为 getURL()设定 SVG 文件所在 URI 域的文件路径。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
62.500ms |