Dom 核心编程-8.21

复习

  1. document对象提供了哪五种访问DOM元素的方法?
  2. history、location对象分别有哪些常用方法?
  3. 使用什么样式属性控制元素的隐藏/显示

单词预习

  • Attribute 属性
  • Node 节点
  • first 第一个
  • last 最后一个
  • child 孩子
  • create 创建
  • Element 元素
  • append 追加
  • insert 插入
  • clone 复制
  • remove 删除
  • replace 替换
  • delete 删除

吐血 推荐 jquery之父写的javascript书 《精通JavaScript》

吐血推荐 第七章 JavaScript与CSS
http://www.cnblogs.com/yuzhongwusan/archive/2008/12/29/1364560.html

知识点讲解

3.1 什么是DOM?

  • 文档对象模型(Document Object Model)
  • 通过DOM可以动态改变文档内容

动态改变文档内容的原理

  1. 解析文档(如HTML)并生成DOM树
  2. 通过DOM标准接口+编程语言改变文档内容

解析文档生成DOM树的过程

html文档
生成的节点树

OM树中的节点类型和节点关系

节点类型与节点关系

3.2 W3C规定的三类DOM标准接口

Core DOM(核心DOM),适用于各种结构化文档
XML DOM,专用于XML文档
HTML DOM,专用于HTML文档

3.3 Core DOM (核心DOM)的操作

3.3.1访问指定节点的方法

getElementById( )
getElementsByName( )
getElementsByTagName( )
getElementsByClassName( )
querySelector( )
querySelectorAll( )

3.3.2查看/修改属性节点

getAttribute("属性名")
setAttribute("属性名","属性值")

3.3.3 根据层次关系查找节点

如果编程时希望访问某个元素的父元素,但又不知道父元素的ID、name、tag,怎么办
parentNode() 父亲元素
firstChild () 第一个子元素
lastChild() 最后一个子元素

3.3.4创建和增加节点

createElement():创建节点
appendChild():末尾追加方式插入节点
insertBefore():在指定节点前插入新节点
cloneNode():克隆节点

3.3.5删除和替换节点的方法

parent.removeChild(要删除的):删除节点
parent.replaceChild(新的额,被替换的 ) :替换节点

3.4 HTML DOM对象 的属性访问

function change(){
  var imgs=document.getElementById("s1");
  imgs.src="images/grape.jpg";
}
function show(){
  var hText=document.getElementById("s1").alt;
  alert("图片的alt是:"+hText)
}
</script>

3.5 表格的操作

  • table. insertRow(num) ; 插入行
  • row.insertCell(num) ; 插入列
  • tableObj.deleteRow(num); 插入列

总结

  1. W3C提供了DOM的哪三类标准?
  2. Core DOM包括哪些常用的节点操作?方法分别是什么?
  3. Core DOM、HTML DOM访问属性的方法分别是什么?

作业

作业1
作业2
作业3
作业4 购物车

扩展阅读1

JavaScript获取HTML DOM节点元素的方法的总结

在Web应用程序特别是Web2.0程序开发中,经常要获取页面中某个元素,然后更新该元素的样式、内容等。如何获取要更新的元素,是首先要解决的问题。令人欣慰的是,使用JavaScript获取节点的方法有很多种,这里简单做一下总结(以下方法在IE7和Firefox2.0.0.11测试通过):

1. 通过顶层document节点获取

(1) document.getElementById(elementId):该方法通过节点的ID,可以准确获得需要的元素,是比较简单快捷的方法。如果页面上含有多个相同id的节点,那么只返回第一个节点。

如今,已经出现了如prototype、Mootools等多个JavaScript库,它们提供了更简便的方法:$(id),参数仍然是节点的id。这个方法可以看作是document.getElementById()的另外一种写法,不过$()的功能更为强大,具体用法可以参考它们各自的API文档。

(2)document.getElementsByName(elementName):该方法是通过节点的name获取节点,从名字可以看出,这个方法返回的不是一个节点元素,而是具有同样名称的节点数组。然后,我们可以通过要获取节点的某个属性来循环判断是否为需要的节点。

例如:在HTML中checkbox和radio都是通过相同的name属性值,来标识一个组内的元素。如果我们现在要获取被选中的元素,首先获取改组元素,然后循环判断是节点的checked属性值是否为true即可。

(3)document.getElementsByTagName(tagName):该方法是通过节点的Tag获取节点,同样该方法也是返回一个数组,例如:document.getElementsByTagName('A')将 会返回页面上所有超链接节点。在获取节点之前,一般都是知道节点的类型的,所以使用该方法比较简单。但是缺点也是显而易见,那就是返回的数组可能十分庞 大,这样就会浪费很多时间。那么,这个方法是不是就没有用处了呢?当然不是,这个方法和上面的两个不同,它不是document节点的专有方法,还可以应 用其他的节点,下面将会提到。

2、通过父节点获取

(1)parentObj.firstChild:如果节点为已知节点(parentObj)的第一个子节点就可以使用这个方法。这个属性是可以递归使用的,也就是支持parentObj.firstChild.firstChild.firstChild...的形式,如此就可以获得更深层次的节点。
(2)parentObj.lastChild:很显然,这个属性是获取已知节点(parentObj)的最后一个子节点。与firstChild一样,它也可以递归使用。

在使用中,如果我们把二者结合起来,那么将会达到更加令人兴奋的效果,即:parentObj.firstChild.lastChild.lastChild...

(3)parentObj.childNodes:获取已知节点的子节点数组,然后可以通过循环或者索引找到需要的节点。

注意:经测试发现,在IE7上获取的是直接子节点的数组,而在Firefox2.0.0.11上获取的是所有子节点即包括子节点的子节点。

(4)parentObj.children:获取已知节点的直接子节点数组。

注意:经测试,在IE7上,和childNodes效果一样,而Firefox2.0.0.11不支持。这也是为什么我要使用和其他方法不同样式的原因。因此不建议使用。

(5)parentObj.getElementsByTagName(tagName):使用方法不再赘述,它返回已知节点的所有子节点中类型为指定值的子节点数组。例如:parentObj.getElementsByTagName('A')返回已知的子节点中的所有超链接。

3、通过临近节点获取

(1)neighbourNode.previousSibling:获取已知节点(neighbourNode)的前一个节点,这个属性和前面的firstChild、lastChild一样都似乎可以递归使用的。
(2)neighbourNode.nextSibling:获取已知节点(neighbourNode)的下一个节点,同样支持递归。

4、通过子节点获取

(1)childNode.parentNode:获取已知节点的父节点。

上面提到的方法,只是一些基本的方法,如果使用了Prototype等JavaScript库,可能还获得其他不同的方法,例如通过节点的class获取等等。不过,如果能够灵活运用上面的各种方法,相信应该可以应付大部分的程序。

扩展阅读 2

DOM下的节点属性和操作1

由于HTML与XML的相似性及差异,JavaScript不仅实现了标准的DOM方法和属性(即由W3C制定的),而且还实现了HTML特有的 DOM方法和属性,前者称为Core DOM,并不专属于JavaScript,后者称为HTML-DOM。不管是Core DOM还是HTML-DOM,我们在使用JavaScript的时候要注意浏览器之间的兼容性,因为不同的浏览器对这两类方法和属性的支持可能不一样。 这里不详谈Core DOM和HTML-DOM,以及跨浏览器兼容性,教材上都有详细描述。但一般推荐使用Core DOM方法和属性,尽管稍显繁杂。
常见的Core DOM属性和方法如下:
属性:

1 .nodeName

节点名称,相当于tagName.属性节点返回属性名,文本节点返回#text。nodeName是只读的。

2 .nodeType

值:1,元素节点;2,属性节点;3,文本节点。nodeType是只读的。

3 .nodeValue

返回一个字符串,指示这个节点的值。元素节点返回null,属性节点返回属性值,文本节点返回文本。nodeValue可读可写,这是对元素节点不能写。一般只用于设置文本节点的值。

4 .childNodes

返回子节点数组。文本和属性节点的childNodes永远是null。可以用hasChildNodes()来判断是否有子节点。只读属性,要删除添加节点可不能用操作childNodes数组的办法呃。

5 .firstChild

返回第一个子节点。文本和属性节点没有子节点,会返回一个空数组,这是针对这二位的特殊待遇。对于元素节点,若是没有子节点会返回null.有一个等价式:firstChild=childNodes[0].

6 .lastChild

返回最后一个子节点。返回值同firstChild,三方待遇参考上面。有一个等价式:lastChide=childNodes[childNodes.length-1].

7 .nextSibling()

返回节点的下一个兄弟节点。如果没有下一个兄弟节点的话,返回null。只读属性,不可以更改应用。

8 .previousSibling()

返回节点的上一个兄弟节点。

9 .parentNode()

返回节点的父节点。document.parentNode()返回null,其他的情况下都将返回一个元素节点,因为只有元素节点拥有子节点,出了document外任何节点都拥有父节点。parentNode(),又是一个只读的家伙。
操作:

1. 创建节点

createElement('tagName');
如:var oP=document.createElement('p');创建了一个<p></p>标签。

2. 创建文本节点

createTextNode('text');
如:var oText=document.createTextNode('This is a paragh!');

3. 附加子节点

appendChild(o);其中o为节点对象。
如:document.body.appendChildNode(o);在body末尾追加
document.forms[0].appendChildNode(o);在form表单末尾追加
oP.appendChildNode(o);在元素内部的末尾追加,其总oP为节点对象。

4. 创建文档片断

createDocumentFragment();
如:var oF=document.createDocumentFragment();

  1. 删除节点

removeChild(oP);

如:document.body.removeChild(oP),从body中移除oP节点对象。

6. 替换节点

replaceChid(newOp,targetOp);将目标节点targetOp替换为newOp
如:document.body.replayChild(oPa,oPb).ps:怎会这样特殊?源和目地操作数都是参数,为何调用者是document.body?记住先,别多管。——被替换的必须是body的子节点,可以用其他element替代document.body,前提一样,被替换的要是这个element的子节点。

7. 插入节点

insertBefor(newOp,targetOp);
insertAfter(newOp,targetOp);

8. 设置或得到属性节点

setAttribute('key','value');
getAttribute('key','value')

9.复制节点。

cloneNode(true/false)

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

推荐阅读更多精彩内容