亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript操作HTML DOM節點的基礎教程

2019-11-20 10:23:55
字體:
來源:轉載
供稿:網友

因為 DOM 的存在,這使我們可以通過 JavaScript 來獲取、創建、修改、或刪除節點。
NOTE:下面提供的例子中的 element 均為元素節點。
獲取節點

父子關系

element.parentNodeelement.firstChild/element.lastChildelement.childNodes/element.children

兄弟關系

element.previousSibling/element.nextSiblingelement.previousElementSibling/element.nextElementSibling

通過節點直接的關系獲取節點會導致代碼維護性大大降低(節點之間的關系變化會直接影響到獲取節點),而通過接口則可以有效的解決此問題。

通過節點直接的關系獲取節點會導致代碼維護性大大降低(節點之間的關系變化會直接影響到獲取節點),而通過接口則可以有效的解決此問題。

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>ELEMENT_NODE & TEXT_NODE</title></head><body> <ul id="ul"> <li>First</li> <li>Second</li> <li>Third</li> <li>Fourth</li> </ul> <p>Hello</p> <script type="text/javascript"> var ulNode = document.getElementsByTagName("ul")[0]; console.log(ulNode.parentNode);    //<body></body> console.log(ulNode.previousElementSibling); //null console.log(ulNode.nextElementSibling);  //<p>Hello</p> console.log(ulNode.firstElementChild);  //<li>First</li> console.log(ulNode.lastElementChild);  //<li>Fourth</li> </script></body></html>

NTOE:細心的人會發現,在節點遍歷的例子中,body、ul、li、p節點之間是沒有空格的,因為如果有空格,那么空格就會被當做一個TEXT節點,從而用ulNode.previousSibling獲取到得就是一個空的文本節點,而不是 <li>First</li> 節點了。即節點遍歷的幾個屬性會得到所有的節點類型,而元素遍歷只會得到相對應的元素節點。一般情況下,用得比較多得還是元素節點的遍歷屬性。
實現瀏覽器兼容版的element.children
有一些低版本的瀏覽器并不支持 element.children 方法,但我們可以用下面的方式來實現兼容。

<html lang><head> <meta charest="utf-8"> <title>Compatible Children Method</title></head><body id="body"> <div id="item"> <div>123</div> <p>ppp</p> <h1>h1</h1> </div> <script type="text/javascript"> function getElementChildren(e){  if(e.children){  return e.children;  }else{  /* compatible other browse */  var i, len, children = [];  var child = element.firstChild;  if(child != element.lastChild){   while(child != null){   if(child.nodeType == 1){    children.push(child);   }   child = child.nextSibling;   }  }else{   children.push(child);  }  return children;  } } /* Test method getElementChildren(e) */ var item = document.getElementById("item"); var children = getElementChildren(item); for(var i =0; i < children.length; i++){  alert(children[i]); } </script></body></html>

NOTE:此兼容方法為初稿,還未進行兼容性測試。
接口獲取元素節點

getElementByIdgetElementsByTagNamegetElementsByClassNamequerySelectorquerySelectorAll

2016311163518624.png (793×256)

getElementById

獲取文檔中指定 id 的節點對象。

var element = document.getElementById('id');getElementsByTagName

動態的獲取具有指定標簽元素節點的集合(其返回值會被 DOM 的變化所影響,其值會發生變化)。此接口可直接通過元素而獲取,不必直接作用于 document 之上。

// 示例var collection = element.getElementsByTagName('tagName');// 獲取指定元素的所有節點var allNodes = document.getElementsByTagName('*');// 獲取所有 p 元素的節點var elements = document.getElementsByTagName('p');// 取出第一個 p 元素var p = elements[0];


getElementsByClassName
獲取指定元素中具有指定 class 的所有節點。多個 class 可的選擇可使用空格分隔,與順序無關。
var elements = element.getElementsByClassName('className');
NOTE:IE9 及一下版本不支持 getElementsByClassName
兼容方法

function getElementsByClassName(root, className) { // 特性偵測 if (root.getElementsByClassName) { // 優先使用 W3C 規范接口 return root.getElementsByClassName(className); } else { // 獲取所有后代節點 var elements = root.getElementsByTagName('*'); var result = []; var element = null; var classNameStr = null; var flag = null; className = className.split(' '); // 選擇包含 class 的元素 for (var i = 0, element; element = elements[i]; i++) {  classNameStr = ' ' + element.getAttribute('class') + ' ';  flag = true;  for (var j = 0, name; name = className[j]; j++) {  if (classNameStr.indexOf(' ' + name + ' ') === -1) {   flag = false;   break;  }  }  if (flag) {  result.push(element);  } } return result; }}

querySelector / querySelectorAll

獲取一個 list (其返回結果不會被之后 DOM 的修改所影響,獲取后不會再變化)符合傳入的 CSS 選擇器的第一個元素或全部元素。

var listElementNode = element.querySelector('selector');var listElementsNodes = element.querySelectorAll('selector');var sampleSingleNode = element.querySelector('#className');var sampleAllNodes = element.querySelectorAll('#className');

NOTE: IE9 一下不支持 querySelector 與 querySelectorAll
創建節點

創建節點 -> 設置屬性 -> 插入節點

var element = document.createElement('tagName');

修改節點

textContent
獲取或設置節點以及其后代節點的文本內容(對于節點中的所有文本內容)。

element.textContent; // 獲取element.textContent = 'New Content';

NOTE:不支持 IE 9 及其一下版本。
innerText (不符合 W3C 規范)
獲取或設置節點以及節點后代的文本內容。其作用于 textContent 幾乎一致。

element.innerText;

NOTE:不符合 W3C 規范,不支持 FireFox 瀏覽器。
FireFox 兼容方案

if (!('innerText' in document.body)) { HTMLElement.prototype.__defineGetter__('innerText', function(){ return this.textContent; }); HTMLElement.prototype.__defineSetter__('innerText', function(s) { return this.textContent = s; });}

插入節點

appendChild

在指定的元素內追加一個元素節點。

var aChild = element.appendChild(aChild);

insertBefore

在指定元素的指定節點前插入指定的元素。

var aChild = element.insertBefore(aChild, referenceChild);

刪除節點

刪除指定的節點的子元素節點。

var child = element.removeChild(child);

innerHTML

獲取或設置指定節點之中所有的 HTML 內容。替換之前內部所有的內容并創建全新的一批節點(去除之前添加的事件和樣式)。innerHTML 不檢查內容,直接運行并替換原先的內容。
NOTE:只建議在創建全新的節點時使用。不可在用戶可控的情況下使用。

var elementsHTML = element.innerHTML;

存在的問題+

  • 低版本 IE 存在內存泄露
  • 安全問題(用戶可以在名稱中運行腳本代碼)

PS: appendChild() , insertBefore()插入節點需注意的問題
使用appendChild()和insertBefore()插入節點都會返回給插入的節點,

//由于這兩種方法操作的都是某個節點的子節點,所以必須現取得父節點,代碼中 someNode 表示父節點 //使用appendChild()方法插入節點 var returnedNode = someNode.appendChild(newNode); alert(returnedNode == newNode) //true  //使用insertBefore()方法插入節點 var returnedNode = someNode.appendChild(newNode); alert(returnedNode == newNode) //true 

 值得注意的是,如果這兩種方法插入的節點原本已經存在與文檔樹中,那么該節點將會被移動到新的位置,而不是被復制。

<div id="test">  <div>adscasdjk</div>   <div id="a">adscasdjk</div> </div> <script type="text/javascript">  var t = document.getElementById("test");  var a = document.getElementById('a');  //var tt = a.cloneNode(true);  t.appendChild(a); </script> 

在這段代碼中,頁面輸出的結果和沒有Javascript時是一樣的,元素并沒有被復制,由于元素本來就在最后一個位置,所以就和沒有操作一樣。如果把id為test的元素的兩個子元素點換位置,就可以在firbug中看到這兩個div已經被調換了位置。
如果我們希望把id為a的元素復制一個,然后添加到文檔中,那么必須使被復制的元素現脫離文檔流。這樣被添加復制的節點被添加到文檔中之后就不會影響到文檔流中原本的節點。即我們可以把復制的元素放到文檔的任何地方,而不影響被復制的元素。下面使用了cloneNode()方法,實現節點的深度復制,使用這種方法復制的節點會脫離文檔流。當然,我不建議使用這種方法復制具有id屬性的元素。因為在文檔中id值是唯一的。

<div id="test">  <div>adscasdjk</div>   <div id="a">adscasdjk</div> </div> <script type="text/javascript">  var t = document.getElementById("test");  var a = document.getElementById('a');  var tt = a.cloneNode(true);  t.appendChild(tt); </script> 

相似的操作方法還有 removeNode(node)刪除一個節點,并返回該節;replaceNode(newNode,node)替換node節點,并返回該節點。這兩種方法相對來說更容易使用一些。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久国产a级| 国产91精品网站| 亚洲男人av电影| 国产精品91久久久久久| 最近2019中文字幕第三页视频| 97免费中文视频在线观看| 亚洲xxxx妇黄裸体| 91豆花精品一区| 国产精品色婷婷视频| 国产精品久久久久久久av电影| 午夜剧场成人观在线视频免费观看| 高清日韩电视剧大全免费播放在线观看| 国产精品成人v| 一区二区三区四区在线观看视频| 亚洲国产成人久久综合| 中日韩午夜理伦电影免费| 欧美午夜激情视频| 91麻豆国产语对白在线观看| 91网站免费看| 国产成人综合精品| 中文字幕亚洲在线| 久久综合网hezyo| 九九热在线精品视频| 久久成人精品视频| 国产精品国产自产拍高清av水多| 亚洲第一页中文字幕| 欧美成年人视频网站| 国内精品一区二区三区| 97国产精品视频| 国产亚洲日本欧美韩国| 欧洲成人免费视频| 久久五月情影视| 色樱桃影院亚洲精品影院| 欧美成人精品不卡视频在线观看| 正在播放欧美视频| 亚洲欧美色图片| 国产主播喷水一区二区| 国产日韩换脸av一区在线观看| 91在线网站视频| 伊人一区二区三区久久精品| 亚洲欧美日韩一区二区三区在线| 日韩成人激情视频| 少妇久久久久久| 亚洲福利在线看| 精品国产一区二区在线| 精品国产视频在线| 日韩精品福利在线| 国产精品自拍视频| 欧美另类极品videosbest最新版本| 热re91久久精品国99热蜜臀| 97人人爽人人喊人人模波多| 日韩中文字幕免费看| 欧美性猛交xxxx黑人猛交| 亚洲人成绝费网站色www| 久久夜精品香蕉| 国产99视频精品免视看7| 伊人伊成久久人综合网小说| 亚洲18私人小影院| 欧美高清不卡在线| 国产成人一区二区三区| 亚洲自拍另类欧美丝袜| 欧美在线性视频| 在线看日韩欧美| 国产精品日韩专区| 欧美成人免费大片| 国产精品狼人色视频一区| 久久久精品久久| 欧美裸体男粗大视频在线观看| 国产日韩欧美夫妻视频在线观看| 亚洲第一免费网站| 亚洲天堂av图片| xxxxx91麻豆| 欧美放荡办公室videos4k| 久久久久久久一区二区| 国产亚洲人成网站在线观看| 欧洲亚洲在线视频| 国产97在线播放| 中文字幕亚洲一区在线观看| 久久久久久欧美| 久久天堂电影网| 欧美—级高清免费播放| 久久久精品免费视频| 久久久噜噜噜久噜久久| 亚洲999一在线观看www| 亚洲日本成人女熟在线观看| 欧美黑人一级爽快片淫片高清| 亚洲国产欧美久久| 欧美巨猛xxxx猛交黑人97人| 九九热这里只有在线精品视| 成人国产精品一区| 亚洲欧美国产精品久久久久久久| 岛国av一区二区在线在线观看| 欧美另类极品videosbestfree| 97精品欧美一区二区三区| 亚洲护士老师的毛茸茸最新章节| 国产极品jizzhd欧美| 欧美成年人视频网站欧美| 欧美激情久久久久久| 一区二区三区黄色| 亚洲欧美一区二区三区在线| 亚洲成在人线av| 精品国产91乱高清在线观看| 日韩中文字幕在线| 欧美老女人www| 久久国产精品99国产精| 久久久久国产精品www| 一本色道久久综合狠狠躁篇的优点| 久久精品视频网站| 亚洲欧美日韩在线一区| 欧美精品在线免费| 中文字幕在线亚洲| 影音先锋日韩有码| 日韩风俗一区 二区| 欧美精品午夜视频| 欧美大胆在线视频| 国产欧美精品日韩| 国产精品成人国产乱一区| 欧美日韩国产成人| 亚洲精品日韩欧美| 日韩性xxxx爱| 欧美性视频在线| 91探花福利精品国产自产在线| 成人黄色短视频在线观看| 精品国产一区二区三区久久狼黑人| 91精品久久久久久久久不口人| www.日韩欧美| 亚洲成人教育av| 国产不卡av在线免费观看| 91在线视频精品| 日韩免费观看在线观看| 国产精品福利久久久| 久久人91精品久久久久久不卡| 亚洲精品一区中文字幕乱码| 成人国产亚洲精品a区天堂华泰| 欧美亚洲国产精品| 成人黄色激情网| 国产精品自产拍在线观| 欧美尤物巨大精品爽| 久久大大胆人体| 成人国产在线激情| 日韩精品在线观| 亚洲在线观看视频| 久久久久五月天| 欧美性videos高清精品| 亚洲天堂网在线观看| 欧美黄色性视频| 午夜精品久久久久久久99黑人| 韩国国内大量揄拍精品视频| 色久欧美在线视频观看| 亚洲综合色激情五月| 91精品视频观看| 久久成人免费视频| 国产精品入口夜色视频大尺度| 亚洲国产精品久久久久| 久久全球大尺度高清视频| 亚洲国产精品久久久久秋霞蜜臀| 一区二区三区四区精品| 亚洲第一区在线观看| 亚洲欧美日韩综合| 欧美亚洲激情视频| 91精品视频在线免费观看| 精品视频www| 2025国产精品视频| 美日韩精品免费视频|