JavaScript基础(2)

JavaScript基础(2)

学习目标:

熟悉web API 常用的方法(DOM),理解注册事件和操作事件的流程。

学习内容:

一、DOM基础

1.DOM简介

(1)文档对象模型(Document Object Model,简称 DOM),是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口;W3C 已经定义了一系列的 DOM 接口,通过这些 DOM 接口可以改变网页的内容、结构和样式。

(2)DOM 树
在这里插入图片描述
文档:一个页面就是一个文档,DOM 中使用 document 表示;
元素:页面中的所有标签都是元素,DOM 中使用 element 表示;
节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM 中使用 node 表示;
以上内容均可看做对象

2.获取元素

(1)如何获取页面元素

  • 根据 ID 获取
  • 根据标签名获取
  • 通过 HTML5 新增的方法获取
  • 特殊元素获取
//使用 getElementById() 方法可以获取带有 ID 的元素
	document.getElementById('id');
//使用 getElementsByTagName() 方法可以返回带有指定标签名的对象的集合
document.getElementsByTagName('标签名');
document.getElementsByClassName(‘类名’)// 根据类名返回元素对象集合
document.querySelector('选择器'); // 根据指定选择器返回第一个元素对象
document.querySelectorAll('选择器'); // 根据指定选择器返回

获取特殊元素(body,html)

doucumnet.body // 返回body元素对象
document.documentElement // 返回html元素对象
3.事件基础

(1)事件概述
JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为;简单理解来说,就是触发–响应机制;网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。
(2)事件三要素

  • 事件源
  • 事件类型
  • 事件处理程序
<button id='123'>按钮</button>//事件源
    <script>
        var btn = document.getElementById('123');//获取事件源
        btn.onclick = function() { //事件类型
            alert('are you ok?'); //事件处理程序
        }
    </script>

(3)执行事件的步骤

  1. 获取事件源
  2. 注册事件(绑定事件)
  3. 添加事件处理程序(采取函数赋值形式)

常见的鼠标事件:

鼠标事件触发条件
click鼠标点击左键触发
mouseover鼠标经过触发
mouseout鼠标离开触发
focus获得鼠标焦点触发
blur失去鼠标焦点触发
mousemove鼠标移动触发
mouseup鼠标弹起触发
mousedown鼠标按下触发
4.操作元素

JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容 、属性等;注意以下都是属性。
(1)改变元素内容

element.innerText

从起始位置到终止位置的内容, 但它去除 html 标签, 同时空格和换行也会

element.innerHTML

起始位置到终止位置的全部内容,包括 html 标签,同时保留空格和换行

(2)常用元素的属性操作

innerText、innerHTML 改变元素内容;src、href;id、alt、title

(3)表单元素的属性操作

利用 DOM 可以操作如下表单元素的属性:
typevaluecheckedselecteddisabled

(4)样式属性操作

我们可以通过 JS 修改元素的大小、颜色、位置等样式;

element.style     //行内样式操作
element.className //类名样式操作

(5)排他思想

如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:

  1. 所有元素全部清除样式(干掉其他人)
  2. 给当前元素设置样式 (留下我自己)
  3. 注意顺序不能颠倒,首先干掉其他人,再设置自己

(6)自定义属性的操作

//1.获取属性值
element.属性 
element.getAttribute('属性');
//2.设置属性值
element.属性 = '值'
element.setAttribute('属性','值');
//3.移除属性
element.removeAttribute('属性');
5.节点操作

获取元素通常使用两种方式:
1.利用 DOM 提供的方法获取元素
document.getElementById() ;
document.getElementsByTagName();
document.querySelector 等;
逻辑性不强、繁琐;
2.利用节点层级关系获取元素
利用父子兄节点关系获取元素;
逻辑性强;

(1)节点概述

网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示;HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。
在这里插入图片描述
一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

(2)节点层级

利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。

父级节点

node.parentNode
//parentNode 属性可返回某节点的父节点,注意是最近的一个父节点
//如果指定的节点没有父节点则返回 null 

子节点

parentNode.childNodes
//返回包含指定节点的子节点的集合,该集合为即时更新的集合
parentNode.firstChild
//返回第一个子节点,找不到则返回null。同样,也是包含所有的节点
parentNode.lastChild 
//返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点
parentNode.firstElementChild
//返回第一个子元素节点,找不到则返回null
parentNode.lastElementChild
//返回最后一个子元素节点,找不到则返回null

兄弟节点

node.nextSibling
//返回当前元素的下一个兄弟元素节点,找不到则返回null。同样,也是包含所有的节点
node.previousSibling 
//返回当前元素上一个兄弟元素节点,找不到则返回null。同样,也是包含所有的节点
node.nextElementSibling 
//返回当前元素下一个兄弟元素节点,找不到则返回null
node.previousElementSibling
//返回当前元素上一个兄弟节点,找不到则返回null

(3)创建节点

document.createElement('tagName')

创建由 tagName 指定的 HTML 元素。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点。

(4)添加节点

node.appendChild(child)
//将一个节点添加到指定父节点的子节点列表末尾。类似于 CSS 里面的after 伪元素
node.insertBefore(child, 指定元素)
//将一个节点添加到父节点的指定子节点前面。类似于 CSS 里面的before伪元素

(5)删除节点

node.removeChild(child) 
//从 DOM 中删除一个子节点,返回删除的节点

(6)复制节点

 node.cloneNode()
 //返回调用该方法的节点的一个副本。 也称为克隆节点/拷贝节点

PS:

  • 如果括号参数为空或者为 false ,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
  • 如果括号参数为 true ,则是深度拷贝,会复制节点本身以及里面所有的子节点。

二、DOM进阶

1.注册(绑定)事件

(1)概述

给元素添加事件,称为注册事件或者绑定事件;
注册事件有两种方式:传统方式和方法监听注册方式。

传统注册方式

  • 利用 on 开头的事件 onclick
  • <button οnclick=“alert(‘hi~’)”>
  • btn.onclick = function() {}
  • 特点: 注册事件的唯一性
  • 同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数

方法监听注册方式

  • w3c 标准 推荐方式
  • addEventListener() 它是一个方法
  • IE9 之前的 IE 不支持此方法,可使用 attachEvent() 代替
  • 同一个元素同一个事件可以注册多个监听器
  • 按注册顺序依次执行

(2)addEventListener 事件监听方式

 eventTarget.addEventListener(type, listener[, useCapture])
 //type:事件类型字符串,比如 click 、mouseover ,注意这里不要带on;
 //listener:事件处理函数,事件发生时,会调用该监听函数;
 //useCapture:可选参数,是一个布尔值,默认是 false;

将指定的监听器注册到 eventTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数;

(3)attachEvent 事件监听方式

 eventTarget.attachEvent(eventNameWithOn, callback) 
 //eventNameWithOn:事件类型字符串,比如 onclick 、onmouseover ,这里要带on;
 //callback: 事件处理函数,当目标触发事件时回调函数被调用;

将指定的监听器注册到 eventTarget(目标对象) 上,当该对象触发指定的事件时,指定的回调函数就会被执行;

(4)注册事件兼容性解决方案

 function addEventListener(element, eventName, fn) {
 // 判断当前浏览器是否支持 addEventListener 方法
 if (element.addEventListener) {
 element.addEventListener(eventName, fn); // 第三个参数 默认是false
 } else if (element.attachEvent) {
 element.attachEvent('on' + eventName, fn);
 } else {
 // 相当于 element.onclick = fn;
 element['on' + eventName] = fn;
 } 
2.删除(解绑)事件

(1)删除事件的方式

eventTarget.onclick = null;
//传统注册方式
eventTarget.removeEventListener(type, listener[, useCapture]);
//方法监听注册方式
3.DOM事件流

事件流描述的是从页面中接收事件的顺序;事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即 DOM 事件流

DOM 事件流分为3个阶段:

  1. 捕获阶段
  2. 当前目标阶段
  3. 冒泡阶段

事件冒泡: IE 最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到到 DOM 最顶层节点的过程;
事件捕获: 网景最早提出,由 DOM 最顶层节点开始,然后逐级向下传播到到最具体的元素接收的过程;

在这里插入图片描述
PS:

  1. JS 代码中只能执行捕获或者冒泡其中的一个阶段。
  2. onclick 和 attachEvent 只能得到冒泡阶段。
  3. addEventListener(type, listener[, useCapture])第三个参数如果是 true,表示在事件捕获阶段调用事件处理程序;如果是 false(不写默认就是false),表示在事件冒泡阶段调用事件处理程序。
  4. 实际开发中很少使用事件捕获,我们更关注事件冒泡。
  5. 有些事件是没有冒泡的,比如 onblur、onfocus、onmouseenter、onmouseleave;
4.事件对象

(1)概述

eventTarget.onclick = function(event) {} 
 eventTarget.addEventListener('click', function(event) {}// 这个 event 就是事件对象,可以写成 e 或者 ev

event 对象代表事件的状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态;
事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,它有很多属性和方法;

(2)事件对象的常见属性和方法

e.target 和 this 的区别:
this 是事件绑定的元素, 这个函数的调用者(绑定这个事件的元素);
e.target 是事件触发的元素;

事件对象属性方法说明
e.target返回触发事件的对象
e.srcElement返回触发事件的对象
e.type返回事件的类型
e.cancelBubble阻止冒泡
e.returnValue阻止默认事件
e.preventDefault()阻止默认事件
e.stopPropagation()阻止冒泡
5.阻止事件冒泡

事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到到 DOM 最顶层节点。
事件冒泡本身的特性,会带来的坏处,也会带来的好处,需要灵活掌握。

e.stopPropagation() 
e.cancelBubble = true;
6.事件委托
<ul>
 <li>1</li>
 <li>2</li>
 <li>3</li>
 <li>4</li>
 <li>5</li>
 </ul>
 //点击每个 li 都会弹出对话框,以前需要给每个 li 注册事件,是非常辛苦的,而且访问 DOM 的次数越多,这就会延长整个页面的交互就绪时间;

事件委托
事件委托也称为事件代理, 在 jQuery 里面称为事件委派。

事件委托的原理
不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。
以上案例:给 ul 注册点击事件,然后利用事件对象的 target 来找到当前点击的 li,因为点击 li,事件会冒泡到 ul 上,ul 有注册事件,就会触发事件监听器。

事件委托的作用
我们只操作了一次 DOM ,提高了程序的性能。

7.常用的鼠标事件
document.addEventListener('contextmenu', function(e) {
e.preventDefault();
})
//禁止鼠标右键菜单
document.addEventListener('selectstart', function(e) {
 e.preventDefault();
 })
//禁止鼠标选中(selectstart 开始选中)

鼠标事件对象

event对象代表事件的状态,跟事件相关的一系列信息的集合。现阶段我们主要是用鼠标事件对象MouseEvent 和键盘事件对象 KeyboardEvent。

鼠标事件对象说明
e.clientX返回鼠标相对于浏览器窗口可视区的X坐标
e.clientY返回鼠标相对于浏览器窗口可视区的Y坐标
e.pageX返回鼠标相对于文档页面的X坐标
e.pageY返回鼠标相对于文档页面的Y坐标
e.screenX返回鼠标相当于电脑屏幕的X坐标
e.screenY返回鼠标相当于电脑屏幕的Y坐标
8.常用的键盘事件
键盘事件触发条件
onkeyup某个键盘按键被松开时触发
onkeydown某个键盘按键被按下时触发

PS:

  1. 如果使用addEventListener 不需要加 on;
  2. onkeypress 和前面2个的区别是,它不识别功能键,比如左右箭头,shift 等;
  3. 三个事件的执行顺序是: keydown – keypress — keyup;
键盘事件对象属性说明
keyCode返回该键的ASCII 值

PS:

  • onkeydown 和 onkeyup 不区分字母大小写,onkeypress 区分字母大小写。
  • 在我们实际开发中,我们更多的使用keydown和keyup, 它能识别所有的键(包括功能键)
  • Keypress 不识别功能键,但是keyCode属性能区分大小写,返回不同的ASCII值

学习路径及素材出处:JavaScript基础语法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱2402

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值