三位一体的网页

结构层:由HTML或XHTML之类的标记语言负责创建;

表示层:由CSS负责完成;

行为层:负责内容应该如何响应事件这一问题。这是由JavaScript语言和DOM主宰的领域。

分离

使用(X)HTML去搭建文档的结构;

使用CSS去设置文档的呈现效果;

使用DOM脚本去实现文档的行为;

不过,在这三种技术之间存在着一些潜在的重叠区域:用DOM可以改变网页的结构,诸如createElement和appendChild之类的DOM方法允许你动态地创建和添加标记。

在CSS上也有这种技术相互重叠的例子。诸如:hover和:focus之类的伪类允许你根据用户触发事件改变元素的呈现效果。改变元素的呈现效果当然是表示层的“势力范围”,但响应用户触发事件却是行为层的领地。表示层和行为层的这种重叠形成了一个灰色地带。

CSS正在利用伪类走进DOM的领地,但DOM也有反击之道。你可以利用DOM给元素设定样式。

style属性

element.style.property

我们可以使用style对象的color属性获取某个元素的显示颜色:element.style.color

但是诸如font-family之类的属性的获取方式和color属性略有不同。"font"和"family"之间的连字符与JavaScript语言中的减法操作符相同,JavaScript会把它解释为减号。

当你需要引用一个中间带减号的CSS属性时,DOM要求你用驼峰命名法。CSS属性font-family变为DOM属性fontFamily:element.style.fontFamily。

如果把color属性设置为十六进制值:

<p id="example" style="color:#999999;"></p>

alert(document.getElementById("example").style.color);

在某些浏览器里,color属性以RGB格式的颜色值(153,153,153)返回。

使用CSS速记属性:你可以把多个样式组合在一起写成一行。比如说,如果声明了font:12px 'Arial',sans-serif,CSS font-size属性将被设置为12px;font-family属性将被设置为'Arial',sans-serif。DOM能够解析这样的速记属性。如果查询fontSize属性,将得到一个12px的值。

但是,通过style属性获取样式有很大的局限性。只能获取到内嵌样式。外部样式和在<head>声明的样式都提取不到。并且内嵌样式不是使用样式的好办法——表现信息和结构混杂在一起了。

现在,你或许认为用DOM去处理CSS样式毫无意义,但还有另一种情况可以让DOM style对象能够正确地反射出我们设置的样式。你用DOM设置的样式,就可以用DOM再把它们检索出来。

设置样式

style对象的各个属性都是可读写的。我们不仅可以通过某个元素的style属性去获取样式,还可以通过它去更新样式。你可以用赋值操作来更新样式:

element.style.property = value;

何时该用DOM脚本设置样式

在绝大多数场合,还是应该使用CSS去声明样式。不过在使用CSS不方便的情况下,还是可以利用DOM对文档的样式做一些小的增强。

CSS2引入了很多与位置相关的选择器,例如:first-child和last-child,而CSS3则定义了诸如:nth-child()和:nth-of-type()之类的位置选择器。尽管如此,在文档的节点树中,为特定位置的某个元素应用样式仍旧不是件容易的事。例如,在CSS3中,你可以使用h1~*选择器为所有h1元素的下一个同辈元素声明样式。问题是,有那么多的浏览器根本不支持CSS3的这些可爱的位置选择器。

现在,CSS还无法根据元素之间的相对位置关系找到某个特定的元素,但这对DOM来说却不是什么难题。我们可以利用DOM轻而易举地找出紧跟在每个h1元素后面的那个元素,并把样式添加给它:

var headers = document.getElementsByTagName("h1");

文档中的下一个节点可以用nextSibling属性查找出来:

headers[i].nextSibling

不过这里真正需要的不是“下一个节点”,而是“下一个元素节点”。下面这个getNextElement函数可以轻松完成这一任务:

function getNextElement(node){
if(node.nodeType == 1){
return node;
}
if(node.nextSibling){
return getNextElement(node.nextSibling);
}
return null;
}

var elem = getNextElement(headers[i].nextSibling);

elem.style.fontWeight = "bold";

elem.style.fontSize = "1.2em";

最后把以上代码封装到函数styleHeaderSibling中,别忘了安排一些测试去检查浏览器能否理解我们在这个函数里用到的DOM方法。

根据某种条件反复设置某种样式

让表格里的行更可读的常用技巧是交替改变它们的背景色,从而形成斑马线效果,使相邻的两行泾渭分明。通过分别设置奇数行和偶数行样式的办法可实现这种效果。如果浏览器支持CSS3,那就很简单,只需要如下两行样式:

tr:nth-child(odd){background-color:#ffc;}

tr:nth-child(even){background-color:#fff;}

如果:nth-child()不可用,要获取同样的效果只好采用另外的技术。JavaScript特别擅长处理重复性任务。用一个while或for循环就可以轻松地遍历一个很长的列表。

响应事件

CSS提供的:hover等伪class属性允许我们根据HTML元素的状态来改变样式。DOM也可以通过onmouseover等事件对HTML元素的状态变化做出响应。那么何时用:hover,何时用onmouseover呢?

最简单的答案就是选择最容易实现的办法。例如,如果只是想让链接在鼠标悬停在其上时改变颜色,就应该选用CSS:

a:hover{color:#c60;}

伪类:hover已经得到绝大多数浏览器的支持——至少在它被用来改变链接的样式时是如此。但如果还想利用这个伪类在鼠标指针悬停在其他元素上时改变样式,支持这种用法的浏览器就没有那么多了。

绝大多数的浏览器,虽然对CSS伪类的支持很不完整,但对DOM却都有良好的支持。在浏览器们对CSS的支持进一步完善之前,在事件发生时用DOM改变HTML元素的样式更切合实际。

<!--

作者:纤锐
出处:http://www.cnblogs.com/beginner2014/p/4186736.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。谢谢合作。

-->

JavaScript DOM 编程艺术(第2版)读书笔记 (9)的更多相关文章

  1. Javascript DOM 编程艺术(第二版)读书笔记——基本语法

    Javascript DOM 编程艺术(第二版),英Jeremy Keith.加Jeffrey Sambells著,杨涛.王建桥等译,人民邮电出版社. 学到这的时候,我发现一个问题:学习过程中,相当一 ...

  2. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  3. 《JavaScript DOM编程艺术(第二版)》读书总结

    这本书是一本很基础的书,但对于刚入前端不久的我来说是一本不错的书,收获还是很大的,对一些基础的东西理解得更加透彻了. 1.DOM即document object model的缩写,文档对象模型,Jav ...

  4. 【读书笔记】读《JavaScript DOM 编程艺术-第2版》

    1.DHTML DHTML曾被认为是HTML/XHTML.CSS和JavaScript相结合的产物,就像今天的HTML5那样,但把这些东西真正凝聚在一起的是DOM.如果真的需要来描述这一过程的话,“D ...

  5. Javascript DOM 编程艺术(第二版)读书笔记——DOM基础

    1.DOM是什么 D=document(文档) O=object(对象) M=Model(模型) DOM又称节点树 一些术语: parent(父)   child(子)   sibling(兄弟)   ...

  6. JavaScript -- JavaScript DOM 编程艺术(第2版)

    /* 渐进增强 平稳退化 网页 结构层(structural layer): HTML 表示层(presentation layer): CSS <link rel="styleshe ...

  7. 《JavaScript DOM 编程艺术 第 2 版》

    第 5 章 最佳实践 平稳退化:现在基本所有带交互的网站都使用 Ajax,SAP 也火起来了,平稳退化真是很难实现了(看到第七章发现我之前的观点是错了) 分离 JS 向下兼容 性能考虑 第 6 章 案 ...

  8. JavaScript DOM编程艺术读后感(1)—— 平稳退化

    最近,在读<JavaScript DOM编程艺术(第二版)>这本书,想着将自己的读后感记录下来,作为记忆吧. 其实我并不是最近才刚开始读这本书的,我读了有一段时间了.我是一名web前端开发 ...

  9. JavaScript DOM编程艺术(第2版)的简单总结

    介绍 JavaScript DOM编程艺术(第2版)主要讲述了 JavaScript.DOM 和 HTML5 的基础知识,着重讲述了 DOM 编程,并通过几个实例演示了具有专业水准的网页开发. 下面介 ...

  10. 《JavaScript Dom 编程艺术》读书笔记-第4章

    我的前端入门第一本书是<JavaScript Dom 编程艺术>,网上查找资料发现前端的入门推荐书籍最受好评的就是这本和<JavaScript 高级程序设计>了.之所以先选这本 ...

随机推荐

  1. 打造移动终端的 WebApp(一):搭建一个舞台

    最近随着 Apple iOS 和 Android 平台的盛行,一个新的名词 WebApp 也逐渐火了起来,这里我也趁着热潮做一个关于 WebApp 系列的学习笔记,分享平时的一些研究以及项目中的经验, ...

  2. 使用Fiddler的X5S插件查找XSS漏洞

    OWASP top 10的安全威胁中的CrossSite Scripting(跨站脚本攻击),允许攻击者通过浏览器往网站注入恶意脚本.这种漏洞经常出现在web应用中需要用户输入的地方,如果网站有XSS ...

  3. 设置Oracle时间格式

    ORACLE的DATE类型的显示方式取决于NLS_DATE_FORMAT初始化参数NLS_DATE_FORMAT参数可以在以下几个级别设置1.数据库级别——如果希望所有人都看到某种格式的数据,则在SQ ...

  4. C++以对象管理资源

    先看下面一段代码: class Node {}; Node* CreateNode() { } void Solve() { Node *p=CreateNode(); //调用CreateNode函 ...

  5. 【iCore3 双核心板】例程十九:USBD_MSC实验——虚拟U盘

    实验指导书及代码包下载: http://pan.baidu.com/s/1i4eNbQd iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  6. RDS MySQL 连接数满情况的处理

    RDS MySQL 连接数满情况的处理 RDS MySQL 连接数满有2种情况 1. 空闲连接过多 原因: 应用使用长连接模式 - 对于长连接模式(比如Java应用),应用侧应该配置连接池.连接池的初 ...

  7. loadrunner11.0 安装破解详解使用教程

    loadrunner11.0 安装破解详解使用教程 来源:互联网 作者:佚名 时间:01-21 10:25:34 [大 中 小] 很多朋友下载了loadrunner11但不是很会使用,这里简单介绍下安 ...

  8. find命令查找文件,并排除相应路径

    find / -path "/exclude/" -prune -o -name "lsof" -print 查找根目录下文件,并排除/exclude路径

  9. CentOS7配置日志(VirtualBox)

    版本为CentOS-Minimal 1.VirtualBox下安装CentOS. 新建虚拟机 下载CentOS,放入盘片,启动虚拟机,按提示开始安装(建议内存1G,硬盘10G以上)   2. 设置网络 ...

  10. Count Complete Tree Nodes || LeetCode1

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * s ...