Ajax这个知识点还理解不透,暂时放下,等全本书过完之后,再来细究。时间稍微有点紧,进度没有预想中的那么快,毕竟上班期间总会有各种事情来打断,这是无法避免的。虽然要求慢一步、深一度!但是进度总体还是得跟上的。切记不要钻牛角尖!
Chapter8 充实文档的内容
不要滥用DOM。
- 渐进增强(progressive enhancement)基于这种思想:总是从最核心的内容开始。根据内容使用标记实现良好的结构;然后再逐步加强这些内容。这些增强工作既可以是通过CSS改进呈现效果,也可以是通过DOM添加各种行为。如果使用DOM添加核心内容,那就太迟了,内容应该在刚开始编写文档时就要成为文档的组成部分。
平稳退化。渐进增强的实现,必然支持平稳退化。即便缺乏必要的CSS和DOM支持,访问者仍然可以访问到核心内容。如果使用JS来添加核心内容,那就肯定是不支持平稳退化的。
for (variable in array)
可以利用一个for/in循环把某个数组的键临时赋值给一个变量。- 如果没有百分百的把握,就一定要去检查nodeType属性值。很多DOM方法只能用于元素节点,如果用到文本节点就会出错。
- 如果把通配符”*”作为参数传递给getElementsByTagName方法,它就会把所有的元素,不管是标签名是什么,一一返回给我们。
- 本节涉及到的函数的过程相似:从创建一个特定元素构成的节点集合开始,用一个循环遍历这个节点集合并在每次循环里创建出一些标记,最后把新创建的标记插入到文档里。
文档检索,使用下列方法
- getElementById
- getElementsByTagName
- getAttribute
添加信息到文档中去,使用下列方法
- createElement
- createTextNode
- appendChild
- insertBefore
- setAttribute
update 2015-12-21
Chapter9 CSS-DOM
利用DOM技术去获取和设置CSS信息
我们看到的网页其实是由结构层(HTML/XHTML)、表现层(CSS)、行为层(JS&DOM)这三层信息组成的。
CSS可以通过:hover和:focus之类的伪类根据用户触发事件改变元素的呈现效果。DOM也可以修改Style属性修改样式设定。
告诉我们元素在节点树上的位置信息:parentNode、nextSibling、previousSibling、childNodes、firstChild和lastChild等属性告诉了我们文档中个节点之间的关系信息。
获取style属性
element.style.property
element.style.color
- 减号和加号之类的操作符是保留字符,不允许用在函数货变量的名字里。
- 需要引用一个中间带减号的CSS属性时,DOM要求你用驼峰命名法。font-family ->
element.style.fontFamily
内嵌样式
- 通过style属性获取样式有很大的局限性——style属性只能返回内嵌样式。表现信息与结构混杂在一起。
- DOM style属性不能用来检索在外部CSS文件里声明的样式。即外部样式表里声明的样式不会进入style对象。
设置样式
- 使用赋值操作更新样式:
element.sytle.property = value
- style对象的属性值必须放在引号里,单引号或双引号均可。如果忘记引号,JS会把等号右边的值解释为一个变量。
- 不应利用DOM为文档设置重要的样式。不过在使用CSS不方便的场合,还是可以利用DOM对文档的样式做一些小的增强。
- 采用纯粹的CSS还是利用DOM来设置样式,需要考虑下面两点:
- 这个问题最简单的解决方案是什么;
- 那种解决方案会得到跟股东浏览器的支持。
- 想要改变某个元素的呈现效果,使用CSS;想要改变某个元素的行为,使用DOM;如果想要根据某个元素的行为去改变它的呈现效果,需要具体情况作判断,自己做取舍,没有标准答案。
利用className设置class属性
- 有个简单的法子:与其使用DOM直接改变某个元素的样式,不如通过JS更新这个元素的class属性。在引用的外部样式表中添加对应class的属性。
1 | .info { |
elem.setAttribute("class","intro")
className属性是一个可读/可写的属性,凡是元素节点都有这个属性。
用className属性和操作符设置一个元素的class属性:element.className = value
。
叠加两种样式:
elem.className += " intro";
需要给一个元素追加新的class时:
- 检查className属性的值是否为null
- 如果是,把新的class设置值直接赋值给className属性;
- 如果不是,把一个空格和新的class设置值追加到className属性上。
据此封装成一个函数addClass。1
2
3
4
5
6
7
8
9
10function addClass(elem,value) {
if (!elem.className) {
elem.className = value;
} else {
newClassName = elem.className;
newClassName+= " ";
newClassName+= value;
elem.className = newClassName;
}
}
函数抽象
- 对函数进行抽象(abstraction):把具体的值转化为函数的参数,就可以让它成为一个更加通用的函数。
- 无论何时发现可疑对某个函数进行抽象,都应该马上去做!