DOM操作节点

1. 获取子节点

  • childNodes 所有子节点(元素、注释、文本、换行符)。
    <ul>
      <!-- 注释 -->
      <li class="li1">1</li>
      <li class="li2">2</li>
      <li class="li3">3</li>
    </ul>
<script>
    var ul = document.getElementsByTagName('ul')[0];
    console.log(ul.childNodes);
</script>

结果为 NodeList(9) [text, comment, text, li.li1, text, li.li2, text, li.li3, text]

  • firstChild 第一个子节点(元素、注释、文本、换行符)。
<script>
    console.log(ul.firstChild);
</script>

结果为 #text

  • lastChild **最后一个子节点(元素、注释、文本、换行符)。
<script>
    console.log(ul.firstChild);
</script>

结果为 #text

2. 获取子元素节点

  • children 获取所有子元素节点,有兼容问题(低版本IE【6-8】会和childNodes一样)。
    <ul>
      <!-- 注释 -->
      <li class="li1">1</li>
      <li class="li2">2</li>
      <li class="li3">3</li>
    </ul>
<script>
    var ul = document.getElementsByTagName('ul')[0];
    console.log(ul.children);
</script>

会正确获得所有子节点,结果为HTMLCollection(3) [li.li1, li.li2, li.li3]

  • firstElementChild 获取第一个子元素
<script>
    console.log(ul.firstElementChild);
</script>

结果为 <li class="li1">1</li>

  • lastElementChild 获取最后一个子元素
<script>
    console.log(ul.lastElementChild);
</script>

结果为 <li class="li1">1</li>.

3. 获取父元素节点

  • parentNode 获取父元素
    <ul>
      <!-- 注释 -->
      <li class="li1">1</li>
      <li class="li2">2</li>
      <li class="li3">3</li>
    </ul>
<script>
    var li = document.getElementsByTagName('li')[0];
    console.log(li.parentNode);
</script>

结果为<ul>...</ul>. 包含了<ul>中的 所有子元素和注释(相当于上方代码完整输出)。

  • offsetParent 获取具有定位属性的最近父元素
    <div style="position: relative">
      <ul>
        <!-- 注释 -->
        <li class="li1">1</li>
        <li class="li2">2</li>
        <li class="li3">3</li>
     </ul>
   </div>
<script>
    console.log(li.offsetParent);
</script>

结果为:<div style="position: relative">...</div>.同样包含<div>中的所有元素&注释

4. 获取同级节点

  • previousSibling 获取上一个兄弟节点(元素|注释|文本|换行符)
    <ul>
      <!-- 注释 -->
      <li class="li1">1</li>
      <li class="li2">2</li>
      <li class="li3">3</li>
    </ul>
<script>
    var li = document.getElementsByTagName('li')[0];
    console.log(li.previousSibling);
</script>

结果为 #text.

  • nextSibling 获取下一个兄弟节点
<script>
    console.log(li.nextSibling);
</script>

结果为 #text.

5. 获取同级元素节点

  • previousElementSibling 获取上一个兄弟元素节点
    <ul>
      <!-- 注释 -->
      <li class="li1">1</li>
      <li class="li2">2</li>
      <li class="li3">3</li>
    </ul>
<script>
    var li = document.getElementsByTagName('li')[1]; //<== 变为1
    console.log(li.previousElementSibling);
</script>

结果是 <li class="li1">1</li>.

  • nextElementSibling 获取下一个兄弟元素节点
<script>
    console.log(li.nextElementSibling);
</script>

结果是 <li class="li3">3</li>.

带有Element的方法,低版本IE不兼容(为了和IE区别做出了便利性的牺牲)。

6. 节点的增删改查

  • 创建节点 createTextNode()createElement()

    document.createTextNode('文本');  // 创建文本节点
    document.createElement('div');  // 创建节点
  • 插入节点 appendChild()insertBefore()

    parent.appendChild(newNode); // 父元素末尾插入元素
    oldNode.parentNode.insertBefore(newNode,oldNode);   // 指定元素前插入节点

实例1(在body末尾插入元素)

 <script>
    var div = document.createElement('div');  // 创建节点
      div.id = "my-div";  // 添加属性1
      div.className = "box";  // 添加属性1
      document.body.appendChild(div); // 在body末尾插入div
</script>
插入节点.png

实例2 (在div前插入元素)

    <div id="div"></div>
</body>
<script>
    var div = document.getElementById('div');
    var p = document.createElement('p');
      div.parentNode.insertBefore(p,div);
</script>
插入节点2.png
  • 替换节点 replaceChild()innerHTMLinnerText

    oldNode.parentNode.replaceChild(newNode, oldNowde);
    element.innerHTML; //  获取元素中的所有节点
    element.innerText; // 获取元素中的文本节点
    element.innerHTML= '<div class="box">文本</div>'; 
    //  覆盖元素中的所有内容,可设置元素节点&文本节点^
    element.innerText = '文本'; 
    // 覆盖元素中的所有内容,只能设置文本节点,但可以以文本输出标签。

实例1

    <p>
      <span>需要被替换的节点</span>
    </p>
<script>
    var span = document.getElementsByTagName('span')[0];
    var b = document.createElement('b');
    span.parentNode.replaceChild(b,span);
</script>
替换节点.png

实例2

    <p>
      <span>需要被替换的节点</span>
      <span>需要被替换的节点</span>
      <span>需要被替换的节点</span>
    </p>
<script>
    var p = document.getElementsByTagName('p')[0];
    p.innerHTML = '<b class="bold">插入节点</b>';
    // p.innerText = '插入文本';
</script>

innerHTML&innerText 会覆盖元素中的全部内容,并且只能同时使用一种,如果将注释取消,结果就是<p>插入文本</p>,按顺序覆盖,可以p.innerHTML = '插入文本<b></b>'。虽然inner这种方式简单,但速度会比较慢。

  • 删除节点 removeChild()

      delNode.parentNode.removeChild(delNode);

实例

      <p><p>
<script>
    var p = document.getElementsByTagName('p')[0];
    p.parentNode.removeChild(p);
</script>

插入和修改同级元素都会调用父元素执行,所以会出现.parentNode

  • 复制节点 cloneNode()

    element.cloneNode(false) // 只克隆节点
    element.cloneNode(false) // 克隆节点和其内部的所有节点

实例

    <p><!-- 注释 -->克隆节点</p>
<script>
    var p = document.getElementsByTagName('p')[0];
    console.log(p.cloneNode(false));
    console.log(p.cloneNode(true));
</script>
克隆节点.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容