- 浏览: 126415 次
- 来自: ...
最近访客 更多访客>>
文章分类
最新评论
-
dwangel:
给messageSource设置属性
<property ...
Spring i18n的better practice(相对于appfuse) -
dwangel:
spring 的message tag有一个属性text,可以 ...
Spring i18n的better practice(相对于appfuse) -
sn201:
awk高级篇
有问题啊!有问题!有问题!有问题!有问题!
i ...
awk文本处理总结(入门,中级,高级) -
happy_javaboy:
...
Log4j日志管理系统简单使用说明
文档对象模型(Document Object Model,DOM)是用于操纵 XML 和 HTML 数据的最常用工具之一,然而它的潜力却很少被充分挖掘出来。通过利用 DOM 的优势,并使它更加易用,您将获得一款应用于 XML 应用程序(包括动态 Web 应用程序)的强大工具。<!--START RESERVED FOR FUTURE USE INCLUDE FILES--> <!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
本期文章介绍了一位客串的专栏作家,同时也是我的朋友和同事 Dethe Elza。Dethe 在利用 XML 进行 Web 应用程序开发方面经验丰富,在此,我要感谢他对我在介绍使用 DOM 和 ECMAScript 进行 XML 编程这一方面的帮助。请密切关注本专栏,以了解 Dethe 的更多专栏文章。 —— David Mertz
DOM 是处理 XML 和 HTML 的标准 API 之一。由于它占用内存大、速度慢,并且冗长,所以经常受到人们的指责。尽管如此,对于很多应用程序来说,它仍然是最佳选择,而且比 XML 的另一个主要 API —— SAX 无疑要简单得多。DOM 正逐渐出现在一些工具中,比如 Web 浏览器、SVG 浏览器、OpenOffice,等等。
DOM 很好,因为它是一种标准,并且被广泛地实现,同时也内置到其他标准中。作为标准,它对数据的处理与编程语言无关(这可能是优点,也可能是缺点,但至少使我们处理数据的方式变得一致)。DOM 现在不仅内置于 Web 浏览器,而且也成为许多基于 XML 的规范的一部分。既然它已经成为您的工具的一部分,并且或许您偶尔还会使用它,我想现在应该充分利用它给我们带来的功能了。
在使用 DOM 一段时间后,您会看到形成了一些模式 —— 您想要反复做的事情。快捷方式可以帮助您处理冗长的 DOM,并创建自解释的、优雅的代码。这里收集了一些我经常使用的技巧和诀窍,还有一些 JavaScript 示例。
第一个诀窍就是“没有诀窍”。DOM 有两种方法将孩子节点添加到容器节点(常常是一个 Element
,也可能是一个 Document
或 DocumentFragment
):appendChild(node)
和 insertBefore(node, referenceNode)
。看起来似乎缺少了什么。假如我想在一个参考节点后面插入或者由前新增(prepend)一个子节点(使新节点位于列表中的第一位),我该怎么做呢?很多年以来,我的解决方法是编写下列函数:
清单 1. 插入和由前新增的错误方法
|
实际上,像清单 1 一样,insertBefore()
函数已经被定义为,在参考节点为空时返回到 appendChild()
。因此,您可以不使用上面的方法,而使用 清单 2 中的方法,或者跳过它们仅使用内置函数:
清单 2. 插入和由前新增的正确方法
|
如果您刚刚接触 DOM 编程,有必要指出的是,虽然您可以使多个指针指向一个节点,但该节点只能存在于 DOM 树中的一个位置。因此,如果您想将它插入到树中,没必要先将它从树中移除,因为它会自动被移除。当重新将节点排序时,这种机制很方便,仅需将节点插入到新位置即可。
根据这种机制,若想交换两个相邻节点(称为 node1
和 node2
)的位置,可以使用下列方案之一:
|
或
|
|
|
Web 页面中大量应用了 DOM。若访问 bookmarklets 站点(参阅 参考资料),您会发现很多有创意的简短脚本,它们可以重新编排页面,提取链接,隐藏图片或 Flash 广告,等等。
但是,因为 Internet Explorer 没有定义 Node
接口常量(可以用于识别节点类型),所以您必须确保在遗漏接口常量时,首先为 Web 在 DOM 脚本中定义接口常量。
清单 3. 确保节点被定义
|
清单 4 展示如何提取包含在节点中的所有文本节点:
清单 4. 内部文本
|
|
|
人们常常抱怨 DOM 太过冗长,并且简单的功能也需要编写大量代码。例如,如果您想创建一个包含文本并响应点击按钮的 <div>
元素,代码可能类似于:
清单 5. 创建 <div> 的“漫长之路”
|
若频繁按照这种方式创建节点,键入所有这些代码会使您很快疲惫不堪。必须有更好的解决方案 —— 确实有这样的解决方案!下面这个实用工具可以帮助您创建元素、设置元素属性和风格,并添加文本子节点。除了 name
参数,其他参数都是可选的。
清单 6. 函数 elem() 快捷方式
|
使用该快捷方式,您能够以更加简洁的方法创建 清单 5 中的 <div>
元素。注意,attrs
和 style
参数是使用 JavaScript 文本对象而给出的。
清单 7. 创建 <div> 的简便方法
|
在您想要快速创建大量复杂的 DHTML 对象时,这种实用工具可以节省您大量的时间。模式在这里就是指,如果您有一种需要频繁创建的特定的 DOM 结构,则使用实用工具来创建它们。这不但减少了您编写的代码量,而且也减少了重复的剪切、粘贴代码(错误的罪魁祸首),并且在阅读代码时思路更加清晰。
|
|
DOM 通常很难告诉您,按照文档的顺序,下一个节点是什么。下面有一些实用工具,可以帮助您在节点间前后移动:
清单 8. nextNode 和 prevNode
|
|
|
有时候,您可能想要遍历 DOM,在每个节点调用函数或从每个节点返回一个值。实际上,由于这些想法非常具有普遍性,所以 DOM Level 2 已经包含了一个称为 DOM Traversal and Range 的扩展(为迭代 DOM 所有节点定义了对象和 API),它用来为 DOM 中的所有节点应用函数和在 DOM 中选择一个范围。因为这些函数没有在 Internet Explorer 中定义(至少目前是这样),所以您可以使用 nextNode()
来做一些类似的事情。
在这里,我们的想法是创建一些简单、普通的工具,然后以不同的方式组装它们来达到预期的效果。如果您很熟悉函数式编程,这看起来会很亲切。Beyond JS 库(参阅 参考资料)将此理念发扬光大。
清单 9. 函数式 DOM 实用工具
|
清单 9 包含了 4 个基本工具。listNodes()
和 listNodesReversed()
函数可以扩展到一个可选的长度,这与 Array
的 slice()
方法效果类似,我把这个作为留给您的练习。另一个需要注意的是,map()
和 filter()
函数是完全通用的,用于处理任何 列表(不只是节点列表)。现在,我向您展示它们的几种组合方式。
清单 10. 使用函数式实用工具
|
您可以使用这些实用工具来提取 ID、修改样式、找到某种节点并移除,等等。一旦 DOM Traversal and Range API 被广泛实现,您无需首先构建列表,就可以用它们修改 DOM 树。它们不但功能强大,并且工作方式也与我在上面所强调的方式类似。
注意,核心 DOM API 并不能使您将 XML 数据解析到 DOM,或者将 DOM 序列化为 XML。这些功能都定义在 DOM Level 3 的扩展部分“Load and Save”,但它们还没有被完全实现,因此现在不要考虑这些。每个平台(浏览器或其他专业 DOM 应用程序)有自己在 DOM 和 XML 间转换的方法,但跨平台转换不在本文讨论范围之内。
DOM 并不是十分安全的工具 —— 特别是使用 DOM API 创建不能作为 XML 序列化的树时。绝对不要在同一个程序中混合使用 DOM1 非名称空间 API 和 DOM2 名称空间感知的 API(例如,createElement
和 createElementNS
)。如果您使用名称空间,请尽量在根元素位置声明所有名称空间,并且不要覆盖名称空间前缀,否则情况会非常混乱。一般来说,只要按照惯例,就不会触发使您陷入麻烦的临界情况。
如果您一直使用 Internet Explorer 的 innerText
和 innerHTML
进行解析,那么您可以试试使用 elem()
函数。通过构建类似的一些实用工具,您会得到更多便利,并且继承了跨平台代码的优越性。将这两种方法混合使用是非常糟糕的。
某些 Unicode 字符并没有包含在 XML 中。DOM 的实现使您可以添加它们,但后果是无法序列化。这些字符包括大多数的控制字符和 Unicode 代理对(surrogate pair)中的单个字符。只有您试图在文档中包含二进制数据时才会遇到这种情况,但这是另一种转向(gotcha)情况。
|
|
我已经介绍了 DOM 能做的很多事情,但是 DOM(和 JavaScript)可以做的事情远不止这些。仔细研究、揣摩这些例子,看看是如何使用它们来解决可能需要客户端脚本、模板或专用 API 的问题。
DOM 有自己的局限性和缺点,但同时也拥有众多优点:它内置于很多应用程序中;无论使用 Java 技术、Python 或 JavaScript,它都以相同方式工作;它非常便于使用 SAX;使用上述的模板,它使用起来既简洁又强大。越来越多的应用程序开始支持 DOM,这包括基于 Mozilla 的应用程序、OpenOffice 和 Blast Radius 的 XMetaL。越来越多的规范需要 DOM,并对它加以扩展(例如,SVG),因此 DOM 时时刻刻就在您的身边。使用这种被广泛部署的工具,绝对是您的明智之举。
|
|
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
- 下载 JavaScript 库,它包含了上面的脚本和一个用于测试这些脚本的简单 测试页面。
- 直接访问 DOM 发源地 —— W3C 的 DOM 资源页面 ,其中包含到所有与文档对象模型相关的标准的链接。
- 查看 Jesse Ruderman 的 bookmarklets。虽然 Ruderman 没有创造术语“bookmarkets”,但他收集了很多一流的、简短的、书签似的 JavaScript,使用它们开发 DOM 的巨大潜力,使您的浏览器可以为您带来更多帮助。
- 访问 Sjoerd Visscher 的 Beyond JS 库,它提供了远远超过我在这里提及的用于函数式编程的工具。如果您可以将事物抽象为函数,那么 JavaScript 将会成为您得心应手的工具。
- DOM API 的标准参考在 W3C。这里是 DOM2 到 JavaScript (ECMAScript)映射 的网址。
- 了解 AJAX 为什么已经引起了这么大的反响。它使用了异步调用来使服务器实时升级 Web 应用程序。您可以使用上述的许多技术,并阅读 异步通信工具。
- 了解一下 XML 编辑器和工具的 XMetaL 系列,它们都支持 DOM API。它们由作者所在的公司 Blast Radius 开发。
- 在 developerWorks 的 Developer Bookstore 了解更多 XMl 相关的书籍,其中包括 David Mertz 的 Text Processing in Python一书。
- 了解如何才能成为 IBM 认证的 XML 及相关技术的开发人员。
发表评论
-
开发跨浏览器的JavaScript
2006-06-21 21:55 574判定浏览器类型:if(document.uniqueID)如果 ... -
AJAX开发简略
2006-06-22 12:23 592http://www.blogjava.net/eamoi/a ... -
JAVASCRIPT中使用DOM操作XML文档
2006-06-22 12:28 641<script language="JavaS ... -
WEB打印大全
2006-08-22 15:07 6161、控制"纵打"、 横打”和“页面的边距。 ... -
Ajax自动完成功能
2006-10-08 14:12 788近日学习了一下AJAX ... -
Buffalo VS DWR
2006-10-19 15:31 689摘要:本文根据BJUG maillist讨论整理,取 ... -
兼容在IE和Firefox浏览器下操作XML(英)
2006-11-16 12:20 637本文摘自http://www.w3schools.com,虽是 ... -
实例解析Js+XML的操作方法
2006-11-16 12:25 748『本文地址:http://v3.djasp.net/Stati ... -
DOM操作XML的示例代码
2006-11-16 12:28 989『本文地址:http://v2.djasp.net/Stati ... -
dom4j(Version 1.6.1)快速入门
2006-11-17 15:14 682Parsing XML 或许你想要做的第一件事情就是解析一 ... -
[DWR文档] WEB-INF 参考
2006-11-19 13:50 579... -
经典正则表达式 Javascript [ZT]
2007-03-16 17:08 705摘要:收集一些常用的正则表达式。 正则表达式用于字符串处理 ... -
Dom4j的使用(全而好的文章)
2008-10-31 11:33 566Dom4j的使用(全而好的文章) 关键字: dom4j ...
相关推荐
7. 编程语言中的XML处理:了解如何在Java、Python、C#等编程语言中使用内置库来处理XML,例如Java的DOM、SAX和JAXB,Python的ElementTree等。 8. 实际应用案例:可能会包含一些实际项目中使用XML的场景,比如Web...
《XML 诀窍》是一本专注于XML技术的实践指南,旨在帮助网页开发者、系统管理员以及对XML感兴趣的程序员提升技能和效率。XML(可扩展标记语言)作为一种通用的数据交换格式,被广泛应用于网络数据传输、文档存储和...
在这个“计算机软件-编程源码-XML 诀窍.zip”压缩包中,很可能包含了一些关于XML编程的源代码示例和技巧,旨在帮助开发者更好地理解和使用XML。 1. **XML基础** - **语法**:XML是一种结构化语言,其基本元素包括...
【使用XSLT转换Web服务WSDL文档的技巧和诀窍】 在Web服务领域,WSDL(Web Services Description Language)文档扮演着至关重要的角色,它用XML格式详细描述了服务接口和实例的位置。WSDL的XML表示使得各种开发工具...
这个"javascript小技巧"的压缩包显然包含了诸多实用的JavaScript技术与窍门,旨在帮助初学者快速上手,同时也为有经验的开发者提供进一步提升技能的资源。以下是基于标题、描述和文件名推测出的一些JavaScript知识点...
《JavaScript Anthology: 101 Essential Tips, Tricks & Hacks》是一本专注于JavaScript编程实践的书籍,旨在帮助开发者提升JavaScript技能,掌握一系列实用的技巧、窍门和黑客技术。这本书的内容涵盖了AJAX、CSS、...
- **调试技巧**: 分享了调试扩展的方法和技巧,帮助开发者快速定位问题所在。 #### 三、高级主题 - **跨浏览器兼容性**: 探讨了如何确保Firefox插件能够在其他主流浏览器上正常工作。 - **性能优化**: 讨论了提高...
- **JavaScript库**: 通过使用JavaScript库(如jQuery等),可以更轻松地处理AJAX请求、DOM操作等任务。 - **服务器端对象**: 这些对象负责处理来自客户端的请求,并返回必要的数据或执行特定的业务逻辑。 ##### 2....
在网页设计中,导航栏是页面布局的重要组成部分,它帮助用户快速访问网站的不同部分。"非常漂亮的页面导航代码,纯CSS+JQUERY"这个主题聚焦于如何...不断实践和探索,你将能够掌握更多关于创建高效导航栏的技巧和窍门。
"web-tips-and-tricks"这个存储库显然致力于收集实用的Web开发小窍门和代码示例,帮助开发者提升工作效率,解决常见问题。让我们详细探讨一下这个主题可能涵盖的一些关键知识点: 1. HTML基础:HTML(HyperText ...
miPage是一个展示技术才华和个人职业追求的示例网站,它主要由JavaScript构建,旨在成为作者与潜在雇主、同行以及支持者之间沟通的平台。在这个项目中,JavaScript作为客户端脚本语言发挥着核心作用,它负责处理用户...
13. **Tips and Tricks**:提示和技巧,可能是作者在开发过程中积累的一些实用小窍门。 14. **Fullstack JavaScript**:全栈JavaScript开发,强调使用JavaScript技术栈完成从前端到后端的开发。 15. **Job Search*...