DOM对象

一、DOM对象

1.什么是DOM对象

  • DOM:文档对象模型(Document Object Model)
  • DOM的本质是建立网页与脚本语言或程序语言沟通的桥梁
  • 它是w3c万维网组织制定的一个标准, 通过这个标准可以去操作元素节点。比如动态创建一个节点,删除节点,替换节点..

2.分类

3 .DOM结构:树型结构

(1)节点类型
  • 文档节点
  • 元素节点
  • 文本节点
  • 注释节点
(2)节点与节点之间的关系
  • 根节点
  • 父节点
  • 子节点
  • 兄弟节点
(3)节点信息
  • nodeName: 节点名称
  • nodeValue:节点值
  • nodeType:节点类型


二、访问节点

1.使用getElement系列方法访问指定节点

  • getElementById()
  • getElementByName()
  • getElementByTagName()
    ... ...
2.根据层次关系访问节点
  • 节点属性


  • Element属性


  • 示例

oNext = oParent.nextElementSibling || oParent.nextSibling   
oPre = oParent.previousElementSibling || oParent.previousSibling  
oFirst = oParent. firstElementChild  ||  oParent.firstChild   
oLast = oParent.lastElementChild || oParent.lastChild 
  • 注意:
    在访问节点的时候,nextElementSibling是访问的下一个元素节点,oParent.nextSibling 是指访问的下一个节点。在元素节点与元素节点之间会有空的文本节点

三、操作节点

1. 操作节点的属性

  • 获取某个属性的值
getAttribute("属性名")
  • 设置某个属性的值
setAttribute("属性名","属性值")

2. 创建和插入节点

(1)创建节点步骤
  • 创建一格元素节点p节点
const pEle = document.createElement("p"); //<p></p>
  • 创建一个文本节点并设置类容
const testEle = document.createTextNode("内容");
  • 把文本节点追加到p节点中
pEle.appendChild(testEle);  //<p>内容</p>
(2)插入节点
  • 语法,将B插入到A节点中
insertBefore(A,B);
  • 例子
function insert() {
    // 获取输入框内容
    const inputBtn = document.getElementById("txt");
    const inputValue = inputBtn.value;

    //创建li元素节点
    const liEle = document.createElement("li"); //<li></li>
    const liText = document.createTextNode(inputValue); 
    liEle.appendChild(liText); // <li>aa</li>

    const ulEle = document.querySelector("#list");
    // ulEle.appendChild(liEle);
    ulEle.insertBefore(liEle, ulEle.firstElementChild.nextElementSibling);
}
(3)复制节点
  • 语法,复制某个指定的节点
cloneNode(doop)
  • 例子
function onCloneNode() {
    console.log('>>>>>');
    const ulEle = document.querySelector("#list");
    const newUlEle = ulEle.cloneNode(false);
    console.log('nodeName ',newUlEle.nodeName)
}

3. 删除和替换节点

(1)删除节点
  • 语法,删除A节点
removeChild(A)
  • 例子
function  deleteNode() {
    const ulEle = document.querySelector("#list");
    //判断有无子节点 hasChildNodes
    if(ulEle.hasChildNodes){
        ulEle.removeChild(ulEle.lastElementChild);
    }
}
(2)替换节点
  • 语法,用其他的节点替换指定的节点
replaceChild( newNode, oldNode)

4. 操作节点样式

改变样式的属性有:

  • style 属性
  • className 属性
(1)style属性
  • 语法
  HTML元素.style.样式属性="值"
  • 示例
  //1. 获取html元素对象
  const pEle = document.querySelector(".p1");
  //2 改变元素样式
  pEle.style.color = "red";
  pEle.style.fontSize = "28px";
(2)className 属性
  • 语法
HTML元素.className="样式名称"
  • 示例
  <style>
      .pnew {
        color: red;
        font-size: 28px;
      }

      .pnewTwo {
        font-weight: bold;
        background-color: aquamarine;
      }
  </style>
// 将pnewTow样式添加到id为pEle标签上
document.getElementById("pEle").className="pnewTwo ";
  • 封装添加样式和删除样式的方法

添加样式className

       // 获取html元素对象
      const pEle = document.querySelector(".p1");
      // 调用添加样式的方法,pEle为需要添加样式的节点,pnewTwo为需要添加的css样式
      addClass(pEle, "pnewTwo");
      /**
       * 给elem元素添加样式style,不影响原来样式
       */
      function addClass(elem, style) {
        if (elem.className) {
          //判断添加的样式在className中是否已经存在,indexOf()判断某个字符串是否存在
          if (elem.className.indexOf(style) === -1) {
            const oldStyle = elem.className;
            // 将旧的css样式和需要添加的css样式拼接起来,组成一个新的className
            const newStyle = oldStyle + " " + style;
            // 将className添加到pEle标签上
            elem.className = newStyle;
          }
        } else {
          elem.className = style;
        }
      }

删除样式className

      function removeClass(elem, delStr) {
        let str = elem.className; //原来样式
        // 将字符串按照空格分隔开,组成字符串数组
        const strArray = str.split(" ");
        for (index in strArray) {
          // 循环遍历字符串数组,判断我们需要删除的className字符串数组项是否存在
          if (strArray[index] == delStr) {
            // 数组删除,splice(m, n);  表示从下标为m的数开始删除,删除n个数据项
            strArray.splice(index, 1);
          }
        }

        let result = "";
        strArray.forEach(function(item){
           result = result + item + " ";
        })
        elem.className = result;
      }

5. 获取元素的样式

  • 语法
HTML元素.style.样式属性;
  • 示例
alert(document.getElementById("pEle").color);

6. 获取元素位置

  • 语法
// 标准浏览器
document.documentElement.scrollTop;
document.documentElement.scrollLeft;

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