日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

html dom节点源码,JavaScript操作HTML DOM节点的基础教程

發布時間:2025/3/12 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 html dom节点源码,JavaScript操作HTML DOM节点的基础教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

因為 DOM 的存在,這使我們可以通過 JavaScript 來獲取、創建、修改、或刪除節點。

NOTE:下面提供的例子中的 element 均為元素節點。

獲取節點

父子關系

element.parentNode

element.firstChild/element.lastChild

element.childNodes/element.children

兄弟關系

element.previousSibling/element.nextSibling

element.previousElementSibling/element.nextElementSibling

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

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

ELEMENT_NODE & TEXT_NODE
  • First
  • Second
  • Third
  • Fourth

Hello

var ulNode = document.getElementsByTagName("ul")[0];

console.log(ulNode.parentNode); //

console.log(ulNode.previousElementSibling); //null

console.log(ulNode.nextElementSibling); //

Hello

console.log(ulNode.firstElementChild); //

First

console.log(ulNode.lastElementChild); //

Fourth

NTOE:細心的人會發現,在節點遍歷的例子中,body、ul、li、p節點之間是沒有空格的,因為如果有空格,那么空格就會被當做一個TEXT節點,從而用ulNode.previousSibling獲取到得就是一個空的文本節點,而不是

First 節點了。即節點遍歷的幾個屬性會得到所有的節點類型,而元素遍歷只會得到相對應的元素節點。一般情況下,用得比較多得還是元素節點的遍歷屬性。

實現瀏覽器兼容版的element.children有一些低版本的瀏覽器并不支持 element.children 方法,但我們可以用下面的方式來實現兼容。

Compatible Children Method123

ppp

h1

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]);

}

NOTE:此兼容方法為初稿,還未進行兼容性測試。

接口獲取元素節點

getElementById

getElementsByTagName

getElementsByClassName

querySelector

querySelectorAll

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

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

adscasdjkadscasdjk

var t = document.getElementById("test");

var a = document.getElementById('a');

//var tt = a.cloneNode(true);

t.appendChild(a);

在這段代碼中,頁面輸出的結果和沒有Javascript時是一樣的,元素并沒有被復制,由于元素本來就在最后一個位置,所以就和沒有操作一樣。如果把id為test的元素的兩個子元素點換位置,就可以在firbug中看到這兩個div已經被調換了位置。

如果我們希望把id為a的元素復制一個,然后添加到文檔中,那么必須使被復制的元素現脫離文檔流。這樣被添加復制的節點被添加到文檔中之后就不會影響到文檔流中原本的節點。即我們可以把復制的元素放到文檔的任何地方,而不影響被復制的元素。下面使用了cloneNode()方法,實現節點的深度復制,使用這種方法復制的節點會脫離文檔流。當然,我不建議使用這種方法復制具有id屬性的元素。因為在文檔中id值是唯一的。

adscasdjkadscasdjk

var t = document.getElementById("test");

var a = document.getElementById('a');

var tt = a.cloneNode(true);

t.appendChild(tt);

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

總結

以上是生活随笔為你收集整理的html dom节点源码,JavaScript操作HTML DOM节点的基础教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文人妻一区二区三区 | 国产一区麻豆 | 婷婷网五月天 | 囯产精品久久久久久 | 午夜性生活视频 | 一级性视频 | 日批免费观看 | 丝瓜色版 | 91中文字幕在线播放 | 色窝窝无码一区二区三区成人网站 | 一区二区在线视频免费观看 | 91啪在线观看 | 亚洲成人中文 | 天天操天天爽天天干 | 怡红院一区二区 | 青青视频免费在线观看 | 国产黄色www | 国产成人精品亚洲 | 在线观看亚洲精品视频 | 丝袜天堂 | 国产成人综合亚洲 | 久久黄色一级视频 | 国产精品一二三级 | 喷潮在线 | 日本在线免费观看 | 亚洲黄色大全 | 亚洲天堂福利 | 成人涩涩软件 | 精品国产乱码久久久久久鸭王1 | 白丝av | 2017日日夜夜| 国产精品日本一区二区在线播放 | 国产性xxxx高清 | 污污视频在线观看网站 | 嫦娥性艳史bd| 无码精品人妻一区二区三区湄公河 | 亚洲图片欧美 | 一卡二卡在线视频 | jzzjzzjzz亚洲成熟少妇 | 麻豆短视频 | 亚洲精品国产欧美在线观看 | 欧美怡红院视频一区二区三区 | 涩涩屋视频 | 国产精品99久久久久久动医院 | 欧美色第一页 | 午夜精品福利一区二区蜜股av | 国产精品主播一区二区 | 成年人免费网站在线观看 | 久久亚洲少妇 | 亚洲女人天堂av | 日本少妇一区二区三区 | 哪个网站可以看毛片 | 视频黄色免费 | 国产精品高潮呻吟av | 国产激情91 | 欧美国产中文字幕 | jizz欧美大片 | 91亚洲国产成人精品一区 | 日大逼 | 日本午夜精品理论片a级app发布 | 国产精品久久777777 | 日本午夜在线视频 | 亚洲高清二区 | av激情在线观看 | 91插插插插插插插 | 亚洲午夜视频在线 | 日本免费色视频 | 一级在线免费观看 | 日日干日日插 | 91福利网址| 国产黄色免费在线观看 | 日本精品久久久 | 亚洲蜜桃视频 | 韩日在线 | 国产一级做a爰片久久毛片男男 | 欧美黄色免费看 | 久草97| 亚洲乱码视频在线观看 | 国产精品免费久久 | 免费在线h| 午夜影院18 | 久久精彩 | 一卡二卡国产 | 91午夜视频| 91久久超碰 | 午夜免费成人 | 欧美精品久久久久久久久 | 免费看黄禁片 | 午夜寂寞福利 | 久久乐av | 杏导航aⅴ福利网站 | 看黄网站在线观看 | 成人拍拍视频 | 日韩国产区| 国产高清精品在线观看 | 国产日韩欧美综合 | 四虎精品在永久在线观看 | 欧美激情校园春色 | 国产精品久久久久久久久绿色 |