原生 JS 中的节点关系

1、 原生JS中nodeType属性

节点属性类型:


nodeType

任何的HTML元素,都有nodeType属性,值有1~11,这里精简到了5个:
1: 元素节点
3: 文本节点
8: 注释节点
9: document节点
10: DTD

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>节点</title>
</head>
<body>
    <div id="box">  节点</div>
    <script>
        var box = document.getElementById("box");
        alert(box.nodeType);  //弹出 1
        alert(box.childNodes[0].nodeType);  //3

    </script>
</body>
</html>

只有alert(document.nodeType); 结果为 9。

2、原生JS中的节点关系-childNodes

我为了好记叫(儿子数组)
任何节点都有childNodes属性,是一个类数组对象,存放着所有自己的儿子。
注意,这里有重大兼容性问题:空白文本现象
结构

    <div id="box">
        <p></p>
     </div>

Chrome、IE9、IE10……高级浏览器,认为:
alert(box.childNodes[0].nodeType ) //3
高级浏览器认为box的大儿子是文本节点。当然是空文本。

IE6、7、8等低级浏览器认为:
alert(box.childNodes[0].nodeType) //1
IE6、7、8认为 box 的大儿子是p。

所以为了没有兼容问题,需要遍历节点的时候,HTML结构就不能有空格。
一个面试题:

        <div id="box">
            <p></p>
            <p></p>
            <p></p>
            <p></p>
        </div>

    document.getElementById(“box”).childNodes.length;  //高级浏览器9,低级浏览器4

怎么解决这个差异呢?放弃原有的数组,重新遍历儿子数组,把所有nodeType为1的元素组成一个新的数组。

     var childs = [];
     for(var i = 0 ; i < box.childNodes.length ; i++){
        if(box.childNodes[i].nodeType == 1){  //可以为一也可以为三五八,筛选条件不同。
            childs.push(box.childNodes[i]);
        }
     }
     childs[1].style.background = "red";

firstChild属性、lastChild属性: 也不好用,IE6、7、8认为firstChild是节点, 而Chrome认为firstChild是空文本

3、原生JS中的节点关系-parentNode

我为了好记叫(父亲数组)
注意 childNodes 儿子可以有很多 ,parendNode 父亲只能有1个

4、previousSibling、nextSibling

previous | 英[ˈpri:viəs] 以前的; 先前的; 过早的; (时间上) 稍前的;
sibling | 英[ˈsɪblɪŋ] 同胞兄弟,姐妹; [生] 同科。
previousSibling、nextSibling
上一个同胞兄弟,下一个同胞兄弟。

        <div id="box">
            <p>AAA</p>
            <p>BBB</p>
            <p>CCC</p>
            <p>DDD</p>
        </div>

    ps[2].previousSibling   //低级浏览器就是BBB那个p,高级浏览器是空文本节点

让一个 box 序列上面全部变红。box 下面所有盒子变红雷同。

让 box 节点的之前的所有节点,都变红,原生 JS 挺难的:
            var prev = box;
            while(prev = prev.previousSibling){ //一直查找兄弟的兄弟,直到遇见 null。
     暗含一个 for 迭代器if(prev.nodeType == 1){
                    prev.style.background = "red";
                }
            }

jQuery 写法:
$("#box").prevAll().css.backgoround = ""red;

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

推荐阅读更多精彩内容

  • 属性: Attributes 存储节点的属性列表(只读) childNodes ...
    小呆呆008阅读 191评论 0 0
  • 本章内容 理解包含不同层次节点的 DOM 使用不同的节点类型 克服浏览器兼容性问题及各种陷阱 DOM 是针对 HT...
    闷油瓶小张阅读 623评论 0 1
  •   DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。   DOM 描绘...
    霜天晓阅读 3,609评论 0 7
  • 虽然现在有着很多优秀的框架,但归根结底我们依然得掌握好DOM知识来针对项目某些情况来使用原生操作,从而达到降低代码...
    俗三疯阅读 769评论 0 2
  • 基本概念 DOM DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Ob...
    许先生__阅读 857评论 0 1