WebAPI DOM文档对象模型

DOM(文档对象模型)

是一个可以改变网页内容、结构、样式的处理可扩展标记语言的接口

一、获取元素

方法:

1、根据ID获取

2、根据标签名获取

3、根据类名获取 (html5新增)

4、querySelector获取 (html5新增)

5、querySelectorAll获取 (html5新增)

6、获取特殊元素(body、html)

ID获取方法

document.getElementById();

  <div id="time">2019-9-9</div>
    <script>
        var time = document.getElementById("time");
        console.log(time);// <div id="time">2019-9-9</div>
        console.log(typeof time); // object
        console.dir(time); //
    </script>

注意:id是大小写敏感的字符串

console.dir() 打印我们返回的元素对象,更好的查看里面的元素对象。

标签名获取:

document.getElementByTagName();

 var lis = document.getElementsByTagName('li')
        console.log(lis);
        console.log(lis[0]);
        for(var i = 0;i < lis.length; i++) {
            console.log(lis[i]);
        }
        
        var ol = document.getElementsByTagName("ol");
        var lis = ol[0].getElementsByTagName("li")  //注意:一定是ol[0]
        console.log(lis);

element.getElementByTagName('标签名') // 给其父元素设置一个ID名

父元素必须是单个对象,获取时不包括父元素自

注意:

1、返回的是,获取过来对象的集合,以伪数组的形式存储的

2、若要依次打印里面元素,可通过遍历的方式

3、若里面只有一个元素,返回还是伪数组的形式

4、若页面没有这个元素,返回空的伪数组

根据类名获取

document.getElementsByClassName()

var boxs = document.getElementsByClassName('box');

注意事项与标签名类似

querySelector获取

document.querySelector('选择器') 返回指定选择器的第一个元素对象

var firstBox = document.querySelector('.box');
var nav = document.querySelector('#nav');
var li = document.querySelector('li');

querySelectorAll获取

document.querySelectorAll('选择器');返回指定选择器的所有元素对象集合

var allBox = document.querySelectorAll('.box');

获取特殊元素(body、html)

获取body 获取html

document.body document.documentElement

二、事件基础

组成:

1、事件源(事件被触发的对象)

2、事件类型(触发的事件类型,例如点击事件[click])

3、事件处理程序(通过一个函数赋值的方式完成)

     var button = document.querySelector('.btn') // 获取事件源
        button.onclick = function() { //  添加点击事件
            alert('姐姐生日快乐') // 事件处理后的结果
        }

执行步骤

1、获取事件源

2、注册事件(绑定事件)

3、添加事件处理程序(采取函数赋值的形式)

三、操作元素

操作元素-改变元素内容

elelment.innerHTML  //起始位置到终止位置的全部内容,包括html标签,保留空格和换行
elelment.innerText  //起始位置到终止位置的内容,单去除html标签,去掉空格和换行
 var btn = document.querySelector('button');
        var div = document.querySelector('div');
        var p = document.querySelector('p')//获取事件源
        btn.onclick = function() { // 添加点击事件
            div.innerHTML = nowTime();  // 事件处理程序,调用下面的获取时间函数
        }
        p.innerHTML = nowTime();
        function nowTime() {
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var dates =date.getDate();
        var arr = ['星期天','星期一','星期二','星期三','星期四','星期五','星期六'];
        var day = date.getDay();
        
        var h = date.getHours();
        h < 10 ? '0' + h : h;
        var m = date.getMinutes();
        m < 10 ? '0' + m : m;
        var s = date.getSeconds();
        s < 10 ? '0' + s : s;
     
        return '今天是'+year+'年'+month+'月'+dates+'日'+arr[day]+' ' +h + ':' + m + ':' + s;
        }

常见的鼠标事件

WebAPI DOM文档对象模型

操作元素-修改元素属性

 

1、innerText、innerHTML 改变元素内容

2、src、href

3、id、alt、title

 <button id="ldh">刘德华</button>
    <button id="zxy">张学友</button> <br>
    <img src="../2-案例/images/ldh.jpg" alt="" title="刘德华">
    <script>
        var ldh = document.querySelector('#ldh');
        var zxy = document.querySelector('#zxy');
        var img = document.querySelector('img')
        zxy.onclick = function() {
            img.src = '../2-案例/images/zxy.jpg';
            img.title = '张学友';
        }
        ldh.onclick = function() {
            img.src = '../2-案例/images/ldh.jpg';
            img.title = '刘德华';
        }

表单元素的操作属性

type、value、checked、selected、disabled(禁用)

<button>按钮</button>
    <input type="text" value="输入内容">
    <script>
        var btn = document.querySelector('button');
        var input = document.querySelector('input');
         btn.onclick = function() {
             input.value = '点死我吧';
             this.disabled = true;
         }
    </script>

flag的使用

经典案例(仿京东密码框)

   var img = document.querySelector('img');
            var input = document.querySelector('input');
            var flag = 0;
             img.onclick = function () {
                 if(flag == 0) {
                    this.src = '../2-案例/images/open.png'
                    input.type = 'text';
                    // flag = 1;
                    flag = !flag;
                 } else { 
                    this.src = '../2-案例/images/close.png'
                    input.type = 'password';
                    // flag = 0;
                    flag = !flag;
                 }
             }

样式属性操作 (大小、颜色、位置等)

1、element.style 行内样式操作

2、element.className 类名样式操作

  this.style.backgroundColor = 'purple';
  this.style.width = '250px';

如果样式修改较多,可以采用操作类名的方式更改元素样式。

class是个保留字,因此使用className来操作元素类名属性。

className 会直接更改元素类名,会覆盖原先的类名(如果需要即保留之前的类名,有要添加新的类名,可以使用多类名的方法)

注意:

JS里面的样式采取驼峰命名法

JS修改style样式操作,产生的是行内样式,css权重较高

排它思想:

1、所有元素清除样式

2、给当前(this)添加样式

    <button>按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <button>按钮4</button>
    <button>按钮5</button>
    <script>
        // 1. 获取所有按钮元素
        var btns = document.getElementsByTagName('button');
        // btns得到的是伪数组  里面的每一个元素 btns[i]
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function() {
                // (1) 我们先把所有的按钮背景颜色去掉  干掉所有人
                for (var i = 0; i < btns.length; i++) {
                    btns[i].style.backgroundColor = '';
                }
                // (2) 然后才让当前的元素背景颜色为pink 留下我自己
                this.style.backgroundColor = 'pink';
​
            }
        }
    </script>

经典案例(全选反选)

  var j_cbAll = document.getElementById('j_cbAll'); 
        var j_tbs = document.getElementById('j_tb').getElementsByTagName('input'); //所有复选框
        j_cbAll.onclick = function() {
                console.log(this.checked);
                for (var i = 0; i < j_tbs.length; i++) {
                    j_tbs[i].checked = this.checked;
                }
            }
            // 2. 下面复选框需要全部选中, 上面全选才能选中做法
        for (var i = 0; i < j_tbs.length; i++) {
            j_tbs[i].onclick = function() {
                // flag 控制全选按钮是否选中
                var flag = true;
                // 每次点击下面的复选框都要循环检查者4个小按钮是否全被选中
                for (var i = 0; i < j_tbs.length; i++) {
                    if (!j_tbs[i].checked) {
                        flag = false;
                        break; 
                    }
                }
                j_cbAll.checked = flag;
            }
        }

自定义属性操作

获取元素属性值:

 element.属性  获取属性值
 elelment.getAttribute('属性')

区别:element.属性 获取内置属性值(元素自身自带的属性)

elelment.getAttribute('属性'); 主要获得自定义属性(标准),我们程序员自己定义的属性。

设置元素属性值

elelment.属性 ='值';   // 设置内置属性值
​
elelment.setAttribute('属性','值'); // 主要设置自定义的属性

class特殊之处,删除直接使用class,而不是className

div.setAttribute('class','footer')

移除属性

element.removeAttribute('属性')

H5自定义属性

h5规定自定义属性data-开头作为属性名并且赋值

<div data-index = "1"> </div>
element.setAttribute('data-index',2)

获取h5自定义属性

兼容性获取:element.getAttribute('data-index')   //  主要使用这个
​
h5新增 element.datase.index  或者  element.dataset['index']   ie11以上支持

节点概述

一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

元素节点 nodeType 为 1 (主要操作元素节点)

属性节点 nodeType 为 2

文本节点 nodeType 为 3

节点层级

父子兄层级关系

1、父级节点 (parentNode)

得到的时离元素最近的父级节点 (亲爹),若找不到则返回null

2、子级节点

childNodes (可不记)

children (常用的!!!)

获取所有的子元素节点

3、获取第一个和最后一个子元素

第一个子元素:firstElementChild 最后一个子元素:lastElementChild (兼容性问题)

第一个子元素:children[o](没有兼容性问题)

最后一个子元素:children[ol.children.length - 1]

4、兄弟节点

nextSibling 返回下一个兄弟节点(包含文本节点等)

nextElementSibling 返回下一个兄弟元素节点

previousSibling 返回上一个兄弟节点(包含文本节点等)

previousElementSibling 返回上一个兄弟元素节点 (有兼容问题!!!)

5、创建节点 (动态创建元素节点)

 var li = document.createElement('li')

createElement('添加的元素')

6、添加节点

appendChild(child)

 ul.appendChild(li);

将一个节点添加到指定父节点的末尾

insertBefore(child,指定元素)

ul.insertBefore(lili,ul.children[0])

添加到指定元素前面

7、节点操作-删除节点

node.removeChild(child)

留言板案例:

  <script>
        var btn = document.querySelector('button');
        var text = document.querySelector('textarea');
        var ul = document.querySelector('ul');
        btn.onclick = function(){
            if(text.value == '') {
                return false;
            }
            var li = document.createElement('li')
            li.innerHTML = text.value + "<a href = 'javascript:;'>删除</a>";
            ul.insertBefore(li,ul.children[0])
            //删除操作
            var as = document.querySelectorAll('a');
            for(var i = 0; i < as.length; i++) {
                as[i].onclick = function(){
                    ul.removeChild(this.parentNode)
                }
            }
        }
    </script>

节点操作-复制节点

node.cloneNode()

 var lili = ul.children[0].cloneNode(true);

1、若括号为空,或参数为false,则为浅拷贝,只复制里面的标签,不复制内容

2、若括号参数为true,则为深拷贝,既复制标签,也复制内容。

动态生成表格案例(重要)

 var tbody = document.querySelector('tbody');
        var data = [
            {
            name: '薛亚岗',
            subject: 'JavaScript',
            score: 100
            },  {
            name: '薛亚岗',
            subject: 'JavaScript',
            score: 100
            },  {
            name: '薛亚岗',
            subject: 'JavaScript',
            score: 100
            }
        ];
        for(var i = 0;i < data.length; i++){
            //  创建tr
            var trs = document.createElement('tr');
            tbody.appendChild(trs);
            //  创建td
            for(var k in data[i]) {
                var tds = document.createElement('td');
                tds.innerHTML = data[i][k];
                trs.appendChild(tds);
            }
            //  创建td包含的删除栏
            var btn = document.createElement('td');
            btn.innerHTML = '<a href = "javascript:;">删除</a>'
            trs.appendChild(btn);
        }
            //  点击删除事件
        var as = document.querySelectorAll('a');
        for(var i = 0; i < as.length; i++) {
            as[i].onclick = function(){
                tbody.removeChild(this.parentNode.parentNode)
            }
        }

注意:数组中可以放对象。

三种动态创建元素的方式

1、document.write()// 一般不用

document.write('<div></div>')

2、innerHTML 创建元素

3、document.createElement()

区别:

1、document.write 时直接将内容写入页面的内容流,但是文档流执行完毕,会导致页面重绘。

2、innerHTML 时将内容写入某个DOM节点,不会导致页面全部重绘

3、innerHTML创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂

4、creatElement()创建多个元素效率稍微低一点点,但是结构更清晰。

上一篇:getEventListeners,monitorEvents,unmonitorEvents


下一篇:本地存储 sessionStorage / localStorage 使用及区别