JavaScript DOM 编程艺术(第2版)读书笔记 (9)
三位一体的网页
结构层:由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)的更多相关文章
- Javascript DOM 编程艺术(第二版)读书笔记——基本语法
Javascript DOM 编程艺术(第二版),英Jeremy Keith.加Jeffrey Sambells著,杨涛.王建桥等译,人民邮电出版社. 学到这的时候,我发现一个问题:学习过程中,相当一 ...
- 读书笔记:JavaScript DOM 编程艺术(第二版)
读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...
- 《JavaScript DOM编程艺术(第二版)》读书总结
这本书是一本很基础的书,但对于刚入前端不久的我来说是一本不错的书,收获还是很大的,对一些基础的东西理解得更加透彻了. 1.DOM即document object model的缩写,文档对象模型,Jav ...
- 【读书笔记】读《JavaScript DOM 编程艺术-第2版》
1.DHTML DHTML曾被认为是HTML/XHTML.CSS和JavaScript相结合的产物,就像今天的HTML5那样,但把这些东西真正凝聚在一起的是DOM.如果真的需要来描述这一过程的话,“D ...
- Javascript DOM 编程艺术(第二版)读书笔记——DOM基础
1.DOM是什么 D=document(文档) O=object(对象) M=Model(模型) DOM又称节点树 一些术语: parent(父) child(子) sibling(兄弟) ...
- JavaScript -- JavaScript DOM 编程艺术(第2版)
/* 渐进增强 平稳退化 网页 结构层(structural layer): HTML 表示层(presentation layer): CSS <link rel="styleshe ...
- 《JavaScript DOM 编程艺术 第 2 版》
第 5 章 最佳实践 平稳退化:现在基本所有带交互的网站都使用 Ajax,SAP 也火起来了,平稳退化真是很难实现了(看到第七章发现我之前的观点是错了) 分离 JS 向下兼容 性能考虑 第 6 章 案 ...
- JavaScript DOM编程艺术读后感(1)—— 平稳退化
最近,在读<JavaScript DOM编程艺术(第二版)>这本书,想着将自己的读后感记录下来,作为记忆吧. 其实我并不是最近才刚开始读这本书的,我读了有一段时间了.我是一名web前端开发 ...
- JavaScript DOM编程艺术(第2版)的简单总结
介绍 JavaScript DOM编程艺术(第2版)主要讲述了 JavaScript.DOM 和 HTML5 的基础知识,着重讲述了 DOM 编程,并通过几个实例演示了具有专业水准的网页开发. 下面介 ...
- 《JavaScript Dom 编程艺术》读书笔记-第4章
我的前端入门第一本书是<JavaScript Dom 编程艺术>,网上查找资料发现前端的入门推荐书籍最受好评的就是这本和<JavaScript 高级程序设计>了.之所以先选这本 ...
随机推荐
- mysql双主复制总结
双主复制: 1).在两台服务器上各自建立一个具有复制权限的用户: 2).修改配置文件: # 主服务器A上 [mysqld] server-id = 10 log-bin = mysql-bin rel ...
- 诅咒JavaScript之:Jquery ajax提交内容异常
jquery ajax 通过url提交内容,在服务器端获取却出现很奇怪的值,代码如下: ajaxurl = "aspx/logTable.ashx?action=load&Every ...
- android基础知识之一
1:Android系统架构(重点) 分层的架构 JNI java native interface 1.application :应用层 : java 2.application framework ...
- Oracle手工建库
环境准备 手工建库的前提是ORACLE软件已经正确安装到操作系统中,只是需要我们利用ORACLE软件提供的一些工具和脚本来创建一个数据库,创建这个数据库可以运行DBCA工具图形化创建,也可以使用CRE ...
- asl 和 lgpl的区别
按照使用条件的不同,开源软件许可证可以分为三类(严苛程度递减) 1. 使用该开源软件的代码再散布(redistribute)时,源码也必须以相同许可证公开. 代表许可类型:GPL, AGPL 2. 使 ...
- java中的反射
1.何为java反射机制: 在运行过程中,对于任意一个类都能够知道这个类的属性和方法:对于任意一个对象都能调用其属性和方法:这种动态获取信息和动态调用方法 就称为java反射 2.获取Class对象的 ...
- java之数组(笔记)
1.与c++不同的声明 int[] i, j; int i[], j; 这两种声明在c++中是同等的,但是在Java中,前者是声明两个,后者是只有i是数组. 2.数组可以看作是特殊的类 3.数组的cl ...
- Android课程---表格布局TableLayout
特别注意:由于表格布局继承自线性布局,因此并不显示表格线 示例代码: <?xml version="1.0" encoding="utf-8"?> ...
- Node.js学习记录
一.NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用 ...
- dubbo 试用全过程
概述: dubbo服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加载服务提供方,增加复杂性,也浪费资源. 服务容器只 ...