DOM

DOM

(Document Object Model)文档对象模型:js通过DOM来对html文档进行操作

  • document:表示整个html网页文档
  • object:把网页中的每一个部分转换为一个对象
  • model:使用模型来表示对象之间的关系,方便我们获取对象

节点(node)--构成html的最基本单元

常用节点分为四类:

  • 文档节点:整个html文档
  • 元素节点:html文档中的html标签
  • 属性节点:元素的属性
  • 文本节点:html标签中的文本内容
. nodeName nodeType nodeValue
文档节点 #document 9 null
元素节点 标签名 1 null
属性节点 属性名 2 属性值
文本节点 #text 3 文本内容

事件

https://www.w3school.com.cn/jsref/dom_obj_event.asp

文档的加载

浏览器在加载一个页面时,是按照自上向下的顺序加载的,读一行运行一行。如果将script标签写到页面的上边,在js代码执行时,页面还没有加载出来。

js代码编写在页面下部就是为了,可以在页面加载完成后执行js代码。

onload事件会在整个页面加载完成后才触发
w为window绑定一个onload事件,该事件对应的响应函数将会在页面加载完成后执行,这样可以确保我们的代码执行时所有的DOM对象已经加载完毕了

    window.onload=function(){
        alert('hello,bigyang');
    }

获取元素节点

  • 通过document对象调用

1、document.getElementById()

- 通过id属性获取一个元素节点对象
html:
     <button class="btn" ref="btn">按钮</button>
js:
    mounted() {
        var btn = document.getElementById('btn');
        console.log(typeof btn);//object类型
        console.log(this.$refs.btn.innerHTML);//输出标签名称“按钮”
        this.$refs.btn.innerHTML='bigyang';//改变按钮的名称
  },

2、document.getElementsByTagName()

- 通过标签名获取一组元素节点对象

这个方法会给我们返回一个类数组对象,所有查询到的元素都会封装到这个对象中;即使查询到的结果只有一个,也会封装到数组中返回。

html:
    <button @click="ob">open</button>
     <ul>
       <li><button class="btn1" ref="btn1">按钮1</button></li>
       <li><button id="btn2" ref="btn2">按钮2</button></li>
       <li><button class="" ref="">按钮3</button></li>
     </ul>
js:
    methods:{
      ob:function (){
      console.log('this is ob function');
      //获取所有标签名为li的元素,封装到类数组lis里面
      var lis = document.getElementsByTagName('li');
      console.log(typeof lis);
      //es6语法
      lis.forEach((item,index)=>{
      //循环输出打印lis里面的每个元素值
        console.log(item.innerHTML);
      })
    }
    }

3、document.getElementsByName():主要针对表单项标签,这些标签有name属性

注意:innerHTML用于获取元素内部的HTML代码,对于自结束标签,这个属性没有意义

  • input标签内有name、value等属性,可以直接元素.属性名得到值;也可以元素.属性名=值,去修改属性值。但是读取class时得用元素.className,因为class属于保留字。读取id可以直接元素.id
- 通过name属性获取一组元素节点对象
html:
     <button @click="gender">open</button>
     male<input class="inp" type="radio" name="gender" value="male">
     female<input class="inp" type="radio" name="gender" value="female">
js:
        gender:function(){
        //获取name为gender的元素,封装到类数组对象gi里面
      var gi = document.getElementsByName('gender');
      console.log(typeof gi);
      gi.forEach((item,index)=>{
        console.log(item.value);
        //input标签内有name、value等属性,可以直接元素.属性名得到值
        alert(item.value)
        alert(item.innerHTML)
        //弹窗是空的,无意义
      })
    }

获取元素节点的子节点

  • 通过具体的元素节点调用
    1、getElementsByTagName()
- 方法,返回当前节点的指定标签名后代节点
html:
     <div>
       <button @click="open">按钮</button>
         <ul id="car">
           <li>奥迪</li>
           <li>迈巴赫</li>
           <li>宝马</li>
           <li>雷克萨斯</li>
         </ul>
     </div>
js:
     methods:{
    open: function(){
      var car = document.getElementById('car');
      console.log(typeof car);
      var lis = car.getElementsByTagName('li');
      console.log(lis.length)   //4
      lis.forEach((item,index)=>{
        console.log(item.innerHTML);
      })
    }
  },

2、childNodes

- 属性,表示当前节点的所有子节点

注意:childNodes属性会获取包括文本节点在内的所有节点,标签与标签之间的的空白也会被视为文本节点

html:
         <div>
       <button @click="open">按钮</button>
         <ul id="car">
           <li>奥迪</li>
           <li>迈巴赫</li>
           <li>宝马</li>
           <li>雷克萨斯</li>
         </ul>
     </div>
js:
        open: function(){
      var car = document.getElementById('car');
      var cars = car.childNodes;
      console.log(cars.length); //长度输出为9
      //????问题?????
      //在vue里面只能识别空格文本,换行不行,以及ul和li之间的空格也不能识别
      cars.forEach((item,index)=>{
        console.log(item.innerHTML);
      })
    }

3、firstChild

- 属性,表示当前节点的第一个子节点
html:
         <div>
       <button @click="open">按钮</button>
       <ul id="car">
         <li>奥迪</li>
         <li>迈巴赫</li>
         <li>宝马</li>
         <li>雷克萨斯</li>
       </ul>
     </div>
js:
      methods:{
    open: function (){
      var car = document.getElementById('car');
      console.log(car.firstChild.innerHTML);
      //输出奥迪
    }
  },

4、lastChild

- 属性,表示当前节点的最后一个子节点
html:
        <div>
      <button @click="open">按钮</button>
      <ul id="car">
        <li>奥迪</li>
        <li>迈巴赫</li>
        <li>宝马</li>
        <li>雷克萨斯</li>
      </ul>
    </div>
js:
     methods:{
   open: function (){
     var car = document.getElementById('car');
     console.log(car.lastChild.innerHTML);
     //输出雷克萨斯
   }
 },

5、children

- 属性,可以获取当前元素的所有子元素

也可以直接children[index]得到当前元素的第index个子元素

注意:得到的是一个HTMLCollection.

html:
        <div>
      <button @click="open">按钮</button>
      <ul id="car">
        <li>奥迪</li>
        <li>迈巴赫</li>
        <li>宝马</li>
        <li>雷克萨斯</li>
      </ul>
    </div>
js:
     methods:{
   open: function (){
     var car = document.getElementById('car');
     var car2 = car.children;
     console.log(car2);
     car2.forEach((item,index)=>{
       console.log(item.innerHTML);
     })
     
   }
 },

获取父节点和兄弟节点

  • 通过具体的元素节点调用

1、parentNode

- 属性,表示当前节点的父节点
html:
     <div>
       <button @click="open">按钮</button>
       <ul id="car">
         <li>奥迪</li>
         <li>迈巴赫</li>
         <li>宝马</li>
         <li>雷克萨斯</li>
       </ul>
     </div>
js:
      methods:{
   
    open: function (){
      var car = document.getElementById('car');
      //父节点
      console.log(car.parentNode);
      console.log(car.parentNode.innerHTML);
      console.log(car.parentNode.innerText);
    }
  },

2、previousSibling

- 属性,表示当前节点的前一个兄弟节点

3、nextSibling

- 属性,表示当前节点的后一个兄弟节点

注意:1.previousSibling和nextSibling也可能获取到空白文本

2.previousElementSibling和nextElementSibling获取前一个兄弟元素是获取不到空格文本的(ie8以下是不支持的)

previousSibling和nextSibling示例:
html:
    <div>
       <button @click="open">按钮</button>
       <ul id="car">
         <li id="aodi">奥迪</li>
         <li id="miabahe">迈巴赫</li>
         <li id="baoma">宝马</li>
         <li id="leikeshas">雷克萨斯</li>
       </ul>
     </div>
js:
  methods:{
    open: function (){
      var car = document.getElementById('car');
      var baoma = car.children[2];
      //baoma的前一个兄弟节点----迈巴赫
      console.log(baoma.previousSibling);
      //baoma的后一个兄弟节点----雷克萨斯
      console.log(baoma.nextSibling);
    }
  },

获取DOM的其他方法

1、获取body元素两种方法

一、var body = document.body
//document中有body属性,保存的是body的引用
二、var body = document.getElementByTagName('body')
//通过标签名拿到body

2、获取整个html

方法一:

js:
    var html = document.documentElement;

方法二:

js:
    var all = document.all;
    console.log(all);//整个html元素
    console.log(all.length);//html元素的个数
    console.log(typeof all);//undfined
    all.forEach((item,index)=>{
        console.log(item);
    })

方法三:

var all = document.getElementByTagName('*')

3、根据元素的class属性值查询一组元素节点对象

注意:ie9以上才支持

    //获取所有class名字为box1的元素
var box1 = document.getElementByClassName('box1')

4、根据一个CSS选择器来查询元素节点对象,需要一个选择器的字符串作为参数

语法:

var div = document.querySelector('.box div')

注意:

1、使用该方法总会返回唯一的一个元素,如果满足条件的元素有多个,那么他只会返回第一个元素;

2、虽然ie8中没有getElementByClassName(''),但是可以使用querySelector('')。

  • 对于CSS有多个元素,则使用querySelectAll('')

该方法和querySelector('')一样,不同的是,querySelectAll('')它会将符合条件的元素封装到一个数组中返回即使符合条件的元素只有一个,也会封装成数组返回。

语法:

var div = document.querySelectorAll('.box div')
//获取多个CSS样式名为.box div的元素
//兼容ie8以上

DOM增删改

1、创建元素节点

//创建一个li元素节点对象
//他需要一个标签名作为参数,将根据标签名创建一个元素节点对象,并将创建好的对象作为返回值返回
var li = document.createElement('li');

2、创建文本节点

//创建一个文本节点对象
//他需要一个文本内容作为参数,将根据该内容创建文本节点,并将新的节点返回
var texts = document.createTextNode('我是文本节点');

3、将2中的文本节点插入到1中的元素节点,作为子节点

向一个父节点中添加一个新的子节点

用法:父节点.appendChild('子节点')

li.appendChild(texts);
1、2、3处代码!!

方法一:

html:
     <div>
       <button @click="creates">按钮</button>
       <ul id="car">
         <li id="aodi">奥迪</li>
         <li id="miabahe">迈巴赫</li>
         <li id="baoma">宝马</li>
         <li id="leikeshas">雷克萨斯</li>
       </ul>
     </div>
js:
    methods:{
    creates: function () {
      var li = document.createElement('li');
      var cars = document.createTextNode('迈凯伦');
      li.appendChild(cars);
      var car = document.getElementById('car');
      car.appendChild(li);
    }
}

方法二:

html:
     <div>
       <button @click="creates">按钮</button>
       <ul id="car">
         <li id="aodi">奥迪</li>
         <li id="miabahe">迈巴赫</li>
         <li id="baoma">宝马</li>
         <li id="leikeshas">雷克萨斯</li>
       </ul>
     </div>
js:
methods:{
    creates :function() {
       var car = document.getElementById('car');
      //innerHTM=''是将之前的元素给替换了
      //innerHTML += ''是将原来的元素给删了,然后重新创建原来的元素本加上新加的元素
      //若原有的元素绑定了事件将会失效
      car.innerHTML += '<li>保时捷</li>'
    }
    },

方法三:结合方法一和方法二来的

html:
     <div>
       <button @click="creates">按钮</button>
       <ul id="car">
         <li id="aodi">奥迪</li>
         <li id="miabahe">迈巴赫</li>
         <li id="baoma">宝马</li>
         <li id="leikeshas">雷克萨斯</li>
       </ul>
     </div>
js:
methods:{
    creates: function () {
      //新建li节点
      var li = document.createElement('li');
      //向li节点中插入文本节点
      li.innerHTML = '<li>保时捷</li>'
      var car = document.getElementById('car');
      //把li节点插入到父节点ul里面
      car.appendChild(li);
    },
    },

4、在指定的子节点前面插入新的子节点

语法:父节点.insertBefore(新节点变量名,旧节点变量名);

html:
     <div>
       <button @click="creates">按钮</button>
       <ul id="car">
         <li id="aodi">奥迪</li>
         <li id="miabahe">迈巴赫</li>
         <li id="baoma">宝马</li>
         <li id="leikeshas">雷克萨斯</li>
       </ul>
     </div>
js:
    methods:{
        creates: function () {
      //新建li元素节点
      var li  = document.createElement('li');
      //新建cars文本节点
      var cars = document.createTextNode('奔驰');
      //把cars文本节点设置为li元素节点的子节点
      li.appendChild(cars);
      var car = document.getElementById('car');
      var baoma = document.getElementById('baoma');
      //把li节点插入到id='baoma'的子节点之前
      car.insertBefore(li,baoma);
    },
}

5、替换子节点:
语法:父节点.replaceChild(新节点变量名,旧节点变量名);

html:
     <div>
       <button @click="creates">按钮</button>
       <ul id="car">
         <li id="aodi">奥迪</li>
         <li id="miabahe">迈巴赫</li>
         <li id="baoma">宝马</li>
         <li id="leikeshas">雷克萨斯</li>
       </ul>
     </div>
js:
    methods:{
        creates: function () {
      //新建li元素节点
      var li  = document.createElement('li');
      //新建cars文本节点
      var cars = document.createTextNode('奔驰');
      //把cars文本节点设置为li元素节点的子节点
      li.appendChild(cars);
      var car = document.getElementById('car');
      var baoma = document.getElementById('baoma');
      //把li节点替换id='baoma'的子节点
      car.replaceChild(li,baoma);
    },
}

6、删除子节点:

语法:父节点.removeChild(子节点)

html:
     <div>
       <button @click="creates">按钮</button>
       <ul id="car">
         <li id="aodi">奥迪</li>
         <li id="miabahe">迈巴赫</li>
         <li id="baoma">宝马</li>
         <li id="leikeshas">雷克萨斯</li>
       </ul>
     </div>
js:
    methods:{
    //获取父节点ul
      var car = document.getElementById('car');
      //获取需要删除的子节点
      var baoma = document.getElementById('baoma');
      //删除id='baoma'的子节点
      car.removeChild(baoma);
    },
}

js优化:

    methods:{
      //获取需要删除的子节点
      var baoma = document.getElementById('baoma');
      //删除id='baoma'的子节点
      //子节点.parentNode.removeChild(子节点)
      baoma.parentNode.removeChild(baoma);
    },
}

7、读取节点内的HTML代码:

-属性,节点.innerHTML
html:
     <div>
       <button @click="creates">按钮</button>
       <ul id="car">
         <li id="aodi">奥迪</li>
         <li id="miabahe">迈巴赫</li>
         <li id="baoma">宝马</li>
         <li id="leikeshas">雷克萨斯</li>
       </ul>
     </div>
js:
    methods:{
      var car = document.getElementById('car');
      alert(car.innerHTML);
    },
}

8、设置节点内的HTML代码:

-属性,节点.innerHTML = '文本内容'
html:
     <div>
       <button @click="creates">按钮</button>
       <ul id="car">
         <li id="aodi">奥迪</li>
         <li id="miabahe">迈巴赫</li>
         <li id="baoma">宝马</li>
         <li id="leikeshas">雷克萨斯</li>
       </ul>
     </div>
js:
    methods:{
      var baoma = document.getElementById('baoma');
      baoma.innerHTML = '保时捷';
    },
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容