js DOM(1)

什么是DOM?
DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个 JavaScript 对象,从而可以用脚本进行各种操作(增删改查)。通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。DOM 使 JavaScript 有能力对 HTML 事件做出反应。

DOM 树
浏览器会根据 DOM 模型,将结构化文档(比如 HTML 和 XML)解析成一系列的节点,再由这些节点组成一个树状结构(DOM Tree)。

节点 node
DOM的最小组成单位就是node。档的树形结构(DOM 树),就是由各种不同类型的节点组成。每个节点可以看作是文档树的一片叶子。
节点的7种类型
Document:整个文档树的顶层节点
DocumentType:doctype标签(比如<!DOCTYPE html>)
Element:网页的各种HTML标签(比如<body>、<a>等)
Attribute:网页元素的属性(比如class="a" src='img/a.png')
Text:标签之间或标签包含的文本
Comment:注释
DocumentFragment:文档的片段 //不常用

Text类型
文本节点由Text 类型表示,包含的是可以照字面解释的纯文本内容。纯文本中可以包含转义后的
HTML 字符,但不能包含HTML 代码。Text 节点具有以下特征:
 nodeType 的值为3;
 nodeName 的值为”#text”;
 nodeValue 的值为节点所包含的文本;
 parentNode 是一个Element;
 不支持(没有)子节点。

扩展:获取文本内容
1 .innerHTML
从对象的起始位置到终止位置的全部内容,包括Html标签。
innerHTML可以作为获取文本的方法也可以作为修改文本内容的方法
element.innerHTML 会直接返回element节点下所有的HTML化的文本内容
!注意 innerHTML方法只能作用于元素节点调用;文本节点并不能使用这个方法返回undefined

innerText 与 innerHtml 都是打印标签之间的文本信息

1、innerText 打印标签之间的纯文本信息,会将标签过滤掉,低版本的火狐浏览器不支持,而是支持textContent
2、innerHtml 打印标签之间的内容,包括标签和文本信息,各浏览器都支持,但是高版本的浏览器会原样打印
innerText 与 innerHtml不仅在获取元素文本上有区别,而且在设置上同样有区别。
1、innerText 在设置HTML标签时,会将<>进行转义,在输出的时候会原样输出,并不会解析HTML标签
2、innerHtml 在设置HTML标签时,浏览器会将HTML标签名解析成对应的标签

2.3 textContent
textContent与innerHTML方法类似会返回对象节点下所有的文本内容
但是区别为 textContent返回的内容只有去HTML化的文本节点的内容 如上例:
document.body.textContent //返回"文本文本" !注意在DOM中标签换行产生的空白字符会计入DOM中作为文本节点
另外IE8以前不支持textContent属性

2.4 innerText
从起始位置到终止位置的内容, 但它去除Html标签
innerText方法与textContent方法类似 并且和innerHTML一样也是作用于元素节点上
但是浏览器对于这两种方法解析空白字符的机制不一样;不是很常用
类似的还有outText outHTML等类似操作文本相关的方法
outerHTML 设置或获取对象及其内容的 HTML 形式

除了包含innerHTML的全部内容外, 还包含对象标签本身。

outerText 设置(包括标签)或获取(不包括标签)对象的文本


最后要提醒一点:文本与文本节点一定要区分,有些方法是依靠元素节点返回子文本内容,有些方法是文本节点返回自身文本内容,文本节点是对象而文本只是字符串;

innerHTML是符合W3C标准的属性,而innerText只适用于IE浏览器

注意:浏览器在解析节点中空白符时,会把它当作文本节点。因为浏览器的差异在对于非空文本节点前面或后面有空格或换行符等特殊的文本字符组成,IE和FF就会产生分歧,IE会忽略这些节点,而FF则认可这些节点。分歧产生的原因是FF认为<dl> 和</dl>,<dt>和</dt>,<dd>和</dd>之间的空白节点也是一个单独的节 点,所说FF的结果是5,而IE的结果是2。

由于元素书写时存在空白换行符等,所以导致在操作DOM节点出现问题,所以在遍历子节点时应该对文本节点做特殊处理,可以利用Document类型的nodeType属性过滤文本节点:
例:根据NodeType来判断:var td = document.getElementById("TEST");
var childs=[],i,len,node;
for(i=0,len=td.childNodes.length;i<len;i++){
node=td.childNodes[i];
//过滤文本节点
if(node.nodeType!=3){
childs.push(node);
}
}
alert(childs.length); //结果为2

节点的属性:

nodeType
nodeType属性返回一个整数值,表示节点的类型。
文档节点(document):9
元素节点(element):1
属性节点(attribute):2
文本节点(text):3
文档片断节点(DocumentFragment):11
文档类型节点(DocumentType)10
注释节点(Comment):8,

nodeName
nodeName 返回节点的名称
文档节点(document):#document
元素节点(element):大写的标签名
属性节点(attr):属性的名称
文本节点(text):#text
文档片断节点(DocumentFragment):#document-fragment
文档类型节点(DocumentType):文档的类型
注释节点(Comment):#comment

nodeValue
nodeValue 返回节点的文本值,可读可写
nodeValue是一个HTML DOM的对象属性;
同样的 可以通过 nodeValue设置节点的文本内容也可以直接返回文本内容
直接用节点对象调用就都可以: 如上例
document.getElementsByTagName(div)[0].childNodes[0].nodeValue //返回“文本”
另外 nodeValue 属性并不只存在于文本节点下 元素节点和属性节点对象也都具有nodeValue属性
属性节点的 nodeValue属性返回属性值
元素节点的 nodeValue属性返回null

节点的属性 textContent 返回当前节点和他所有后代节点的文本。忽略标签。
例:<div id="div">我是 <span>span</span> </div>
document.getElementById('div').textContent //我是span
同样textContent也是一个可读可写的属性。如果写入的内容包含标签, 也会把标签当做文本。
例:div.textContent='<p>我是p</p>'

nextSibling:
nextSibling 返回当前节点的下一个兄弟节点
例:<div id="d1">hello</div><div id="d2">world</div>
var div1 = document.getElementById('d1');
div1.nextSibling
sibling:就是兄弟的意思
next:下一个的意思
previous:前一个的意思
如果不存在下一个兄弟节点则返回null

a、下一个兄弟节点=节点.nextElementSibling || 节点.nextSibling

①.nextSibling: 调用者是节点在IE678中指下一个元素节点(标签),在火狐谷歌IE9+以后都指的是下一个节点(包括空文档和换行节点).
②. nextElementSibling:在火狐谷歌IE9都指的是下一个元素节点
总结:在IE678中用nextSibing,在火狐谷歌IE9+以后用nextElementSibing

perviousSibling:

b、前一个兄弟节点=节点.previousElemnentSibling || 节点.previousSibling

①. previousSibling:调用者是节点,IE678中指前一个元素节点(标签).在火狐谷歌IE9+以后都指的是前一个节点(包括空文档和换行节点)
②. previousElementSibling:在火狐谷歌IE9都指的是下一个元素节点
总结:在IE678中用previousSibling,在火狐谷歌IE9+以后用previousElementSibling

firstchild:
3 单个子节点
a、第一个子节点=父节点.firstElementChild || 父节点.firstChild

①.first:调用者是父节点,IE678中指第一个子元素节点(标签).在火狐谷歌IE9+以后都指的是第一个节点(包括文档和换行节点)
②. firstElementChild:在火狐谷歌IE9都指的第一个元素节点

lastchild:
b、最后一个子节点=父节点.lastElementChild ||父节点.lastChild

①. lastChild:调用者是父节点,IE678中指最后一个子元素节点(标签),在火狐谷歌IE9+以后都指的是最后一个节点(包括空文档和换行节点)
②. lastElementChild:在火狐谷歌IE9+都指的是最后一个元素节点

childNodes:
所有子节点

a、子节点数组=父节点.childNodes 获取所有节点,是一个nodelist数据
ChildNodes:它是标准属性,他返回指定元素的子元素集合(返回当前所有的子节点),包括HTML节点 所有属性 文本节点 (它是W3C的亲儿子)
火狐 谷歌等高版本会把换行也看做是子节点

*   ①.nodeType = 1 表示的是元素节点 记住 元素就是标签
*   ②. nodeType = 2 表示属性节点
*   ③. nodeType = 3 表示文本节点
  • b、子节点数组=父节点.children; 用的最多
    children:非标准属性,他只返回指定元素的子元素集合(返回当前所有的元素子节点),
    但他只返回HTML节点,甚至不反悔文本节点,虽然不是标准的DOM属性,但他和innerHTML方法一样,得到了几乎所有浏览器的支持,
    children 在IE678中包含注释节点,
    在IETF78中,注释节点不要写在里面

节点自己.parentNode.children[index]; 随意得到兄弟节点
获取所有的兄弟节点
function siblings(elm){
var a=[ ];
var p=elm.parentNode.children;
for(var i=0;i<p.length;i++){
if(p[i] !==elem){
a.push(p[i]);
}
}
return a;
}

父节点(parentNode、parentElement)
parentNode,parentElement 区别
parentElement 和 parentNode一样,但parentNode是W3C标准的,而parentElement 只在IE中可用.

firstChild,lastChild,nextSibling,previousSibling都会将空格或者换行当做节点处理,但是有代替属性
所以为了准确地找到相应的元素,会用
firstElementChild,
lastElementChild,
nextElementSibling,
previousElementSibling
兼容的写法,这是JavaScript自带的属性。
但坏消息是IE6,7,8不兼容这些属性。IE9以上和火狐谷歌支持。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336

推荐阅读更多精彩内容

  •   DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。   DOM 描绘...
    霜天晓阅读 3,601评论 0 7
  •   DOM 1 级主要定义的是 HTML 和 XML 文档的底层结构。   DOM2 和 DOM3 级则在这个结构...
    霜天晓阅读 1,404评论 1 3
  • DOM DOM内容主要分为四部分: 什么是DOM和节点; 获取节点; 节点操作(3种); 属性操作(3种)。 什么...
    magic_pill阅读 755评论 0 1
  •   尽管 DOM 作为 API 已经非常完善了,但为了实现更过的功能,仍然会有一些标准或专有的扩展。   2008...
    霜天晓阅读 410评论 0 0
  • logging模块为应用程序提供了灵活的手段记录事件、错误、警告和调试信息。通过日志我们可以分析到错误在什么地方,...
    kris_lp阅读 5,835评论 0 3