[转]《精通Javascript》笔记:第五章(DOM)

时间:2021-11-20 20:36:55

《精通Javascript》笔记:第五章(DOM)

Published by sansan at 3:06 pm under 前端|Front-End

  1. DOM是一个表达XML文档的标准(由W3C制定的)。它未必是最快的方式,也未必是最轻量级的或者最容易使用的,但确实应用最广泛的。
  2. 访问根元素<html>:document.documentElement
  3. 处理DOM中的空格:终于知道前几天看的as程序中为啥要清空格了。
    Firefox下任何空格、换行、tab都会被认为是一个childnode,而IE下只有内联元素(如em,span)后的换行、空格、tab会被认为是一个childnode。
  4. function cleanWhiteSpace(elem) {
    	elem = elem || document;
    	var cur = elem.firstChild;
    	while (!cur) {
    		if (cur.noteType == 3 && !/\S/.test(cur.nodeValue)) {
    			elem.removeChild(cur);
    		} else if (cur.nodeType == 1) {
    			cleanWhiteSpace(cur);
    		}
    		cur = cur.nextSibling;
    	}
    }
  5. 元素:1,document.ELEMENT_NODE
    文本:3,document.TEXT_NODE
    文档:9,document.DOCUMENT_NODE
    常量只对非IE浏览器有效
  6. Firefox、Safari、Opera中存在一个强大的对象原型(Object Prototype)叫HTMLElement。幸运的是,jason Karl Davis为两个不支持的浏览器写了一个支持访问HTMLElement的库
  7. 通过getElementsByTagName返回的nodeList数组,不支持pop(), push(), shift()等数组的常用方法。
  8. 浏览器的渲染和操作顺序大致如下:
    1) HTML解析完毕
    2) 外部脚本和样式表加载完毕
    3) 脚本在文档内解析并执行
    4) HTML DOM完全构造起来
    5) 图片和外部内容加载
    6) 网页完成加载
  9. function domReady(f) {
    	if (domReady.done) return f();
    	if (domReady.timer) {
    		domReady.ready.push(f);
    	} else {
    		addEvent(window, ‘load’, isDOMReady);
    		domReady.ready = [f];
    		domReady.timer = setInterval(isDOMReady, 13);
    	}
    }
    function isDOMReady() {
    	if (domReady.done) return false;
    	if (document && document.getElementsByTagName && document.getElementById && document.body) {
    		clearInterval(domReady.timer);
    		domReady.timer = null;
    		for (var i=0; i<domReady.ready.length; i++) {
    			domReady.ready[i]();
    		}
    		domReady.ready = null;
    		domReady.done = true;
    	}
    }
  10. Selector:CSS1 CSS2 CSS3 cssQuery XPath 1.0 XPath 2.0
  11. 获取元素内文本内容的一个窍门是,需要记住元素并不是直接包含文本的,而是包含在一个子文本节点中。
  12. elem.innerText; // 非Mozilla浏览器
    elem.firstChild.nodeValue; // 其他浏览器
    
    // 一个获取元素文本内容的通用函数
    function text(e) {
    	var t = ”;
    	e = e.childNodes || e;
    	for (var i=0; i<e.length; i++) {
    		t += e[i].nodeType != 1 ? e[i].nodeValue : text(e[i].childNodes);
    	}
    	return t;
    }
  13. 存取属性:className, htmlFor, cssFloat, cssText
  14. 可以设置和获取非传统的属性,就是自创的属性。(比如菜单展开的时候,设置open=true)
  15. 记住insertBefore(insert, before)的参数顺序:看函数名,insert第一个,before第二个。
  16. 根据http://quirksmode.org的说法,用innerHTML注入html比DOM方法快很多。
  17. 转化一个DOM节点/HTML字符串混合型参数数组为纯粹的DOM节点数组
  18. function checkElem(a) {
    	var r = [];
    	if (a.constructor != Array) a = [a];
    
    	for (var i=0; i<a.length; i++) {
    		if (a[i].constructor == String) {
    			var div = document.createElement(’div’);
    			div.innerHTML = a[i];
    			for (var j=0; j<div.childNodes.length; j++) {
    				r[r.length] = div.childNodes[j];
    			}
    		} else if (a[i].length) {
    			for (var j=0; j<a[i].length; j++) {
    				r[r.length] = a[i][j];
    			}
    		} else {
    			r[r.length] = a[i];
    		}
    	}
    	return r;
    }