📄 掌握 ajax,第 4 部分 利用 dom 进行 web 响应.htm
字号:
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro4/#listing3">3</A>
中的 HTML,确保文本具有正确的父元素(而不管文本最终会如何显示在屏幕上)。</P><BR><BR><A
name=listing2><B>清单 2. 带有巧妙元素嵌套的标记</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>
<html>
<head>
<title>This is a little tricky</title>
</head>
<body>
<h1>Pay <u>close</u> attention, OK?</h1>
<div>
<p>This p really isn't <em>necessary</em>, but it makes the
<span id="bold-text">structure <i>and</i> the organization</span>
of the page easier to keep up with.</p>
</div>
</body>
</html>
</PRE></TD></TR></TBODY></TABLE><BR><BR><BR><A name=listing3><B>清单
3. 更巧妙的元素嵌套</B></A><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>
<html>
<head>
<title>Trickier nesting, still</title>
</head>
<body>
<div id="main-body">
<div id="contents">
<table>
<tr><th>Steps</th><th>Process</th></tr>
<tr><td>1</td><td>Figure out the <em>root element</em>.</td></tr>
<tr><td>2</td><td>Deal with the <span id="code">head</span> first,
as it's usually easy.</td></tr>
<tr><td>3</td><td>Work through the <span id="code">body</span>.
Just <em>take your time</em>.</td></tr>
</table>
</div>
<div id="closing">
This link is <em>not</em> active, but if it were, the answers
to this <a href="answers.html"><img src="exercise.gif" /></a> would
be there. But <em>do the exercise anyway!</em>
</div>
</div>
</body>
</html>
</PRE></TD></TR></TBODY></TABLE><BR>
<P>在本文末的 GIF 文件 <A
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro4/#fig2">图
2 中的 tricky-solution.gif</A> 和 <A
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro4/#fig3">图
3 中的 trickier-solution.gif</A>
中将会找到这些练习的答案。不要偷看,先花些时间自动解答一下。这样能帮助您理解组织树时应用的规则有多么严格,并真正帮助您掌握 HTML
及其树结构。</P>
<P><A name=N102D4><SPAN class=smalltitle>属性呢?</SPAN></A></P>
<P>当您试图弄清楚如何处理属性时,是否遇到一些问题呢?前已提及,属性确实具有自己的对象类型,但属性确实不是显示它的元素的子元素,嵌套元素和文本不在同一属性
“级别”,您将注意到,清单 <A
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro4/#listing2">2</A>
和 <A
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro4/#listing3">3</A>
中练习的答案没有显示属性。</P>
<P>属性事实上存储在浏览器使用的对象模型中,但它们有一些特殊情况。每个元素都有可用属性的列表,且与子对象列表是分离的。所以
<CODE>div</CODE> 元素可能有一个包含属性 “id” 和另一个属性 “class” 的列表。</P>
<P>记住,元素的属性必须具有惟一的名称,也就是说,一个元素不能有两个 “id” 或两个 “class”
属性。这使得列表易于维护和访问。在下一篇文章将会看到,您可以简单调用诸如 <CODE>getAttribute("id")</CODE>
的方法来按名称获取属性的值。还可以用相似的方法调用来添加属性或设置(重置)现有属性的值。</P>
<P>值得指出的是,属性名的惟一性使得该列表不同于子对象列表。<CODE>p</CODE> 元素可以有多个
<CODE>em</CODE>
元素,所以子对象列表可以包含多个重复项。尽管子项列表和属性列表的操作方式相似,但一个可以包含重复项(对象的子项),而一个不能(元素对象的属性)。最后,只有元素具有属性,所以文本对象没有用于存储属性的附加列表。</P>
<P><A name=N102FE><SPAN class=smalltitle>凌乱的 HTML</SPAN></A></P>
<P>在继续之前,谈到浏览器如何将标记转换为树表示,还有一个主题值得探讨,即浏览器如何处理不是格式良好的标记。<I>格式良好</I> 是
XML 广泛使用的一个术语,有两个基本意思:</P>
<UL>
<LI>每个开始标记都有一个与之匹配的结束标记。所以每个 <CODE><p></CODE> 在文档中与
<CODE></p></CODE> 匹配,每个 <CODE><div></CODE> 与
<CODE></div></CODE> 匹配,等等。
<LI>最里面的开始标记与最里面的结束标记相匹配,然后次里面的开始标记与次里面的结束标记相匹配,依此类推。所以
<CODE><b><i>bold and
italics</b></i></CODE> 是不合法的,因为最里面的开始标记
<CODE><i></CODE> 与最里面的结束标记 <CODE><b></CODE>
匹配不当。要使之格式良好,<I>要么</I> 切换开始标记顺序,<I>要么</I>
切换结束标记顺序。(如果两者都切换,则仍会出现问题)。 </LI></UL>
<P>深入研究这两条规则。这两条规则不仅简化了文档的组织,还消除了不定性。是否应先应用粗体后应用斜体?或恰恰相反?如果觉得这种顺序和不定性不是大问题,那么请记住,CSS
允许规则覆盖其他规则,所以,例如,如果 <CODE>b</CODE> 元素中文本的字体不同于 <CODE>i</CODE>
元素中的字体,则格式的应用顺序将变得非常重要。因此,HTML 的格式良好性有着举足轻重的作用。</P>
<P>如果浏览器收到了不是格式良好的文档,它只会尽力而为。得到的树结构在最好情况下将是作者希望的原始页面的近似,最坏情况下将面目全非。如果您曾将页面加载到浏览器中后看到完全出乎意料的结果,您可能在看到浏览器结果时会猜想您的结构应该如何,并沮丧地继续工作。当然,搞定这个问题相当简单:确保文档是格式良好的!如果不清楚如何编写标准化的
HTML,请咨询 <A
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro4/#resources">参考资料</A>
获得帮助。</P>
<P><A name=N10347><SPAN class=atitle>DOM 简介</SPAN></A></P>
<P>到目前为止,您已经知道浏览器将 Web 页面转换为对象表示,可能您甚至会猜想,对象表示是 DOM 树。DOM 表示
Document Object Model,是一个规范,可从 World Wide Web Consortium (W3C)
获得(您可以参阅 <A
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro4/#resources">参考资料</A>
中的一些 DOM 相关链接)。</P>
<P>但更重要的是,DOM 定义了对象的类型和属性,从而允许浏览器表示标记。(本系列下一篇文章将专门讲述在 JavaScript 和
Ajax 代码中使用 DOM 的规范。)</P>
<P><A name=N10358><SPAN class=smalltitle>文档对象</SPAN></A></P>
<P>首先,需要访问对象模型本身。这非常容易;要在运行于 Web 页面上的任何 JavaScript 代码中使用内置
<CODE>document</CODE> 变量,可以编写如下代码:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>var domTree = document;
</PRE></TD></TR></TBODY></TABLE><BR>
<P>当然,该代码本身没什么用,但它演示了每个 Web 浏览器使得 <CODE>document</CODE> 对象可用于
JavaScript 代码,并演示了对象表示标记的完整树(<A
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro4/#fig1">图
1</A>)。</P>
<P><A name=N10375><SPAN class=smalltitle>每项都是一个节点</SPAN></A></P>
<P>显然,<CODE>document</CODE>
对象很重要,但这只是开始。在进一步深入之前,需要学习另一个术语:<I>节点</I>。您已经知道标记的每个部分都由一个对象表示,但它不只是一个任意的对象,它是特定类型的对象,一个
DOM 节点。更特定的类型,比如文本、元素和属性,都继承自这个基本的节点类型。所以可以有文本节点、元素节点和属性节点。</P>
<P>如果已经有很多 JavaScript 编程经验,那您可能已经在使用 DOM 代码了。如果到目前为止您一直在跟踪本 Ajax
系列,那么现在您<I>一定</I> 使用 DOM 代码有一段时间了。例如,代码行 <CODE>var number =
document.getElementById("phone").value;</CODE> 使用 DOM
查找特定元素,然后检索该元素的值(在本例中是一个表单字段)。所以即使您没有意识到这一点,但您每次将
<CODE>document</CODE> 键入 JavaScript 代码时都会使用 DOM。</P>
<P>详细解释已经学过的术语,DOM 树是对象的树,但更具体地说,它是<I>节点</I> 对象的树。在 Ajax 应用程序中或任何其他
JavaScript
中,可以使用这些节点产生下列效果,比如移除元素及其内容,突出显示特定文本,或添加新图像元素。因为都发生在客户端(运行在 Web
浏览器中的代码),所以这些效果立即发生,而不与服务器通信。最终结果通常是应用程序感觉起来响应更快,因为当请求转向服务器时以及解释响应时,Web
页面上的内容更改不会出现长时间的停顿。</P>
<P>在多数编程语言中,需要学习每种节点类型的实际对象名称,学习可用的属性,并弄清楚类型和强制转换;但在 JavaScript
中这都不是必需的。您可以只创建一个变量,并为它分配您希望的对象(正如您已经看到的):</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=code-outline><PRE class=displaycode>var domTree = document;
var phoneNumberElement = document.getElementById("phone");
var phoneNumber = phoneNumberElement.value;
</PRE></TD></TR></TBODY></TABLE><BR>
<P>没有类型,JavaScript 根据需要创建变量并为其分配正确的类型。结果,从 JavaScript 中使用 DOM
变得微不足道(将来有一篇文章会专门讲述与 XML 相关的 DOM,那时将更加巧妙)。</P>
<P><A name=N103A4><SPAN class=atitle>结束语</SPAN></A></P>
<P>在这里,我要给您留一点悬念。显然,这并非是对 DOM 完全详尽的说明;事实上,本文不过是 DOM 的简介。DOM
的内容要远远多于我今天介绍的这些!</P>
<P>本系列的下一篇文章将扩展这些观点,并深入探讨如何在 JavaScript 中使用 DOM 来更新 Web 页面、快速更改 HTML
并为您的用户创建更交互的体验。在后面专门讲述在 Ajax 请求中使用 XML 的文章中,我将再次返回来讨论 DOM。所以要熟悉
DOM,它是 Ajax 应用程序的一个主要部分。</P>
<P>此时,深入了解 DOM 将十分简单,比如详细设计如何在 DOM
树中移动、获得元素和文本的值、遍历节点列表,等等,但这可能会让您有这种印象,即 DOM 是关于代码的,而事实上并非如此。</P>
<P>在阅读下一篇文章之前,试着思考一下树结构并用一些您自己的 HTML 实践一下,以查看 Web 浏览器是如何将 HTML
转换为标记的树视图的。此外,思考一下 DOM 树的组织,并用本文介绍的特殊情况实践一下:属性、有元素混合在其中的文本、<I>没有</I>
文本内容的元素(比如 <CODE>img</CODE> 元素)。</P>
<P>如果扎实掌握了这些概念,然后学习了 JavaScript 和 DOM 的语法(下一篇文章),则会使得响应更为容易。</P>
<P>而且不要忘了,这里有清单 <A
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro4/#listing2">2</A>
和 <A
href="http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro4/#listing3">3</A>
的答案,其中还包含了示例代码!</P><BR><BR><A name=fig2><B>图 2. 清单 2
的答案</B></A><BR><IMG height=400 alt="清单 2 的答案"
src="掌握 Ajax,第 4 部分 利用 DOM 进行 Web 响应.files/tricky-solution.gif"
width=407> <BR><BR><BR><A name=fig3><B>图 3. 清单 3 的答案</B></A><BR><IMG
height=316 alt="清单 3 的答案"
src="掌握 Ajax,第 4 部分 利用 DOM 进行 Web
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -