js 中dom的操作
创建节点
1.document.createElement();创建节点元素
document.createTextNode('文本'); 创建文本,用这个api还不是直接innerText
document.createDocumentFragment();无参数,添加多个元素时,先添加到这个中,再同一添加到页面,减少渲染,提高效率
2.通过innerHTML,innerText,outerHTML来高效创建
注意:innerText不支持火狐,火狐中可通过textContent来创建或获取
获取兼容写法: function getInnerText(el) {
return typeof el.textContent == 'string' ? el.textContent : el.innerText;
}
设置兼容写法: function setInnerText(el,text) {
if(typeof el.textContent == 'string') { el.textContent = text;} else { el.innerText = text;}
}
innerHTML注意点: 字符串最左边如果有空不,ie6~ie8会自动移出它,
创建script标签,需要: "<input type=\'hidden\'><script>......<\ /script>"
创建style.meta.link等标签,需要: "_<style type = \'text/css\'>....</style>",插入元素后,要删除掉_;
查找节点
方法一:缺点(空白节点也算节点)
通过父节点找子节点: firstChild 第一个子节点
childNodes[n] 或者 childNodes.item(n) 第n个子节点,两种方法
lastChild 最后一个子节点
通过子节点找父节点:parentNode
通过兄弟节点找兄弟: nextSibling后一个兄弟 previousSibling前一个兄弟
判断元素是否有节点 hasChildNodes() 返回true/false
方法二:空白节点不算节点
注意ie8及ie8以前才没有空白节点,现代浏览器都有空白节点,解决方法如下:不过下面方法对ie8一下不支持
利用nodeType = 1 ----->是元素来判断
通过父节点找子节点: firstElementChild 第一个子节点 children[n] 第n个子节点 lastElementChild 最后一个子节点
通过子节点找父节点:parentNode
通过兄弟节点找兄弟: nextElementSibling后一个兄弟 previousElementSibling前一个兄弟
节点个数: childElementCount 不在加length;
调用节点
document.getElementById(); 只能用document,在ie7中会获取到和id属性值一样的name属性值
解决方法:
document.getElementsByName(); 只能用document,获取name的dom元素,是一个类数组,在ie6和opeara7.5有bug;
document.getElementsByTagName(); 获取标签元素,参数为!可获取注释,参数为*可获取所有元素;
document.getElementsByClassName(); ie8及一下不支持
document.querySelector('css选择器'):获取选择器的第一个元素
document.querySelectorAll('css选择器'):获取选择器的所有元素
操作节点
1.添加节点:
a.appendChild(b) ; b节点插入a元素内部末尾
a.insertBefore(b,对象) b节点插入a节点内部中某对象位置的前一个,如果第二参数为null,则是插入a节点内部的最后一个
2.替换节点
a.replaceChild(要插入的节点,要替换的节点) a节点内部中替换节点
3.复制节点
a.cloneNode(true/false) 拷贝节点,并返回副本,通过上面几种方法,才能插入文本中,默认参数为false,仅赋值节点本身,为true时,赋值节点及子节点
4.删除节点
a.removeChild(b) 删除a中的b节点
扩展:
removeChild与innerHTML:
createElment创建的节点再用removeChild删除,在ie678中会留下碎片,方便下次获取,但长久下去会增加负担,所以用innerHTML='',不会留下碎片,其他浏览器没区别;
a.removeNode(true/false) IE私有,默认false,只删除本身,为true,删除本身和子元素;