JavaScript 进阶:CSS 与 XML 基础应用指南

作者:流萤时间:2026-10-26 17:41:10浏览:97

本文详解 CSS 级联样式表的基本语法、选择器优先级及动态修改方法,并深入讲解 XML 数据格式规范。重点对比 Internet Explorer 与 Firefox 浏览器在解析 XML 时的差异,演示如何利用 ActiveXObject 和 XPathEvaluator 实现跨浏览器的数据读取与节点定位。

CSS 基础与优先级

CSS 全称为 Cascading Style Sheets,中文译作级联样式表或层叠样式表。其核心优势在于能够使代码结构更加清晰整洁,并支持对页面样式进行批量统一处理。


CSS 的基本语法规范如下:


注释符号采用 /* */ 形式。


选择符语法结构为 selector {attribute:value}。同一属性内的多个值以空格分隔,不同属性之间则以分号分隔。需注意 CSS 语法严格区分大小写。


例如,若需为页面中的 table 元素定制特定样式,代码应写为 table {.....;.....;}。


选择符的使用方式多样,此处列举部分常见用法,具体细节将在后续章节详细解释。


选择符模式 说明
* 匹配任意元素。(通用选择器)
E 匹配任意元素 E (例如一个类型为 E 的元素)。(类型选择器)
E F 匹配元素 E 的任意后代元素 F 。(后代选择器)
E > F 匹配元素 E 的任意子元素 F 。(子选择器) 
E:first-child 当元素 E 是它的父元素中的第一个子元素时,匹配元素 E 。(:first-child 伪类)
E:link E:visited 如果 E 是一个目标还没有访问过(:link)或者已经访问过(:visited)的超链接的源锚点时匹配元素 E 。(link 伪类)
E:active E:hover E:focus 在确定的用户动作中匹配 E 。(动态伪类)
E:lang(c) 如果类型为 E 的元素使用了(人类)语言 c (文档语言确定语言是如何被确定的),则匹配该元素。(:lang() 伪类)
E + F 如果一个元素 E 直接在元素 F 之前,则匹配元素 F 。(临近选择器)
E[attr]  匹配具有”attr”属性集(不考虑它的值)的任意元素 E 。(属性选择器)
E[attr="warning"]  匹配其“attr”属性值严格等于“warning”的任意元素 E 。(属性选择器)
E[attr~="warning"] 匹配其“attr”属性值为空格分隔的值列表,并且其中一个严格等于“warning”的任意元素 E 。(属性选择器)
E[lang|="en"] 匹配其“lang”属性具有以“en”开头(从左边)的值的列表的任意元素 E 。(属性选择器)
DIV.warning 仅 HTML。用法同 DIV[class~="warning"]。(类选择器)
E#myid 匹配 ID 等于“myid”的任意元素 E 。(ID 选择器)

实际应用中再对选择符进行详细解析。


在同一个页面或 CSS 文件中,若对同一元素存在多重样式定义,浏览器需依据优先级规则进行渲染。优先级主要划分为外部定义样式优先级与其他样式优先级两类。


关于外部定义样式的优先级算法此处省略,直接给出结果:ID 选择符 > 类选择符 > 属性选择符 > 伪类选择符 > 元素选择符 > 伪元素选择符 > 全局选择符 > 其他。


其他样式的优先级排序中,文内样式(即元素内部的 style=...)具有最高优先级,高于所有外部定义样式。关于 !important 在不同浏览器版本中的用法存在差异,此处不作深入展开,建议查阅相关文档。通过继承获得的样式优先级最低。


CSS 属性参考链接:https://www.jb51.net/w3school/css/css_reference.htm


CSS 单位参考链接:https://www.jb51.net/w3school/css/css_units.htm


忽略上述链接。


接下来进入 CSS 实际应用环节。


CSS 样式嵌入与动态修改

1. 在当前页面内嵌入 CSS 样式:


具体代码如下:

 
<html>
<head>
<title>css test</title>
<style>
.tableStyle{
background:yellow;
font-size:14px;
font-weight:bold;
} 
</style>
</head>
<body>
<table width="400" align="center" class="tableStyle">
<tr>
<td>title:</td>
<td><input type="text" name="title" size="50"></td>
</tr>
<tr>
<td>content:</td>
<td><textarea name="content" class="userData" cols="45" rows="10"></textarea></td>
</tr>
</table>
</body>

2. 嵌入外部 CSS 样式文件:


在工程目录下新建 css 文件夹,并创建名为 style.css 的文件。此举旨在保持代码整洁,示例中仅包含前述案例的样式内容。


CSS 基础与优先级

CSS 文件代码如下:

 
.tableStyle{
background:yellow;
font-size:14px;
font-weight:bold;
border:1px solid #000000

引用外部样式文件十分简便,只需在 HTML 中添加一行代码:


<link rel="stylesheet" type="text/css" href="css/style.css" />


其中 rel 属性指定引入的是 CSS 样式表文件,type 属性指定文件类型,href 属性指定文件的物理路径。


3. 动态修改 CSS 样式。


此时开始涉及 JavaScript 与 CSS 的结合。


修改样式的方法主要是获取元素并修改其属性。值得注意的是,link 标签的属性同样可以被修改。


例如,为 link 标签设置 id 为 myStyle,然后修改其导入的文件路径,具体方法如下:


代码如下:

 
<link rel="stylesheet" id="myStyle" type="text/css" href="css/style.css">
<script type="text/javascript">
//在javascript中修改时:
var styleObj=document.getElementById("myStyle");
styleObj.styleSheet.cssText="";//清除原有样式
styleObj.styleSheet.addImport("css/style2");
</script>

XML 规范与 XPath 应用

接下来开始介绍 XML 部分。


忽略无关内容。


若需深入学习 XML 可单独开设系列课程,此处仅作简要概述。


XML 全称为 Extensible Markup Language,其存在旨在更灵活、广泛地描述数据。XML 的标签几乎全部由用户自定义。


例如存储书籍信息时,可采用不同的存储方式:


代码如下:

 
<book>
<name>.....</name>
<author>....</author>
<publisher>...</publisher>
</book>
<!-- or -->
<book>
<property name="name" value="....."/>
<property name="author" value="..."/>
<property name="publisher" value="...."/>.
</book>

XML 还有几项严格规定:


必须包含声明语句 <?xml cersion="1.0"?>,其中可包含 encoding 等其他属性。


所有非根元素必须封闭,即必须包含 />。


属性值必须包含在引号内。


XML 区分大小写。


标记名称必须以字母、“_”或“:”开头,后续可跟随字母、数字、句点、冒号或下划线。


XML 文档只能有一个根节点。


XPath。


XPath 是一种用于在 XML 文件中查找并定位信息的语言,它可以遍历文档树中的元素和属性。


关于 XPath 的语法,此处仅做简要介绍。


XPath 语法详情见:https://www.jb51.net/w3school/xpath/xpath_syntax.htm


请大致浏览上述网页的“XPath 语法”、“XPath 轴”、“XPath 运算符”以及参考手册下的“XPath 函数”。


浏览完毕后,即可开始相关练习:


首先提供一个 XML 文件示例:


代码如下:

 
<!-- Copyright w3school.com.cn -->
<!-- W3School.com.cn bookstore example -->
<bookstore>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
</bookstore>

(内容源自网站,复制时请保留版权信息。)


跨浏览器 XML 数据读取实战

在 IE 和 Firefox 浏览器中的使用方法存在差异,这点较为繁琐。先介绍 IE 浏览器的实现方式:这段代码再次强调,script 标签应写在 table 之后,否则在编译 JavaScript 时,由于 table 尚未渲染,浏览器无法确定 innerText 的加载位置。完整代码如下供参考:


XML in IE


代码如下:

 
<html>
<head>
<title>xml test</title>
</head>
<body>
<table width="400" border="1px" align="center">
<tr>
<td width="30%">book name:</td>
<td><span id="bname"></span></td>
</tr>
<tr>
<td>book author:</td>
<td ><span id="bauthor"><span></td>
</tr>
</table>
<script type="text/javascript">
<!-- 
var xmldoc=new ActiveXObject("MSXML2.DOMDocument.3.0");
xmldoc.load("xml/books.xml");
var name=xmldoc.selectNodes("/bookstore/book/title");
var author=xmldoc.selectNodes("/bookstore/book/author");
var bname=document.getElementById("bname");
var bauthor=document.getElementById("bauthor");
bname.innerText=name[0].text;
bauthor.innerHTML="<p>"+author[0].text+"</p>";
//--> 
</script>
</body>
</html>

接下来介绍 Firefox 浏览器的实现方式:


代码如下:

 
<html>
<head>
<title>xml test</title>
</head>
<body>
<table width="400" border="1px" align="center">
<tr>
<td width="30%">book name:</td>
<td><span id="bname"></span></td>
</tr>
<tr>
<td>book author:</td>
<td ><span id="bauthor"><span></td>
</tr>
</table>
<script type="text/javascript">
<!-- 
var xmldoc=document.implementation.createDocument("","",null);
xmldoc.load("xml/books.xml")
//xmlDoc.evaluate(xpath, xmlDoc, namespace, XPathResult.ANY_TYPE,XPahrResult);
var evaluatorObj=new XPathEvaluator();
function getBookChild(path){
return evaluatorObj.evaluate(path,xmldoc.documentElement,null,
XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
} 
var namelist=getBookChild("/bookstore/book/title");
var name=namelist.iterateNext();
var authorlist=getBookChild("/bookstore/book/author");
var author=authorlist.iterateNext();
var bname=document.getElementById("bname");
var bauthor=document.getElementById("bauthor");
bname.innerHTML=name.childNodes[0].nodeValue;
bauthor.innerHTML=author.childNodes[0].nodeValue
//--> 
</script>
</body>
</html>

Firefox 浏览器下读取 XML 资源的网络资料较少,经多次尝试未果后,通过调试发现 author.childNodes[0].nodeValue 这一句可获取节点值。


在 Firefox 浏览器中读取 XML 文件主要涉及两个类:XPathEvaluator 和 XPathResult。即使用 XPathEvaluator 进行查找,并在 XPathResult 中存储结果。代码中使用了 XPathEvaluator 查找部分,该 evaluate 函数参数众多,必须了解其用法,此处摘录他人内容(原内容见链接):


函数:evaluate(xpathText,contextNode,namespaceURLMapper,resultType,result)


参数 描述
xpathText 表示要计算的 XPath 表达式的字符串。
contextNode 文档中,对应要计算的表达式的节点。
namespaceURLMapper

把一个命名空间前缀映射为一个全称命名空间 URL 的函数。

如果不需要这样的映射,就为 null。

resultType

指定了期待作为结果的对象的类型,使用 XPath 转换来强制结果类型。

类型的可能的值是 XPathResult 对象所定义的常量。

result

一个复用的 XPathResult 对象;

如果你要创建一个新的 XPathResult 对象,则为 null。

注意,resultType 有多种参数值,继续摘录:


返回类型 说明
ANY_TYPE 把这个值传递给 Document.evaluate() 或 XPathExpression.evaluate() 来指定可接受的结果类型。属性 resultType 并不设置这个值。
NUMBER_TYPE numbervalue 保存结果。
STRING_TYPE stringvalue 保存结果。
BOOLEAN_TYPE booleanValue 保存结果。
UNORDERED_NODE_ITERATOR_TYPE 这个结果是节点的无序集合,可以通过重复调用 iterateNext() 直到返回 null 来依次访问。在此迭代过程中,文档必须不被修改。
ORDERED_NODE_ITERATOR_TYPE 结果是节点的列表,按照文档中的属性排列,可以通过重复调用 iterateNext() 直到返回 null 来依次访问。在此迭代过程中,文档必须不被修改。
UNORDERED_NODE_SNAPSHOT_TYPE 结果是一个随机访问的节点列表。snapshotLength 属性指定了列表的长度,并且 snapshotItem() 方法返回指定下标的节点。节点可能和它们出现在文档中的顺序不一样。既然这种结果是一个“快照”,因此即便文档发生变化,它也有效。
ORDERED_NODE_SNAPSHOT_TYPE 这个结果是一个随机访问的节点列表,就像 UNORDERED_NODE_SNAPSHOT_TYPE,只不过这个列表是按照文档中的顺序排列的。
ANY_UNORDERED_NODE_TYPE singleNodeValue 属性引用和查询匹配的一个节点,如果没有匹配的节点则为 null。如果有多个节点和查询匹配,singleNodeValue 可能是任何一个匹配节点。
FIRST_ORDERED_NODE_TYPE singleNodeValue 保存了文档中的第一个和查询匹配的节点,如果没有匹配的节点,则为 null。

(虽然是摘录,但复制过程也不轻松=w=)



除此之外,XML 文件节点还可以增加条件,例如仅获取第一个符合条件的节点:



/bookstore/book[1]/title


或者价格高于 35 的节点:



/bookstore/book[price>35]/price


之前的例子未使用条件选取,旨在演示返回所有子节点的效果,这通常是常用做法。





此处提及一个概念 XSLT,全称是 Extensible Stylesheet Language Transformations,这是一种用于转换 XML 文件的语言。XSLT 借用 XPath 在 XML 文档中查找信息,可将 XML 文件中的内容按指定样式显示为 HTML 页面。



具体有兴趣的同学可自行查阅,此处不再深入。



XML 数据岛概念

终于,介绍 XML 的最后一个概念:数据岛。



数据岛指页面包含 XML 数据信息,与 CSS 类似,可以内部嵌入,方法为 <xml>......</xml>,也可以外部引入:<xml src="xml/books.xml"></xml>。



XML 数据岛的数据与 HTML 标签的绑定通过 datasrc 和 datafld 完成,但尝试多次后未能找到可运行的代码,故暂时搁置,待代码完善后再行补充。

作者最新文章