Javascript操作BOM和DOM详解(2)

一、DOM文档对象模型

          DOM 全称是 Document Object Model,也就是文档对象模型。是针对XML的基于树的API。描述了处理网页内容的方法和接口,是HTML和XML的API,DOM把整个页面规划成由节点层级构成的文档。


          DOM定义了一个HTMLDocument和HTMLElement做为这种实现的基础,就是说为了能以编程的方法操作这个 HTML 的内容(比如添加某些元素、修改元素的内容、删除某些元素),我们把这个 HTML 看做一个对象树(DOM树),它本身和里面的所有东西比如 <div></div> 这些标签都看做一个对象。

        当浏览器载入 HTML 文档, 它就会成为 document 对象。document 对象是HTML文档的根节点与所有其他节点(元素节点,文本节点,属性节点, 注释节点)。
Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。

Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问。

1.HTML页面对应DOM树

           DOM模型将整个文档(XML文档和HTML文档)看成一个树形结构,在DOM中,HTML文档的层次结构被表示为一个树形结构。并用document对象表示该文档,树的每个子节点表示HTML文档中的不同内容。

2.DOM节点        

        HTML页面中的每一个元素,都是一个节点(Node)这个节点又分下面三种类型,HTML页面是由这些节点构成的集合。HTML中有三种节点类型:

                   类型

                                                描述

元素节点(Element)

<html>、<body>、<p>等都是元素节点,即标签。

文本节点(Text)

向用户展示的内容,如<li>...</li>中的JavaScript、DOM、CSS等文本。

属性节点(Attr)

元素属性,元素才有属性,如<a>标签的链接属性href=""。

二、DOM的Document对象

   Document 对象是HTML文档的根节点与所有其他节点(元素节点,文本节点,属性节点, 注释节点)。Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问。

Document 对象的属性和方法

属性 / 方法 描述
document.activeElement 返回当前获取焦点元素
document.addEventListener() 向文档添加句柄
document.anchors 返回对文档中所有 Anchor 对象的引用。
document.baseURI 返回文档的绝对基础 URI
document.close() 关闭用 document.open() 方法打开的输出流,并显示选定的数据。
document.cookie 设置或返回与当前文档有关的所有 cookie。
document.createAttribute() 创建一个属性节点
document.createComment() createComment() 方法可创建注释节点。
document.createDocumentFragment() 创建空的 DocumentFragment 对象,并返回此对象。
document.createElement() 创建元素节点。
document.createTextNode() 创建文本节点。
document.doctype 返回与文档相关的文档类型声明 (DTD)。
document.documentElement 返回文档的根节点
document.documentMode 返回用于通过浏览器渲染文档的模式
document.documentURI 设置或返回文档的位置
document.domain 返回当前文档的域名。
document.domConfig 返回normalizeDocument()被调用时所使用的配置
document.embeds 返回文档中所有嵌入的内容(embed)集合
document.forms 返回对文档中所有 Form 对象引用。
document. getElementsByClassName() 返回文档中所有指定类名的元素集合,作为 NodeList 对象。
document.getElementById() 返回对拥有指定 id 的第一个对象的引用。
document.getElementsByName() 返回带有指定名称的对象集合。
document.getElementsByTagName() 返回带有指定标签名的对象集合。
document.images 返回对文档中所有 Image 对象引用。
document.implementation 返回处理该文档的 DOMImplementation 对象。
document.importNode() 把一个节点从另一个文档复制到该文档以便应用。
document.inputEncoding 返回用于文档的编码方式(在解析时)。
document.lastModified 返回文档被最后修改的日期和时间。
document.links 返回对文档中所有 Area 和 Link 对象引用。
document.normalize() 删除空文本节点,并连接相邻节点
document.normalizeDocument() 删除空文本节点,并连接相邻节点的
document.open() 打开一个流,以收集来自任何 document.write() 或 document.writeln() 方法的输出。
document.querySelector() 返回文档中匹配指定的CSS选择器的第一元素
document.querySelectorAll() document.querySelectorAll() 是 HTML5中引入的新方法,返回文档中匹配的CSS选择器的所有元素节点列表
document.readyState 返回文档状态 (载入中……)
document.referrer 返回载入当前文档的文档的 URL。
document.removeEventListener() 移除文档中的事件句柄(由 addEventListener() 方法添加)
document.renameNode() 重命名元素或者属性节点。
document.scripts 返回页面中所有脚本的集合。
document.strictErrorChecking 设置或返回是否强制进行错误检查。
document.title 返回当前文档的标题。
document.URL 返回文档完整的URL
document.write() 向文档写 HTML 表达式 或 JavaScript 代码。
document.writeln() 等同于 write() 方法,不同的是在每个表达式之后写一个换行符。

其中最主要是以下三个获得元素节点对象的方法:

document.getElementById() 返回对拥有指定 id 的第一个对象的引用。
document.getElementsByName() 返回带有指定名称的对象集合。
document.getElementsByTagName() 返回带有指定标签名的对象集合。

三、DOM的元素(Element)对象

        在HTML DOM中, Element元素对象对应着每一个 HTML标签元素,如:<p><a><h2>等等HTML标签元素。Element对象可以是元素节点,文本节点,注释节点。NodeList对象代表了节点列表,类似于 HTML元素的子节点集合。元素可以有属性。

1. Node接口的属性和方法

    • Modifier and Type 方法 描述
      Node appendChild​(Node newChild)

      将节点 newChild添加到此节点的子节点列表的末尾。

      Node cloneNode​(boolean deep)

      返回此节点的副本,即,作为节点的通用拷贝构造函数。

      short compareDocumentPosition​(Node other)

      将参考节点,即将被调用此方法的节点与文档中的位置相关联的节点(即作为参数传递的节点)进行比较。

      NamedNodeMap getAttributes​()

      A NamedNodeMap包含该节点的属性(如果它是一个 Element )或 null

      String getBaseURI​()

      该节点的绝对基本URI或 null如果实现无法获取绝对URI。

      NodeList getChildNodes​()

      A NodeList包含此节点的所有子节点。

      Object getFeature​(String feature, String version)

      该方法返回一个专门的对象,该对象实现指定的特征和版本的专门API,如

      Node getFirstChild​()

      这个节点的第一个孩子。

      Node getLastChild​()

      这个节点的最后一个孩子。

      String getLocalName​()

      返回此节点的限定名称的本地部分。

      String getNamespaceURI​()

      该节点的命名空间URI,如果未指定, null (请参阅)。

      Node getNextSibling​()

      紧随该节点的节点。

      String getNodeName​()

      该节点的名称取决于其类型; 见上表。

      short getNodeType​()

      代表基础对象的类型的代码,如上所定义。

      String getNodeValue​()

      该节点的值取决于其类型; 见上表。

      Document getOwnerDocument​()

      与此节点相关联的 Document对象。

      Node getParentNode​()

      这个节点的父节点。

      String getPrefix​()

      该节点的命名空间前缀,如果未指定, null

      Node getPreviousSibling​()

      紧邻节点之前的节点。

      String getTextContent​()

      此属性返回此节点及其后代的文本内容。

      Object getUserData​(String key)

      检索与该节点上的键相关联的对象。

      boolean hasAttributes​()

      返回此节点(如果它是一个元素)是否具有任何属性。

      boolean hasChildNodes​()

      返回此节点是否有任何子节点。

      Node insertBefore​(Node newChild, Node refChild)

      插入节点 newChild现有的子节点之前 refChild

      boolean isDefaultNamespace​(String namespaceURI)

      此方法检查指定的 namespaceURI是否为默认命名空间。

      boolean isEqualNode​(Node arg)

      测试两个节点是否相等。

      boolean isSameNode​(Node other)

      返回此节点是否与给定节点相同。

      boolean isSupported​(String feature, String version)

      测试DOM实现是否实现特定功能,并且此节点支持该功能,如下所述。

      String lookupNamespaceURI​(String prefix)

      从该节点开始,查找与给定前缀相关联的命名空间URI。

      String lookupPrefix​(String namespaceURI)

      从该节点开始查找与给定名称空间URI关联的前缀。

      void normalize​()

      Node (包括属性节点)下的子树的全部深度全部 Text在“正常”形式中,其中只有结构(例如元素,注释,处理指令,CDATA部分和实体引用)将 Text节点即,既没有相邻的 Text节点也没有空的 Text节点。

      Node removeChild​(Node oldChild)

      从子列表中删除 oldChild指示的子节点,并返回。

      Node replaceChild​(Node newChild, Node oldChild)

      替换子节点 oldChildnewChild儿童的名单,并返回 oldChild节点。

      void setNodeValue​(String nodeValue)

      该节点的值取决于其类型; 见上表。

      void setPrefix​(String prefix)

      该节点的命名空间前缀,如果未指定, null

      void setTextContent​(String textContent)

      此属性返回此节点及其后代的文本内容。

      Object setUserData​(String key, Object data, UserDataHandler handler)

      将对象与此节点上的键相关联。

 2.Element是Node接口的实现类

   以下属性和方法,可适用于所有 HTML 元素使用。具体使用时,可以使用父类接口中的方法,也可以用实现类Element中的方法。红色是重点方法

属性 / 方法 描述
element.accessKey 设置或返回accesskey一个元素
element.addEventListener() 向指定元素添加事件句柄
element.appendChild() 为元素添加一个新的子元素
element.attributes 返回一个元素的属性数组
element.childNodes 返回元素的一个子节点的数组
element.classlist 返回元素的类名,作为 DOMTokenList 对象。
element.className 设置或返回元素的class属性
element.clientHeight 在页面上返回内容的可视高度(不包括边框,边距或滚动条)
element.clientWidth 在页面上返回内容的可视宽度(不包括边框,边距或滚动条)
element.cloneNode() 克隆某个元素
element.compareDocumentPosition() 比较两个元素的文档位置。
element.contentEditable 设置或返回元素的内容是否可编辑
element.dir 设置或返回一个元素中的文本方向
element.firstChild 返回元素的第一个子节点
element.focus() 设置文档或元素获取焦点
element.getAttribute() 返回指定元素的属性值
element.getAttributeNode() 返回指定属性节点
element.getElementsByTagName() 返回指定标签名的所有子元素集合。
element. getElementsByClassName() 返回文档中所有指定类名的元素集合,作为 NodeList 对象。
element.getFeature() 返回指定特征的执行APIs对象。
element.getUserData() 返回一个元素中关联键值的对象。
element.hasAttribute() 如果元素中存在指定的属性返回 true,否则返回false。
element.hasAttributes() 如果元素有任何属性返回true,否则返回false。
element.hasChildNodes() 返回一个元素是否具有任何子元素
element.hasfocus() 返回布尔值,检测文档或元素是否获取焦点
element.id 设置或者返回元素的 id。
element.innerHTML 设置或者返回元素的内容。
element.insertBefore() 现有的子元素之前插入一个新的子元素
element.isContentEditable 如果元素内容可编辑返回 true,否则返回false
element.isDefaultNamespace() 如果指定了namespaceURI 返回 true,否则返回 false。
element.isEqualNode() 检查两个元素是否相等
element.isSameNode() 检查两个元素所有有相同节点。
element.isSupported() 如果在元素中支持指定特征返回 true。
element.lang 设置或者返回一个元素的语言。
element.lastChild 返回的最后一个子元素
element.namespaceURI 返回命名空间的 URI。
element.nextSibling 返回该元素紧跟的一个元素
element.nodeName 返回元素的标记名(大写)
element.nodeType Returns the node type of an element
element.nodeValue 返回元素的类型
element.normalize() 使得此成为一个"normal"的形式,其中只有结构(如元素,注释,处理指令,CDATA节和实体引用)隔开Text节点,即元素(包括属性)下面的所有文本节点,既没有相邻的文本节点也没有空的文本节点
element.offsetHeight 返回,任何一个元素的高度包括边框和填充,但不是边距
element.offsetWidth 返回元素的宽度,包括边框和填充,但不是边距
element.offsetLeft 返回当前元素的相对水平偏移位置的偏移容器
element.offsetParent 返回元素的偏移容器
element.offsetTop 返回当前元素的相对垂直偏移位置的偏移容器
element.ownerDocument 返回元素的根元素(文档对象)
element.parentNode 返回元素的父节点
element.previousSibling 返回某个元素紧接之前元素
element.querySelector() 返回匹配指定 CSS 选择器元素的第一个子元素
document.querySelectorAll() 返回匹配指定 CSS 选择器元素的所有子元素节点列表
element.removeAttribute() 从元素中删除指定的属性
element.removeAttributeNode() 删除指定属性节点并返回移除后的节点。
element.removeChild() 删除一个子元素
element.removeEventListener() 移除由 addEventListener() 方法添加的事件句柄
element.replaceChild() 替换一个子元素
element.scrollHeight 返回整个元素的高度(包括带滚动条的隐蔽的地方)
element.scrollLeft 返回当前视图中的实际元素的左边缘和左边缘之间的距离
element.scrollTop 返回当前视图中的实际元素的顶部边缘和顶部边缘之间的距离
element.scrollWidth 返回元素的整个宽度(包括带滚动条的隐蔽的地方)
element.setAttribute() 设置或者改变指定属性并指定值。
element.setAttributeNode() 设置或者改变指定属性节点。
element.setIdAttribute()  
element.setIdAttributeNode()  
element.setUserData() 在元素中为指定键值关联对象。
element.style 设置或返回元素的样式属性
element.tabIndex 设置或返回元素的标签顺序。
element.tagName 作为一个字符串返回某个元素的标记名(大写)
element.textContent 设置或返回一个节点和它的文本内容
element.title 设置或返回元素的title属性
element.toString() 一个元素转换成字符串
   
nodelist.item() 返回某个元素基于文档树的索引
nodelist.length 返回节点列表的节点数目。

 3.节点对象的操作

注意操作这些方法的具体对象,parentNode()方法是由子节点操作找到父节点,firstChild/lastChild方法都是由父节点操作去找子节点。兄弟之前用nextSibling/previousSibling操作。

四、DOM的事件对象

           HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序。事件通常与函数结合使用,当事件发生后函数会被执行。

1.鼠标事件

属性 描述 DOM
onclick 当用户点击某个对象时调用的事件句柄。 2
oncontextmenu 在用户点击鼠标右键打开上下文菜单时触发  
ondblclick 当用户双击某个对象时调用的事件句柄。 2
onmousedown 鼠标按钮被按下。 2
onmouseenter 当鼠标指针移动到元素上时触发。 2
onmouseleave 当鼠标指针移出元素时触发 2
onmousemove 鼠标被移动。 2
onmouseover 鼠标移到某元素之上。 2
onmouseout 鼠标从某元素移开。 2
onmouseup 鼠标按键被松开。 2

 2.键盘事件

属性 描述 DOM
onkeydown 某个键盘按键被按下。 2
onkeypress 某个键盘按键被按下并松开。 2
onkeyup 某个键盘按键被松开。

3.框架/对象(Frame/Object)事件

属性 描述 DOM
onabort 图像的加载被中断。 ( <object>) 2
onbeforeunload 该事件在即将离开页面(刷新或关闭)时触发 2
onerror 在加载文档或图像时发生错误。 ( <object>,<body>和 <frameset>)  
onhashchange 该事件在当前 URL 的锚部分发生修改时触发。  
onload 一张页面或一幅图像完成加载。 2
onpageshow 该事件在用户访问页面时触发  
onpagehide 该事件在用户离开当前网页跳转到另外一个页面时触发  
onresize 窗口或框架被重新调整大小。 2
onscroll 当文档被滚动时发生的事件。 2
onunload 用户退出页面。 (<body> 和 <frameset>) 2

表单事件

属性 描述 DOM
onblur 元素失去焦点时触发 2
onchange 该事件在表单元素的内容改变时触发( <input>, <keygen>, <select>, 和 <textarea>) 2
onfocus 元素获取焦点时触发 2
onfocusin 元素即将获取焦点时触发 2
onfocusout 元素即将失去焦点时触发 2
oninput 元素获取用户输入时触发 3
onreset 表单重置时触发 2
onsearch 用户向搜索域输入文本时触发 (<input="search">)  
onselect 用户选取文本时触发 ( <input> 和 <textarea>) 2
onsubmit 表单提交时触发 2

4.剪贴板事件

属性 描述 DOM
oncopy 该事件在用户拷贝元素内容时触发  
oncut 该事件在用户剪切元素内容时触发  
onpaste 该事件在用户粘贴元素内容时触发  

5.打印事件

属性 描述 DOM
onafterprint 该事件在页面已经开始打印,或者打印窗口已经关闭时触发  
onbeforeprint 该事件在页面即将开始打印时触发  

6.拖动事件

事件 描述 DOM
ondrag 该事件在元素正在拖动时触发  
ondragend 该事件在用户完成元素的拖动时触发  
ondragenter 该事件在拖动的元素进入放置目标时触发  
ondragleave 该事件在拖动元素离开放置目标时触发  
ondragover 该事件在拖动元素在放置目标上时触发  
ondragstart 该事件在用户开始拖动元素时触发  
ondrop 该事件在拖动元素放置在目标区域时触发  

7.多媒体(Media)事件

事件 描述 DOM
onabort 事件在视频/音频(audio/video)终止加载时触发。  
oncanplay 事件在用户可以开始播放视频/音频(audio/video)时触发。  
oncanplaythrough 事件在视频/音频(audio/video)可以正常播放且无需停顿和缓冲时触发。  
ondurationchange 事件在视频/音频(audio/video)的时长发生变化时触发。  
onemptied 当期播放列表为空时触发  
onended 事件在视频/音频(audio/video)播放结束时触发。  
onerror 事件在视频/音频(audio/video)数据加载期间发生错误时触发。  
onloadeddata 事件在浏览器加载视频/音频(audio/video)当前帧时触发触发。  
onloadedmetadata 事件在指定视频/音频(audio/video)的元数据加载后触发。  
onloadstart 事件在浏览器开始寻找指定视频/音频(audio/video)触发。  
onpause 事件在视频/音频(audio/video)暂停时触发。  
onplay 事件在视频/音频(audio/video)开始播放时触发。  
onplaying 事件在视频/音频(audio/video)暂停或者在缓冲后准备重新开始播放时触发。  
onprogress 事件在浏览器下载指定的视频/音频(audio/video)时触发。  
onratechange 事件在视频/音频(audio/video)的播放速度发送改变时触发。  
onseeked 事件在用户重新定位视频/音频(audio/video)的播放位置后触发。  
onseeking 事件在用户开始重新定位视频/音频(audio/video)时触发。  
onstalled 事件在浏览器获取媒体数据,但媒体数据不可用时触发。  
onsuspend 事件在浏览器读取媒体数据中止时触发。  
ontimeupdate 事件在当前的播放位置发送改变时触发。  
onvolumechange 事件在音量发生改变时触发。  
onwaiting 事件在视频由于要播放下一帧而需要缓冲时触发。  

8.动画事件

事件 描述 DOM
animationend 该事件在 CSS 动画结束播放时触发  
animationiteration 该事件在 CSS 动画重复播放时触发  
animationstart 该事件在 CSS 动画开始播放时触发  

9.过渡事件

事件 描述 DOM
transitionend 该事件在 CSS 完成过渡后触发。  

10.其他事件

事件 描述 DOM
onmessage 该事件通过或者从对象(WebSocket, Web Worker, Event Source 或者子 frame 或父窗口)接收到消息时触发  
onmousewheel 已废弃。 使用onwheel 事件替代  
ononline 该事件在浏览器开始在线工作时触发。  
onoffline 该事件在浏览器开始离线工作时触发。  
onpopstate 该事件在窗口的浏览历史(history 对象)发生改变时触发。  
onshow 该事件当 <menu> 元素在上下文菜单显示时触发  
onstorage 该事件在 Web Storage(HTML 5 Web 存储)更新时触发  
ontoggle 该事件在用户打开或关闭 <details> 元素时触发  
onwheel 该事件在鼠标滚轮在元素上下滚动时触发  

11.事件对象常量和属性

11.1常量

静态变量 描述 DOM
CAPTURING-PHASE 当前事件阶段为捕获阶段(3) 1
AT-TARGET 当前事件是目标阶段,在评估目标事件(1) 2
BUBBLING-PHASE 当前的事件为冒泡阶段 (2) 3

11.2属性

属性 描述 DOM
bubbles 返回布尔值,指示事件是否是起泡事件类型。 2
cancelable 返回布尔值,指示事件是否可拥可取消的默认动作。 2
currentTarget 返回其事件监听器触发该事件的元素。 2
eventPhase 返回事件传播的当前阶段。 2
target 返回触发此事件的元素(事件的目标节点)。 2
timeStamp 返回事件生成的日期和时间。 2
type 返回当前 Event 对象表示的事件的名称。 2

11.3方法

方法 描述 DOM
initEvent() 初始化新创建的 Event 对象的属性。 2
preventDefault() 通知浏览器不要执行与事件关联的默认动作。 2
stopPropagation() 不再派发事件。 2

12.目标事件对象

方法

方法 描述 DOM
addEventListener() 允许在目标事件中注册监听事件(IE8= attachEvent()) 2
dispatchEvent() 允许发送事件到监听器上 (IE8 =fireEvent()) 2
removeEventListener() 运行一次注册在事件目标上的监听事件(IE8 =detachEvent()) 2

13.事件监听对象

方法

方法 描述 DOM
handleEvent() 把任意对象注册为事件处理程序 2

14.文档事件对象

方法

方法 描述 DOM
createEvent()   2

15.鼠标/键盘事件对象

属性

属性 描述 DOM
altKey 返回当事件被触发时,"ALT" 是否被按下。 2
button 返回当事件被触发时,哪个鼠标按钮被点击。 2
clientX 返回当事件被触发时,鼠标指针的水平坐标。 2
clientY 返回当事件被触发时,鼠标指针的垂直坐标。 2
ctrlKey 返回当事件被触发时,"CTRL" 键是否被按下。 2
Location 返回按键在设备上的位置 3
charCode 返回onkeypress事件触发键值的字母代码。 2
key 在按下按键时返回按键的标识符。 3
keyCode 返回onkeypress事件触发的键的值的字符代码,或者 onkeydown 或 onkeyup 事件的键的代码。 2
which 返回onkeypress事件触发的键的值的字符代码,或者 onkeydown 或 onkeyup 事件的键的代码。 2
metaKey 返回当事件被触发时,"meta" 键是否被按下。 2
relatedTarget 返回与事件的目标节点相关的节点。 2
screenX 返回当某个事件被触发时,鼠标指针的水平坐标。 2
screenY 返回当某个事件被触发时,鼠标指针的垂直坐标。 2
shiftKey 返回当事件被触发时,"SHIFT" 键是否被按下。 2

方法

方法 描述 W3C
initMouseEvent() 初始化鼠标事件对象的值 2
initKeyboardEvent() 初始化键盘事件对象的值 3

 五、代码示例

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>dom</title>
<script type="text/javascript" src="dom.js"></script>
</head>
<body>

<div id="div1" >DIV1的内容<br>
	<input id="tt" type="text" name="hobby" value="java">
	<input type="image" name="img" src="http://">
	<button id="btn" name="OK">确认</button>
</div>	

<div id="div2" style="width:250px;background-color: blue;">DIV2的内容</div>

<div id="div" myattr="王宝强" class="myclz" style="width:250px;background-color: green">DIV</div>
<input id="box" type="checkbox" checked="checked" />
<input id="only" type="text" value="只读文本,可以移动" readonly="readonly">


<button id="btn1" >移动到DIV</button>
<button id="btn2" >移动到DIV2</button>
<button id="btn3" >新增</button>
<button id="btn4" >插入到前面</button>
<button id="btn5" >插入到后面</button>
<button id="btn6" > del </button>
<button id="btn7" > replace </button>
</body>
</html>

// 文档加载完后,再执行script

window.onload=function(){
	getDom();
	getNode();
	getEle();
	getCheck();
	getOnly();
	getNode();
	getEle();
	getCheck();
	getOnly();
	
	
// 6.移动,增加,删除,修改node节点。对DOM的操作详见java中对DOM的方法
	// 增加点击事件
	document.getElementById("btn1").onclick=function moveDIV1(){
    	var subEl=document.getElementById("only");
    	var El=document.getElementById("div")
    	// 查看JAVA api中对DOM的操作时的方法和函数
    	// console.debug(El);
    	El.appendChild(subEl);
    }
   
    
	// 增加点击事件
    document.getElementById("btn2").onclick=function (){
    	var subEl=document.getElementById("only");
    	var El=document.getElementById("div2")
    	El.appendChild(subEl);      	
    }	
    
    document.getElementById("btn3").onclick=function() {
    	var El= document.getElementById("div1");
    	//创 建一个节点 ,createElement()方法查看java api
    	var subEl=document.createElement("span");
    	subEl.innerHTML="新增 ";
    	El.appendChild(subEl);
    }
    
    //在节点前面插入一个新节点
    document.getElementById("btn4").onclick=function() {
    	var El= document.getElementById("btn");
    	//创 建一个节点 ,createElement()方法查看java api
    	var subEl=document.createElement("span");
    	subEl.innerHTML="前面 ";    	
    	//insertBefore,在是由父节点调用
    	El.parentNode.insertBefore(subEl,El);
    }
    
    //在某个节点后面插入一个新节点
    function insertAfter(newNode,curNode){
    	if(curNode.nextSibling){
    		//当前节点的下一个节点的前面,也就是当前节点的后面
    		curNode.parentNode.insertBefore(newNode,curNode.nextSibling); 
    	}else{
    		curNode.parentNode.appendChild(newNode);
    	}    	
    }
    
    //后面插入
    document.getElementById("btn5").onclick=function() {
    	//var El= document.getElementById("div1");没有直接找父节点
    	var El= document.getElementById("only");
    	//创 建一个节点 ,createElement()方法查看java api
    	var subEl=document.createElement("span");
    	subEl.innerHTML="后面 ";    	
    	//insertBefore,在是由父节点调用
    	insertAfter(subEl,El);
    }
    
    //删除一个node,要先找到父节点调用删除
    document.getElementById("btn6").onclick=function() {
    	var El= document.getElementById("only");
    	//insertBefore,在是由父节点调用
    	if(El){
    		El.parentNode.removeChild(El);    		
    	}
    }
    
    //替换一个node,要先找到父节点调用
    document.getElementById("btn7").onclick=function() {
    	var El= document.getElementById("only");
    	if(El){
    		var subEl=document.createElement("button");
    		subEl.innerHTML="BTN";
    		subEl.id="001";
    		El.parentNode.replaceChild(subEl,El);    		
    	}
    }
};


// 1.获得DOM中的元素,每个元素=node=对象,它有多种方法和属性
function getDom(){
	
	var div = document.getElementById("div1");	
	var hobby =document.getElementsByName("hobby"); 
	var divs = document.getElementsByTagName("div");

	console.debug(div);
	console.debug(hobby);
	console.debug(divs[0]);
}

// 2.获得node ,Node对象:表示节点,是DOM中的所有类型的父类
/*
 * Document: 表示文档节点 nodeName="#document"
 * -------------------------------------------------------------------- Element:
 * 表示元素节点 nodeType=1 nodeName=元素名称 nodeValue=null Attr: 表示属性节点 nodeType=2
 * nodeName=属性名称 nodeValue=属性值 Text: 表示文本节点 nodeType=3 nodeName=#text
 * nodeValue=文本内容 (包括回车/换行/空白内容)
 * 
 * 1.node常用属性和方法,document.getElementById()先获得一个node childNodes 所有节点的列表
 * hasChildNodes 是否有子节点 firstChild 返回第一个子节点,回车换行也是 lastChild previousSibling
 * 返回上一个兄弟 nextSibling 2. 操作元素自定义属性: 获取属性值: 元素对象.getAttribute("属性名"); 设置属性值:
 * 元素对象.setAttribute("属性名",值);
 * 
 * 
 */
   function getNode(){
	   var mynode=document.getElementById("div1");
	   console.debug(mynode.childNodes);
	   console.debug(mynode.firstChild);
	   console.debug(mynode.firstChild.nextSibling);
   }
   
// 3.操作属性
	function getEle(){
		var El=document.getElementById("div");
		// 获得属性:元素/对象.属性
		console.debug(El.style);
		console.debug(El["id"]);
		
		// 获得style属性的两种方式,HTML与DOM属性名称不一样
		console.debug(El.style["background-color"]);
		console.debug(El.style.backgroundColor);
		console.debug(El.style.width);
		
		// 设置style属性
		El.style.width=350;
		El.style="background-color: yellow;";
		
		// 获得自定义的属性
		console.debug(El.getAttribute("myattr"));
		
		// 获得类名DOM与html名称不一样
		console.debug(El.className);
		
	}

// 4.HTML与DOM属性在一般情况是一致的,有些是不同的如:checkbox,HTML用checked表示选中,DOM中则用true表示选中
    function getCheck(){
    	// 获得元素
    	var El=document.getElementById("box");
    	// 可以查看该元素对象的所有属性
    	console.debug(El);
    	
    	// 获得元素中的属性
    	console.debug(El.checked);
    	// 设置属性的值
    	if(El.checked){
    		El.checked=false;   		
    	}else{
    		El.checked=true;   		    		
    	}
    	console.debug(El.checked);
    }


// 5.HTML与DOM属性名称不一致时,可以选打印出所有属性,在里面找到DOM中正确的名称
    function getOnly(){
    	var El=document.getElementById("only");
    	console.debug(El);    	
    	console.debug(El.readOnly);
    	if(El.readOnly){
    		El.readonly=false;
    	}else{
    		El.readOnly=true;
    	}
    }

 

Javascript操作BOM和DOM详解(1)

Javascript操作BOM和DOM详解(2)

Javascript操作BOM和DOM详解(3)实例:js操作checkbox、select、table

猜你喜欢

转载自blog.csdn.net/openbox2008/article/details/85261274