在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 節(jié)點(diǎn)操作
書(shū)單
JavaScript 動(dòng)畫(huà)
HTML
CSS Reset
屬性操作
DOM 事件
閉包
Photoshop
Atom 文本編輯器
表單操作
布局解決方案
類型系統(tǒng)
開(kāi)發(fā)實(shí)踐
數(shù)據(jù)通信
變量作用域
BOM
JavaScript 程序設(shè)計(jì)
前端工程師概述
CSS
響應(yīng)式布局
表達(dá)式與運(yùn)算符
基本語(yǔ)法
JavaScript 介紹
版本控制
布局
調(diào)試器
背景
圖片保存
多媒體
文檔樹(shù)
列表操作
Sublime 編輯器
盒模型
常見(jiàn)布局樣例
類型識(shí)別
變形
數(shù)據(jù)存儲(chǔ)
選擇器
頁(yè)面架構(gòu)
開(kāi)發(fā)及調(diào)試工具
頁(yè)面模塊化
節(jié)點(diǎn)操作
測(cè)量及取色
瀏覽器兼容
HTML 簡(jiǎn)介
內(nèi)置對(duì)象
實(shí)體字符
產(chǎn)品前端架構(gòu)
協(xié)作流程
切圖
工具, 面板, 視圖
正則表達(dá)式
動(dòng)畫(huà)
語(yǔ)句
面向?qū)ο?/span>
HTML 語(yǔ)法
HTML 標(biāo)簽
技術(shù)選擇
樣式操作
圖片優(yōu)化與合并
語(yǔ)法
DOM 編程藝術(shù)
Canvas
接口設(shè)計(jì)
頁(yè)面優(yōu)化
文本

節(jié)點(diǎn)操作

節(jié)點(diǎn)操作

因?yàn)?DOM 的存在,這使我們可以通過(guò) JavaScript 來(lái)獲取、創(chuàng)建、修改、或刪除節(jié)點(diǎn)。

NOTE:下面提供的例子中的 element 均為元素節(jié)點(diǎn)。

獲取節(jié)點(diǎn)

父子關(guān)系

  • element.parentNode
  • element.firstChild/element.lastChild
  • element.childNodes/element.children

兄弟關(guān)系

  • element.previousSibling/element.nextSibling
  • element.previousElementSibling/element.nextElementSibling

通過(guò)節(jié)點(diǎn)直接的關(guān)系獲取節(jié)點(diǎn)會(huì)導(dǎo)致代碼維護(hù)性大大降低(節(jié)點(diǎn)之間的關(guān)系變化會(huì)直接影響到獲取節(jié)點(diǎn)),而通過(guò)接口則可以有效的解決此問(wèn)題。

<!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:細(xì)心地人會(huì)發(fā)現(xiàn),在節(jié)點(diǎn)遍歷的例子中,body、ul、li、p節(jié)點(diǎn)之間是沒(méi)有空格的,因?yàn)槿绻锌崭瘢敲纯崭窬蜁?huì)被當(dāng)做一個(gè)TEXT節(jié)點(diǎn),從而用ulNode.previousSibling獲取到得就是一個(gè)空的文本節(jié)點(diǎn),而不是 <li>First</li> 節(jié)點(diǎn)了。即節(jié)點(diǎn)遍歷的幾個(gè)屬性會(huì)得到所有的節(jié)點(diǎn)類型,而元素遍歷只會(huì)得到相對(duì)應(yīng)的元素節(jié)點(diǎn)。一般情況下,用得比較多得還是元素節(jié)點(diǎn)的遍歷屬性。

實(shí)現(xiàn)瀏覽器兼容版的element.children

有一些低版本的瀏覽器并不支持 element.children 方法,但我們可以用下面的方式來(lái)實(shí)現(xiàn)兼容。

<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:此兼容方法為初稿,還未進(jìn)行兼容性測(cè)試。

接口獲取元素節(jié)點(diǎn)

  • getElementById
  • getElementsByTagName
  • getElementsByClassName
  • querySelector
  • querySelectorAll
API 只作用于 document 唯一返回值 live
getElementById
getElementsByTagName
getElementsByClassName
querySelectorAll
querySelector
getElementById

獲取文檔中指定 id 的節(jié)點(diǎn)對(duì)象

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

動(dòng)態(tài)的獲取具有指定標(biāo)簽元素節(jié)點(diǎn)的集合(其返回值會(huì)被 DOM 的變化所影響,其值會(huì)發(fā)生變化)。此接口可直接通過(guò)元素而獲取,不必直接作用于 document 之上。

// 示例
var collection = element.getElementsByTagName('tagName');

// 獲取指定元素的所有節(jié)點(diǎn)
var allNodes = document.getElementsByTagName('*');

// 獲取所有 p 元素的節(jié)點(diǎn)
var elements = document.getElementsByTagName('p');
// 取出第一個(gè) p 元素
var p = elements[0];
getElementsByClassName

獲取指定元素中具有指定 class 的所有節(jié)點(diǎn)。多個(gè) class 可的選擇可使用空格分隔,與順序無(wú)關(guān)。

var elements = element.getElementsByClassName('className');

NOTE:IE9 及一下版本不支持 getElementsByClassName

兼容方法

function getElementsByClassName(root, className) {
  // 特性偵測(cè)
  if (root.getElementsByClassName) {
    // 優(yōu)先使用 W3C 規(guī)范接口
    return root.getElementsByClassName(className);
  } else {
    // 獲取所有后代節(jié)點(diǎn)
    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

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

var listElementNode = element.querySelector('selector');
var listElementsNodes = element.querySelectorAll('selector');

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

NOTE: IE9 一下不支持 querySelectorquerySelectorAll

創(chuàng)建節(jié)點(diǎn)

創(chuàng)建節(jié)點(diǎn) -> 設(shè)置屬性 -> 插入節(jié)點(diǎn)

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

修改節(jié)點(diǎn)

textContent

獲取或設(shè)置節(jié)點(diǎn)以及其后代節(jié)點(diǎn)的文本內(nèi)容(對(duì)于節(jié)點(diǎn)中的所有文本內(nèi)容)。

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

NOTE:不支持 IE 9 及其一下版本。

innerText (不符合 W3C 規(guī)范)

獲取或設(shè)置節(jié)點(diǎn)以及節(jié)點(diǎn)后代的文本內(nèi)容。其作用于 textContent 幾乎一致。

element.innerText;

NOTE:不符合 W3C 規(guī)范,不支持 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;
  });
}

插入節(jié)點(diǎn)

appendChild

在指定的元素內(nèi)追加一個(gè)元素節(jié)點(diǎn)。

var aChild = element.appendChild(aChild);

insertBefore

在指定元素的指定節(jié)點(diǎn)前插入指定的元素。

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

刪除節(jié)點(diǎn)

刪除指定的節(jié)點(diǎn)的子元素節(jié)點(diǎn)。

var child = element.removeChild(child);

innerHTML

獲取或設(shè)置指定節(jié)點(diǎn)之中所有的 HTML 內(nèi)容。替換之前內(nèi)部所有的內(nèi)容并創(chuàng)建全新的一批節(jié)點(diǎn)(去除之前添加的事件樣式)。innerHTML 不檢查內(nèi)容,直接運(yùn)行并替換原先的內(nèi)容。

NOTE:只建議在創(chuàng)建全新的節(jié)點(diǎn)時(shí)使用。不可在用戶可控的情況下使用。

var elementsHTML = element.innerHTML;

存在的問(wèn)題

  • 低版本 IE 存在內(nèi)存泄露
  • 安全問(wèn)題(用戶可以在名稱中運(yùn)行腳本代碼)
上一篇:版本控制下一篇:頁(yè)面模塊化