DOM

DOM

1.什么是DOM

1)DOM --> Document Object Model(文档对象模型)
2)DOM 定义了表示和修改文档所需的方法(对象、这些对象的行为和属性以及这些对象之间的关系。)
DOM 对象即为宿主对象,由浏览器厂商定义,用来操作htmlxml功能的一类对象的集合。
也有人称 DOM 是对 HTML 以及 XML 的标准编程接口。
xml --> xhtml --> html
xml 是最早的版本,xml 里面的标签是可以自定义的,不过标签无实际含义
注意:dom 不能改变 css 样式表,可以间接改变行间样式的 css

2.DOM基本操作(大部分都是类数组)

1)方法类操作
查看元素节点

document 代表整个文档(如果给 html 标签上面再套一层标签就是 document)

document.getElementById()

元素 id 在 Ie8 以下的浏览器,不区分 id 大小写,而且也返回匹配 name 属性的元素,
通过 id 标识我们来选择这个元素,一 一对应
eg:

<div name="only">123</div>
<script>
var div = document.getElementById('only');
</script>
getElementsByTagName()

标签名,这是一个类数组
eg:把页面里所有的div选出来

<div id="only"></div>
    <script>
        var div = document.getElementsByTagName('div')
    </script>

选择第一个 p 的方式:

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

IE 不支持需注意,只有部分标签 name 可生效(表单,表单
元素,img,iframe),不是在所有的浏览器都能用——开发一般不用

querySelector()querySelectorAll()

querySelector():css 选择器,只能选一个,在 ie7 和 ie7 以下的版本中没有
querySelectorAll():css 选择器,全选,选一组,在 ie7 和 ie7 以下的版本中没有
querySelectorAll()和.querySelector()选出来的元素不是实时的(是静态的)

2)非方法类操作
遍历节点树(不常用)

parentNode → 父节点 (最顶端的 parentNode 为#document);
childNodes → 子节点们(直接的节点数)节点包括文本节点,属性节点
firstChild → 第一个子节点
lastChild → 最后一个子节点
nextSibling →后一个兄弟节点
previousSibling → 前一个兄弟节点

节点的类型

后面的数字是调用 nodeType 返回的数字
元素节点 —— 1
属性节点 —— 2 (基本没用,)
文本节点 —— 3
注释节点 —— 8
document —— 9
DocumentFragment —— 11

基于元素节点树的遍历(不含文本节点)

parentElement -> 返回当前元素的父元素节点 (IE 不兼容)
children -> 只返回当前元素的元素子节点
eg:

    <div>
        123
        <strong></strong>
        <span></span>
    </div>
    <script>
        var div = document.getElementsByTagName('div')[0];
    </script>
    控制台:
    div.children
    ->[strong,span]

node.childElementCount === node.children.length 当前元素节点的子元素节点个数(IE 不兼容)——基本不用,因为与 length 相等

firstElementChild -> 返回的是第一个元素节点(IE 不兼容)
lastElementChild -> 返回的是最后一个元素节点(IE 不兼容)

nextElementSibling / previousElementSibling ->返回后一个/前一个兄弟元素节点
(IE 不兼容)

每一个节点的四个属性

a.nodeName
元素的标签名,以大写形式表示,只读,不能写
b.nodeValue
Text 文本节点或 Comment 注释节点的文本内容,可读写
c.nodeType
该节点的类型,只读返回这个标签的所有的元素节点(具体数字上面节点类型已经说明)
d.attributes
Element 节点的属性集合

节点的一个方法:
Node.hasChildNodes()——用于判断括号里有没有子节点,返回值是 true 或 false

3)增,插入,删,替换

增:
document.createElement() 增加或创建元素节点(标签)
插入:
PARENTNODE.appendChild()
删:
第一种方式:
parent.removeChild() 被剪切出来了
第二种方式:
child.remove() 完全删除
替换:
parent.replaceChild(new, origin) 用新的 new 去置换旧的 origin

3.DOM接口

dom 结构树代表的是一系列继承关系
在这里插入图片描述

document 继承自 HTMLDocument.prototype。
HTMLDocument.prototype 继承自 Document.prototype

HTMLDocument.prototype 定义了一些常用的属性
eg:body,head,分别指代 HTML 文档中的"body,head"标签。
在这里插入图片描述
Document.prototype上定义了 documentElement 属性,指代文档的根元素,在 HTML文档中,他总是指代html元素
在这里插入图片描述

4.定时器

介绍定时器之前,先对如何获取时间方式进行了解:
var date = new Date()大写的 Date 是系统提供的一个构造函数,通过 new Date 的方法会给我们返回一个对象,这个对象就是一个日期对象。日期对象有很多属性和方法。小的 date 代表此时此刻的时间。用小的 date 调用方法,如 date.getDate( )
在这里插入图片描述
在这里插入图片描述

1)setInterval()

注意
setInterval(“func()”,1000) 定时循环器
意思是每1000毫秒执行一次这个函数
如果先定义 1000 毫秒,在后面改成 2000 毫秒,程序仍按 1000 毫秒执行,因为他只识别一次,不能通过改变 time 改变 setInterval 的快慢

注意setInterval()是 window的方法,在全局上就算不写 window. setInterval();他也会上全局的 GO 里面查找,所以不写 window.也行。
每一个 setInterval();都会返回一个一个数字,作为唯一的标识,有唯一标识就可以把他清除掉(利用 clearInerval 清除)

2)clearInterval()

能让 setInterval 停止
一般写了 setInterval 就要写 clearInterval

        var i = 0;
        var timer = setInterval(function () {
            console.log(i++);
            if (i > 10) {
                clearInterval(timer);
            }
        }, 10);

在这里插入图片描述

3)setTimeout();

隔了一段时间后再执行(起推迟作用),并且只执行一次
可以运用在动画试看期,然后停止

4)clearTimeout();

清除 setTimeout();让他停止执行
例:这种写法,setTimeout();还没执行就被清除了,就执行不了

        var timer = setTimeout(function () {
            console.log('a');
        }, 1000);
        clearTimeout(timer);

setInterval();setTimeout();clearInterval();clearTimeout();这四个都是全局对象,都是window 上的方法,内部函数 this 指向 window

5.事件(所有事件都是用的小写)

1) 何为事件

就是一个动作,没效果也是事件

重要性:
他是交互体验的核心功能,交互是你对页面做出操作,页面给一个反馈

2)如何绑定事件
ele.onxxx = function (event) {}

兼容性很好,但是一个元素只能绑定一个事件处理程序

ele.addEventListener(type, fn, false);里面可以填三个参数

IE9 以下不兼容,可以为一个事件绑定多个处理程序
事件有一个事件监听机制:
eg:

    <div style="width: 100px;height: 100px;background-color: skyblue;"></div>
    <script>
        var div = document.getElementsByTagName('div')[0];

        div.addEventListener('click', function () {
            console.log('a');
        }, false);

        div.addEventListener('click', function () {
            console.log('b');
        }, false);
    </script>

当点击后在控制台显示a,b;
若 console.log 两个都是(‘a‘)打印出来是两个 a。这是两个处理函数,是两个地址
若改成这样,则为一个a;因为是一个地址

    <div style="width: 100px;height: 100px;background-color: skyblue;"></div>
    <script>
        var div = document.getElementsByTagName('div')[0];
        var div = document.getElementsByTagName('div')[0];
        
        div.addEventListener('click',test,false);
        function() {
            console.log('a');
        }
    </script>

注意:
ele.addEventListener 不能给同一个函数绑定多次,重复的绑定一个函数就不能正常使用

ele.attachEvent(‘on’ + type, fn);

IE 独有,一个事件同样可以绑定多个处理程序,同一个函数绑定多次都可以
例如:
div.attachEvent(‘on’ + 事件类型,处理函数);
div.attachEvent(‘onclick’ ,function(){});

3)事件处理程序的运行环境

ele.onxxx = function (event) {}
程序 this 指向是 dom 元素本身(指向自己)
eg:

    <div style="width: 100px;height: 100px;background-color: skyblue;"></div>
    <script>
        var div = document.getElementsByTagName('div')[0];

        div.onclick = function () {
            console.log(this);
        }
    </script>

obj.addEventListener(type, fn, false);
程序 this 指向是 dom 元素本身(指向自己)
eg:

    <div style="width: 100px;height: 100px;background-color: skyblue;"></div>
    <script>
        var div = document.getElementsByTagName('div')[0];

        div.addEventListener('click', function () {
            console.log('this');
        }, false);
    </script>

obj.attachEvent(‘on’ + type, fn);
程序 this 指向 window

4)解除事件处理程序

ele.onclick = false/‘’/null; --> 解除 ele.onxxx = function (event) {}
ele.removeEventListener(type, fn, false);–>解除 addEventListener(type, fn, false)
ele.detachEvent(‘on’ + type, fn); --> obj.attachEvent(‘on’ + type, fn);
注:若绑定匿名函数,则无法解除

5)事件处理模型 — 事件冒泡、捕获

注意:事件冒泡、捕获不能同时存在

事件冒泡:

结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒泡向父元素。(自底向上)

事件捕获:(只有谷歌有,最新火狐有):

结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子元素(事件源元素)。(自底向上)

obj.addEventListener(type, fn, true);第三个参数为 true 就是事件捕获

触发顺序,先捕获,后冒泡

同一个对象的一个事件处理类型,上面绑定了两个事件处理,分别执行事件冒泡和事件执行

注意:focus,blur,change,submit,reset,select 等事件不冒泡

取消冒泡以及阻止默认事件
取消冒泡

a. W3C 标准 event.stopPropagation();但不支持 ie9 以下版本
b. event.cancelBubble = true;

阻止默认事件

默认事件 — 表单提交,a 标签跳转,右键菜单等

a. return false;
兼容性非常好,以对象属性的方式注册的事件才生效
eg:

    <div class="wrapper"></div>
    <script>
        document.oncontextmenu = function () {
            console.log('a');
            return false;
        }
    </script>

b. event.preventDefault();
W3C 标注,IE9 以下不兼容
eg:

    <div class="wrapper"></div>
    <script>
        document.oncontextmenu = function (e) {
            console.log('a');
            e.preventDefault();
        }
    </script>

c. event.returnValue = false;
兼容 IE
eg:

    <div class="wrapper"></div>
    <script>
        document.oncontextmenu = function (e) {
            console.log('a');
            e.returnValue = false;
        }
    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值