JavaScript 操作Dom對象
1)JavaScript 操作DOM對象
1.DOM:是Document Object Model 的縮寫,及文檔對象模型
2.DOM通常分為三類:DOM Core(核心)、HTML-DOM 和 CSS-DOM
1.DOM Core
DOM Core 不是JavaScript的專屬品,任何一種支持DOM的編輯器語言都可以使用它
它的用途不僅限於處理一種使用標記語言編寫出來的文檔如HTML文檔
getElementById()/getElementByTagName()等方法都是 DOM Core的組成部分
栗子:使用Document.getElementByTagname("input")可獲取頁面中的<input>元素
2.HTML-DOM
獲取DOM模型中的某些對象、屬性、既可以使用DOM-Core實現,也可以使用HTML-DOM實現
相對於DOM Core獲取對象、屬性而言,當使用HTML-DOM時,代碼通常較為簡單,只是它
的應用範圍沒有DOM Core廣泛,僅適用於處理HTML文檔
3.CSS-DOM
CSS-DOM是針對CSS的操作,在JavaScript中,CSS-DOM技術的主要作用是獲取和設置Style
對象的各種屬性,即CSS屬性,通過改變style對象的各種屬性,可以使用網頁呈現出各種
不同的效果。
2.節點和節點關系
簡介:DOM是以樹狀結構組織的HTML文檔,根據DOM概念,我們可以知道, HTML文檔中每個標簽
或元素都是一個節點,在DOM中是這樣規定的
2-1:整個文檔是一個文檔節點
2-2:每個HTML標簽是一個元素節點
2-3:包含在HTML元素中的文本是文本節點
2-4: 每個HTML屬性是一個屬性節點
2-5:註釋屬於註釋節點
- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8">
- <title>DOM 節點</title>
- </head>
- <body>
- <img src="#" alt="水果" id="fruit">
- <h1>喜歡水果</h1>
- <p>DOM 應用</p>
- </body>
- </html>
關系圖........
2-6使:用父(parent)、子(child)和同胞(sibing)等術語來描述這些節點的層次關系,父節點擁有節點,
同級的子節點被稱為同胞或兄弟節點,關系如下:
@在樹狀中,頂部節點被稱為根(root),如<html>節點。
@每個節點都有父節點,除了根(他沒有父節點)如<head>和<body>的父節點 都是<html>,
文本 節點DOM應用的父節點是<p>節點。
@一個節點可以擁有任意數量的子節點,如<body>節點的子節點有<img>、<h1>和<p>
@同胞節點是擁有相同父節點的節點、如<img>、<h1>和<p>就是兄弟節點、他們的父節點均
為 <body>
3.訪問節點
使用DOM Core訪問HTML文檔的節點主要有兩種方式,一種是使用getElement系列方法訪問節點、另外一
種是根據節點的層次關系訪問節點。
3-1:使用getElement系列方法訪問指定節點getElementById
1.getElementById()返回按id屬性查找的第一個對象對象的引用
2.getElementByName()返回按帶有指定名稱name查找的對象集合
3.getElementByTagName()返回帶有指定標簽 TagName查找的對象的集合
3-2:根據層次關系訪問節點
通過getEleMent三種方法都會忽略文檔的結構,因此在HTML DOM中提供了一些節點屬性如下
節點屬性:
1.parentNodes 返回節點的父節點
2.childNods 返回子節點集合,childNods[i]
3.firstChild 返回節點的第一個子節點,最普遍的用法是訪問該元素的文本節點
4.lastChild 返回節點的最後一個子節點
5.nextSibling 下一個節點
6.prebiousSiling 上一個節點
來一個栗子嘗嘗:
[javascript] view plain copy- <body>
- <section id="news">
- <header>京東快報<a href="">更多</a></header>
- <ul>
- <li><a href="">我是測試A</a> </li>
- <li><a href="">我是測試B</a> </li>
- <li><a href="">我是測試C</a> </li>
- <li><a href="">我是測試D</a> </li>
- <li><a href="">我是測試E</a> </li>
- </ul>
- </section>
- /*
- section 的子節點(childNodes)是header 和 ul
- header 和 ul 的父節點是section(parentNode),
- header 是 section的第一個子節點(firstChild)
- ul是section節點的最後一個子節點(lastChild)
- 後面省略....請自行思考
- */
- </body>
要是訪問第三個li節點,該怎麽做那?不妨再吃個栗子
第一種做法:
var obj = document.getElementById("news");
var xx=obj.lastChild.firstChild.nextSibling.nextSibling.innerHTML;
alert(xx);
運行結果:<li><a href="">我是測試C</a> </li>
要是在第一個li標簽打一個回車,相當於一個空行,則運行結果有變化?
運行結果:<li><a href="">我是測試B</a> </li>
解析:瀏覽器把空行也當做了標簽,這就是瀏覽器的不兼容問題
避免上述現象應該怎麽辦那?
在JavaScript中給大家提供了一組可兼容不同瀏覽器的element屬性,可以消除空行
firstElementChild 返回節點的第一個子節點,最普遍的用法是訪問
lastElementChild 返回節點的最後一個節點
nextElementSibling 下一個節點
previousElementSibling 上一個節點
var obj = document.getElementById("news");
var xx=obj.lastElementChild.firstElementChild.nextElementSibling.nextElementSibling.innerHTML;
alert(xx);
註意事項:
在IE下支持 firstChild lastChild previousSibing nextSibling,但是在FireFox 下由於它會把標簽之間
的空格、換行等當成文本節點,因為為了準確地找到相應的元素,使用firsElementChild
、lastElementChild 、previousElementSibling、nextElementSibling 來兼容瀏覽器
2)節點信息
節點是DOM層次結構中的任何類型的對象的通用名稱,每個節點都擁有包含著關於節點某些信息的屬性,
這些屬性如下:
nodeName (節點名稱)
nodeValue (節點值)
nodeType (節點類型)
1. nodeName 屬性包含某個節點名稱,元素節點的nodeName 是標簽名稱,文本節點的nodeName永遠是#text
文檔節點的nodeName 永遠是#document。
2. nodeValue 節點值,對於節點,nodeValue 屬性包含文本;對於屬性節點,nodeValue屬性包含屬性值,nodevalue
屬性對於文本節點,和元素節點是不可用的
3.nodeType 屬性可返回節點的類型,是一個只讀屬性,如返回的是元素節點、文本節點、註釋節點。
節點類型:
節點類型 NodeType值
元素element 1
屬性attr 2
文本text 3
註釋comments 8
文本document 9
來一個栗子:
[javascript] view plain copy- <body>
- <ul id="nodelist">
- <li>nodeName</li>
- <li>nodeValue</li>
- <li>nodeType</li>
- </ul>
- <script>
- //拿到根節點
- var nodes=document.getElementById("nodelist");
- //拿到根節點下的第一個子節點的類型
- var type1=nodes.firstElementChild.nodeType;
- //拿到拿到根節點下的第一個子節點的子節點的類型值
- var type2=nodes.firstElementChild.firstChild.nodeType;
- // \\ var type2=nodes.firstElementChild.childNodes[0].nodeType;
- //拿到拿到根節點下的第一個子節點的子節點的類型名稱
- var name1=nodes.firstElementChild.firstChild.nodeName;
- //拿到拿到根節點下的第一個子節點的子節點的文本值
- var str=nodes.firstElementChild.firstChild.nodeName;
- alert("type1:"+type1+"\n"+"type2:"+type2+"\n"+"name1:"+name1+"\n"+"str:"+str);
- </script>
- </body>
運行結果:
3)操作節點
1.操作節點屬性
語法: getAttribute(“屬性名”);
setAttribute(“屬性名”,“屬性值”);
小栗子:
[javascript] view plain copy- <body>
- <p>選擇你喜歡的書:<input type="radio" name="book" onclick="book()">我和狗狗一起活下來<input type="radio" name="book" onclick="book()">林允兒 </p>
- <div>
- <img src="" alt="" id="image" onclick="ing()">
- <span></span>
- </div>
- <script>
- function book()
- {
- //拿到book節點的集合
- var ele=document.getElementsByName("book");
- //拿到圖片元素
- var img=document.getElementById("image");
- //判斷選中的是第幾個按鈕
- if(ele[0].checked){
- img.setAttribute("src","img//dog.jpg");
- img.setAttribute("alt","我和狗狗一起活下來");
- img.nextElementSibling.innerHTML="我和狗狗一起活下來";
- }else if(ele[1].checked)
- {
- img.setAttribute("src","img//xxx.jpg");
- img.setAttribute("alt","林允兒");
- img.nextElementSibling.innerHTML="林允兒";
- }
- }
- //用來測試是否修改值成功,點擊圖片測試
- function ing()
- {
- //拿到圖片元素
- var img=document.getElementById("image");
- alert(img.getAttribute("alt"));
- }
- </script>
- </body>
運行結果:
2.創建和插入節點
名稱 描述
createElement(tagName) 創建一個標簽名為tagName的新元素節點
A.appendChild(B) 把B節點追加至A節點的末尾
insertBefore(A,B) 把A節點插入到B節點之前
cloneNode(deep) 復制某個指定的節點
小栗子:
[javascript] view plain copy- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8">
- <title>操作節點</title>
- </head>
- <body>
- <p>選擇你喜歡的書:<input type="radio" name="book" onclick="book()">我和狗狗一起活下來<input type="radio" name="book" onclick="book()">林允兒 </p>
- <div></div>
- <script>
- function book() {
- //拿到book節點的集合
- var ele = document.getElementsByName("book");
- //拿到第一個DIV
- var domDiv=document.getElementsByTagName("div")[0];
- if(ele[0].checked)
- {
- var img=document.createElement("img");
- img.setAttribute("src","img//ccc.jpg");
- img.setAttribute("onclick","cotyNode()")
- domDiv.appendChild(img);
- }else if(ele[1].checked)
- {
- var img=document.createElement("img");
- img.setAttribute("src","img//xxx.jpg");
- img.setAttribute("onclick","cotyNode()")
- domDiv.appendChild(img);
- }
- }
- function cotyNode()
- {
- var domDiv=document.getElementsByTagName("div")[0];
- var newDom=domDiv.lastChild.cloneNode(false);
- domDiv.insertBefore(newDom,domDiv.firstChild);
- }
- </script>
- </body>
- </html>
3.刪除和替換節點
名稱 描述
removeChild( node ) 刪除指定的節點
replaceChild( newNode,oldNode) 屬性attr 用其他的節點替換指定的節點
4.操作節點樣式
style屬性:HTML元素 . style . 樣式屬性 = “值”
document . getElementById("titles").style.color="#00000";
document . getElementById("titles").style.fonSize="25px";
className屬性:
5.獲取元素的樣式
語法一: HTML 元素 . style . 樣式屬性;
示例: alert( document . getElementById(“carList”). style . display );
語法一: 只能獲取內聯樣式的屬性值, 無法獲取內部樣式表 或 外部樣式表的屬性值。
語法二:document.defaultView.getComputedStyle( 元素,null ) . 屬性;
示例:var carList = document.getElementById( "carList" );
alert( documen . defaultView.getComputedStyle(carList,null). dispaly );
語法二:可以實現獲取樣式屬性值
語法三:HTML元素 . currentStyle . 樣式屬性;
alert(document . getElementById(“carList”). currentStyle . display);
語法三指兼容 IE 瀏覽器
4)JavaScript 獲取元素位置
1)元素屬性應用
document . documentElement . scrollTop;
document . documentElement . scrollLeft;
或者
document . body . scrollTop;
document . body . scrollLeft;
兩者的區別在於:針對於不同的瀏覽器 上述針對 標準瀏覽器使用 下著針對 Chrome
JavaScript 操作Dom對象