HTML

- innerHTML:内部HTML,content<br/>;
- outerHTML:外部HTML,<div>content<br/></div>;
- innerText:不会返回隐藏元素的文本,受 CSS 样式的影响,它会触发重排(reflow);IE11及以下,不仅会移除当前元素的子节点,而且还会永久性地破坏所有后代文本节点
- textContent,会获取所有元素的内容,包括 css内容;对比innerText,不会引起重排;兼容性: IE9开始支持
- outerText:outerText 赋值时会把整个标签一起赋值掉;非标准属性,不要在生产环境中使用!

jQueryhtml()会调用innerHTML()来操作,但同时也会 catch 异常,然后用.empty(),.append()来重新操作.这是因为IE8中有些元素的.innerHTML是只读的

Node 节点

Node是一个接口,许多DOM类型从这个接口继承,常用如元素节点,文本节点,属性节点.

每个node对象均有nodeValue,nodeType属性:

  • nodeValue

    • 元素节点值是 undefined 或 null
    • 文本节点值是 文本本身
    • 属性节点值是 属性值,使用 getAttribute()
  • 常用nodeType

    • 1 Element 元素节点
    • 2 Attr 属性节点
    • 3 Text 文本节点
    • 4 CDATASection
    • 9 Document DOM 树的根节点
    • 11 DocumentFragment

可以用在遍历DOM树时使用节点类型过滤

var allChildren = document.getElementById('inhere');
for(var i = 0; i < allChildren.length; i++) {
if(allChildren[i].nodeType == 1 && allChildren[i].hasAttribute('someattr')) {
// …
break;
}
}

NodeList是一个节点的集合,具有以下特征:

  • 实时性

    由 Node.childNodes 和 document.querySelectorAll 返回,大多数情况下是一个实时的集合,当文档节点变化时,NodeList对象也会变化.因此当使用完该对象后,避免保留节点引用是好的编程习惯.在遍历节点集合的时候应避免对DOM进行操作影响遍历过程;需要注意的是例外情况:document.querySelectorAll 返回的是静态集合.

  • 节点集合与数组

    NodeList 继承自 NodeList.prototype,而数组继承自Array.prototype,因此要想使用数组方法有很多方法:

    • 使用原型链把Array.prototype 上的方法添加到 NodeList.prototype, 但是扩展 DOM对象的原型链是很危险
    • 数组原型方法使用 call将 NodeList 作为this参数传递给原生方法,不保证所有浏览器均兼容
    • 将 Nodelist 转化为数组:Array.prototype.slice.call(NodeList),可以简单使用[].slice.call(NodeList) 兼容性:IE9+
  • HTMLCollection

    • 很明显HTMLCollection只是元素节点的集合,不同的是元素节点集合是实时的,而Nodelist不总是实时的
    • Node.childNodes返回的是NodeList,而node.children返回的是HTMLCollection

常用API


节点操作

- element.hasChildNodes 是否拥有子节点

- element.children 返回节点元素集合

- element.childNodes 返回子节点集合

- element.parentNode 返回父节点

- element.cloneNode(deep)克隆节点,包括所有属性及属性值(包括 onclick,但不包括 addEventListener,onclick=fn这种动态绑定)

属性和样式操作

- element.getAttributeNode() 获取指定属性的节点

- element.setAttribute() 为节点设置属性,若属性不存在多数情况下返回null,某些返回空字符串,所以判断是否有指定属性,应使用 hasAttribute

- element.hasAttribute() 判断是否有指定属性

- element.style 获取或者设置样式

- element.className 获取或者设置属性

创建,删除和替换节点

- document.createElement() 创建元素节点

- document.createTextNode() 创建一个文本节点

- document.createDocumentFragment() 创建DocumentFragment节点

- element.appendChild() 向节点子节点列表的末尾添加新的子节点

- element.removeChild() 删除节点;删除自己时,需要用 parentNode.removeChild()

- document.replaceChild() 替换元素节点

- document.replaceData() 替换文本节点() 不如直接操作nodeValue

获取节点

- document.getElementById() 根据id返回一个 Element 对象,没有返回 null

- document.getElementsByClassName

- document.getElementsByTagName(name) 返回一个 HTMLCollection;在 WebKit 内核的浏览器中返回一个 NodeList

- document.getElementsByName(name) name:是元素的 name 属性的值;返回一个 NodeList 集合

- document.querySelector

- 使用深度优先先序遍历文档的节点

- 如果没有找到匹配元素,则返回 null

- 返回第一个匹配的节点

- document.querySellectorAll 返回一个 NodeList,并且是静态集合

高效遍历 DOM

  • 使用nodeType过滤
  • 使用XPath
  • 遍历时尽量不对 DOM 操作
var allPara = document.getElementsByTagName('p');
for(var i = 0; i < allPara.length; i++) {
allPara[i].appendChild(document.createTextNode(i));
}

var allPara = document.getElementsByTagName('p');
var collectTemp = [];
for(var i = 0; i < allPara.length; i++) {
collectTemp[collectTemp.length] = allPara[i];
}
for(i = 0; i < collectTemp.length; i++) {
collectTemp[i].appendChild(document.createTextNode(i));
}
collectTemp = null;

Repaint and reflow

插入大量内容避免重绘和回流

  • createDocumentFragment
var docFragm = document.createDocumentFragment();
var elem, contents;
for(var i = 0; i < textlist.length; i++) {
elem = document.createElement('p');
contents = document.createTextNode(textlist[i]);
elem.appendChild(contents);
docFragm.appendChild(elem);
}
document.body.appendChild(docFragm);
  • cloneNode
var original = document.getElementById('container');
var cloned = original.cloneNode(true);
cloned.setAttribute('width', '50%');
var elem, contents;
for(var i = 0; i < textlist.length; i++) {
elem = document.createElement('p');
contents = document.createTextNode(textlist[i]);
elem.appendChild(contents);
cloned.appendChild(elem);
}
original.parentNode.replaceChild(cloned, original);
  • invisible
var posElem = document.getElementById('animation');
posElem.style.display = 'none';
posElem.appendChild(newNodes);
posElem.style.width = '10em';
// Other changes…
posElem.style.display = 'block';// block 块级元素
  • Taking measurements

    Taking measurements will force it to reflow

    浏览器也会cache 操作,一次 reflow.但是进行测量操作时为了获取准确数据,会强制进行 reflow

style 样式操作

  • 在已知样式的情况下设置 class
div {
background: #ddd;
color: #000;
border: 1px solid #000;
}
div.highlight {
background: #333;
color: #fff;
border: 1px solid #00f;
}

document.getElementById('mainelement').className = 'highlight';
  • define a new style attribute for the element

    兼容性:
  • IE的 setAttribute 不支持设置'style'(另外设置"class"属性,IE为"className")
  • 一些老浏览器,包括Opera 8,不支持 cssText
  • 如果只修改一些style,可以拼接,但是IE6/7/8中 cssText 返回值少了分号
var posElem = document.getElementById('animation');
var newStyle = 'background: ' + newBack + ';' +
'color: ' + newColor + ';' +
'border: ' + newBorder + ';';
if(typeof(posElem.style.cssText) != 'undefined') {
posElem.style.cssText = newStyle;
} else {
posElem.setAttribute('style', newStyle);
}

DOM事件

event 对象

  • stopPropagation() 取消冒泡,IE 不支持
  • cancelBubble = true 取消冒泡(IE)
  • preventDefault() 取消默认行为 IE 不支持
  • cancelable = false 表示没有默认行为 IE 不支持
  • returnValue = false 取消默认行为(IE)
  • javascript 的 return false 只会阻止默认行为,
  • jQuery
    • return 则既阻止默认行为又防止冒泡
    • stopPropagation 取消冒泡,兼容IE
    • preventDefault 取消默认行为,兼容 IE
// 取消冒泡和默认行为
function cancelHandler(event){
if(window.event){
window.event.cancelBubble = true;
window.event.eturnValue = false;
}else{
event.stopPropagation();
event.preventDefault();
}
return false; // jquery
return false;
}
/*只取消冒泡*/
function stopHandler(event)
window.event?window.event.cancelBubble=true:event.stopPropagation(); // jquery
event.stopPropagation();
}
/*只取消默认行为*/
function cancleDefault(event){
return false; // with jquery
event.preventDefault();
}



浏览器DOM操作的更多相关文章

  1. 前端页面卡顿?或是DOM操作惹的祸,需优化代码

    文档对象模型(DOM)是一个独立 于特定语言的应用程序接口.在浏览器中,DOM接口是以JavaScript语言实现的,通过JavaScript来操作浏览器页面中的元素,这使得 DOM成为了JavaSc ...

  2. HTML 学习笔记 JQuery(DOM 操作)

    一般来说,DOM操作分为三个方面,即:DOM Core(核心), HTML_DOM 和 CSS_DOM. 1.DOM Core DOM Core 并不专属于JavaScript,任何一种支持DOM的程 ...

  3. dom操作导致超级卡顿。。。

    var i=0;j=30;setinterval(function(){ document.getElementId(idname).style.top=j+'px'; i<3?i++:i=0; ...

  4. jQuery的DOM操作详解

    DOM(Document Object Model-文档对象模型):一种与浏览器, 平台, 语言无关的规则, 使用该接口可以轻松地访问页面中所有的标准组件DOM操作的分类 核心-DOM: DOM Co ...

  5. 解密jQuery内核 DOM操作的核心函数domManip

    domManip是什么 dom即Dom元素,Manip是Manipulate的缩写,连在一起就是Dom操作的意思. .domManip()是jQuery DOM操作的核心函数 对封装的节点操作做了参数 ...

  6. 解密jQuery内核 DOM操作的核心buildFragment

    文档碎片是什么 http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-B63ED1A3 DocumentFragment is a & ...

  7. 为什么DOM操作很慢

    转自:http://kb.cnblogs.com/page/534571/ 一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来 ...

  8. jQuery-1.9.1源码分析系列(十一) DOM操作

    DOM操作包括append.prepend.before.after.replaceWith.appendTo.prependTo.insertBefore.insertAfter.replaceAl ...

  9. jQuery-1.9.1源码分析系列(十一) DOM操作续——克隆节点

    什么情况下使用到克隆节点? 我们知道在对DOM操作过程中如果直接使用节点会出现节点随操作而变动的情况.比如对节点使用.after/.before/.append等方法后,节点被添加到新的地方,原来的位 ...

随机推荐

  1. 如何停止requestAnimationFrame方法启动的动画

    HTML5/CSS3时代,我们要在web里做动画选择其实已经很多了:(1) 你可以用CSS3的animattion+keyframes;(2) 你也可以用css3的transition; (3) 你还 ...

  2. Python学习笔记(一)数据类型

    一.整型和浮点型 Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样 age=10 num=-35 score=98.8 二.布尔类型 布尔值和布尔代数的表示 ...

  3. js如何打印对象

    js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一 ...

  4. 20165324 Java实验五 网络编程与安全

    20165324 Java实验五 网络编程与安全 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324 指导教师:娄嘉鹏 实验日期:2018年5月28日 实 ...

  5. [golang note] 错误处理

    错误处理 • 错误处理的标准模式 √ golang错误处理的标准模式:error接口. √ golang函数如果要返回错误,规范上是将error作为多返回值中的最后一个,但这并非是强制要求. ▶ er ...

  6. PHPCMS新闻内容调用方法介绍

    {template "content","header"} ---------- 调用根目录下phpcms\template\content\header文件 ...

  7. Java设计原则—开闭原则(转)

    原文出自:http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793454.html 开闭原则(Open Closed Principle)是Ja ...

  8. iClap:产品经理再忙也要看《琅琊榜》

    最先知道<琅琊榜>,是半年前偶然看了整整21分钟的<琅琊榜>片花,对麒麟才子梅长苏这一角色甚是期待,开播后每集必看,重复看,此剧果真不负众望,口碑爆棚,收视爆红,确是一部久违的 ...

  9. JVM内存区域划分Eden Space\Survivor Space\Tenured Gen\Perm Gen

    JVM区域分heap区和非heap区. 1)heap区:Eden Space(伊甸园),Survivor Space(幸存者区),Tenured Gen(老年代-养老区). 2)非heap区:Code ...

  10. python3.6 pyinstaller 打包exe

    现在的pyinstaller 最新版本已经支持python3.6版本的打包了只需要进行如下的操作即可 1. pip install pyinstaller 2. pip install --upgra ...