之前展示的 SVG都缺乏交互性, 只展示了它矢量图的 “功力”,从本章开始,
我们将进入 SVG开发的核心章节, 在脚本的帮助下, SVG将发挥出它更大的潜能。
12.1 在 SVG 中使用 JavaScript 脚本
JavaScript 脚本在 SVG中分为内部脚本和外部脚本两种, 内部和外部只是引
用方式的区别, 对程序的编写不造成影响。 首先介绍一下内部脚本, 它是以如下
形式嵌入到 SVG文档中的:
SVG采用
该例展示了如何在 SVG文档被载入后,调用初始化程序,以获得 SVG的 DOM
结构,为后续的编程做好准备。
例程 12-1 中,u 处表示在 SVG文档载入时激活的“ onload ”事件中执行“i
nit ”函数;“init ”函数先是得到 SVG Document对象,然后获得该对象的根元
素(也就是“ SVG”元素),最后的效果是弹出一个消息框,上面显示“ SVG”。
v 处的代码可以替换为 “svgDoc = evt.getTarget().getOwnerDocument;
”,
得到的效果是一样的。
12.2.2 DOM 对象操作相关
前面我们已经介绍过, DOM对象是一个树型的结构,并且经过载入后就放在
内存中供我们读写。 如何对这棵树进行操作, 也就成为发挥 SVG交互性很关键的
一步。下面所示的方法中,有些是文档对象( Document)的方法,有些是文档元
素(Element)的方法,需要区别开来。 DOM可以分为三大部分:文档基本元素、
文档对象和各种类型的从文档基本元素派生出的文档元素。 文档对象是文档对象
模型的顶级对象, 它包含了整个文档的内容。 各种类型的文档元素派生自文档基
本元素类型,用于描述文档中各种实际存在的元素。 其中可以定义一种文档元素,
它们可以容纳其他的文档元素, 这些元素就是容器元素, 实际上文档对象就是最
大的容器元素。 由于文档对象模型中存在容器元素, 因此所有的对象都组成一个
树状结构,称为文档对象树或者 DOM树,其中根节点就是文档对象。
— getElementById(ID_Name) 方法
通过元素的 ID 名获得该元素。
使用举例: object = svgdoc.getElementById("map")
— getElementsByTagName(Tag_Name)方法
通过元素名获得一个或者一组元素,注意方法名中的“ Elements”是复
数,说明返回的元素可能有多个,是一个“ NodeList ”。
使用举例: object = svgdoc.getElementsByTagName ("rect")
例程 12-2 获得 SVG 文档中的元素
打开该文档后,弹出的消息框上显示“ [object SVGRectElement],[object
NodeList] ”。
例程 12-2 中, u 处使用“ rect1 ”的 ID 名得到了“ svgRoot”下属的一个矩
形元素( SVGRectElement)。v 是为了获得所有“ svgRoot”下属的“ ”
元素,返回的是一个“ NodeList ”,本例中一共有三个符合条件的元素。
— getAttribute(ID_Name) 方法
根据所提供的 ID 名来获得元素的属性值。
使用举例: color = node.getAttribute ("fill")
— setAttribute(Attribute_Name,Value)
方法
设置该元素属性名为“ Attribute_Name ”,属性的值为“ Value”。
使用举例: color = node.getAttribute ("fill")
— setAttributeNS(NameSpace, Attribute_Name ,Value)
方法
功能效果同 setAttribute 方法,区别就是增加了为属性名加上命名空
间(NameSpace)。在 ASV3.0中,属性名都是默认 SVG的命名空间,所
以不需要再特别注明,但是如果你要使用“ xlink ”中的属性,就要加
入相应的命名空间“ http://www.w3.org/2000 /xlink/namespace/
”。
使用举例: object = svgdoc.setAttributeNS ("http://www.w3.org/2000/
xlink/namespace/", xlink:href, "index.html")
注意 绝对不要在同一个程序中混合使用 DOM1非名称空间 API 和 DOM2名称
空间感知的 API(例如, createElement 和 createElementNS )。如果使用名称
空间,请尽量在根元素位置声明所有名称空间, 并且不要覆盖名称空间前缀, 否
则情况会非常混乱。 一般来说, 只要按照惯例, 就不会触发使你陷入麻烦的临界
情况。
例程 12-3 设置 SVG 元素的属性
使用举例: newnode = svgdoc.createElement ("rect" )
— appendChild(Element) 方法
在该元素的最后追加一个孩子节点。
使用举例: someElement.appendChild (node)
例程 12-4 动态创建 SVG 的元素
Click
the rectangle
在上面这个 SVG文档中,没有看到对“ rect ”元素的定义,但是实际显示的
时候还是显示了一个红色的矩形,原因就在于例程 12-4 中 u 处,我们使用“ cr
eateElement ”方法动态生成了一个矩形元素, 并且逐个设置了它的 “x”、“y”、
“width ”、“ height ”及“ fill ”属性,并且在 v 处为该元素添加了“ mousem
ove”事件及事件相应的函数名。 但是这样生成的矩形元素依旧还是 “流离失所”,
无法显示出来, 需要使用 appendChild 、insertBefore 、replaceChild 等方法把
生成的节点元素添加到其他元素下才能显示。 所以,执行 w处的语句后, 生成的
新元素被加入到名为“ group”的组中去,从而显示出来。最终的 DOM结构如图
12-1 所示。
图 12-1 动态生成 SVG 元素后的
DOM 结构
从图 12-1 中可以看出,
新加入的“rect ”元素与之前
就存在的“text ”元素位置并
列。
— replaceChild(newElement, oldElement)
方法
在某元素的子节点中,使用新元素替代旧元素。
使用举例: someElement.replaceChild (newNode, oldNode)
例程 12-5 replaceChild 方法使用举例
© 2024 本站由 资料铺 提供技术支持 网站地图