目录
2.5.8 三种动态创建元素区别 write、innerHTML、createElement()
eventTarget.attachEvent(eventNameWithOn, callback);
一、Web APIs 简介
1.1 Web APIs 和 JS基础关联性
1.1.1 JS组成
1.1.2 JS基础阶段以及 Web APIs阶段
JS基础阶段
- 学习的是ECMAScript 标准规定的基本语法
- 掌握js基本语法
- 只学习语法,做不了常用的网页交互效果
- 目的是为了JS后面的课程打基础、做铺垫
Web APIs 阶段
- Web APIs 是 w3c 组织的标准
- Web APIs 主要学习 DOM 和 BOM
- Web APIs 是 JS 所独有的部分
- 主要学习页面的交互功能
- 需要使用 JS 基础的课程内容做基础
JS 基础学习 ECMAScript 基础语法为后面作铺垫, Web APIs 是 JS 的应用,大量使用 JS 基础语法做交互效果。
1.2 API 和 Web API
1.2.1 API
API ( Application Programming Interface,应用程序编程接口) 是一些预定义的函数,目的是提供应用程序与开发人员基于软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
简单理解:API 是给程序员提供的一种工具,以便能更轻松的实现想要完成的功能。
1.2.2 Web API
Web API 是浏览器提供的一套操作浏览器功能和页面元素的API(BOM 和 DOM)。
查找 API 的链接:Web API 接口参考 | MDN
1.2.3 API 和 Web API 总结
- API 是为程序员提供的一个接口,帮助实现某种功能,会使用即可,不需要纠结内部如何实现
- Web API 主要是针对于浏览器提供的接口,主要针对浏览器做交互效果
- Web API 一般都有输入和输出(函数的传参和返回值),Web API 很多都是方法(函数)
- 学习 Web API 可以结合学习内置对象的方法的思路学习
二、DOM
2.1 DOM 简介
2.1.1 什么是 DOM
文档对象模型(Document Object Model,简称 DOM),是W3C组织推荐的处理可扩展标记语言(HTML 或者 XML)的标准编程接口。
W3C 已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式。
2.1.2 DOM树
- 文档:一个页面就是一个文档,DOM 中使用 document 表示
- 元素:页面中的所有标签都是元素,DOM 中使用 element 表示
- 节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中使用 node 表示
DOM把以上内容都看做是对象。
2.2 获取元素
2.2.1 如何获取页面元素
DOM在开发中主要用来操作元素。
如何获取页面中的元素?
获取页面中的元素可以使用以下几种方式:
- 根据 ID 获取
- 根据标签名获取
- 通过 HTML5 新增的方法获取
- 特殊元素获取
2.2.2 根据 ID 获取
使用 getElementById() 方法可以获取带有ID的元素对象。
document.getElementById('ID');
<body>
<div id="time">2022-3-15</div>
<script>
// 1.因为文档页面从上往下加载,所以先得有标签 所以将script写在标签的下面
// 2.get 获取 element 元素 by 通过 驼峰命名法
// 3.参数 id 是大小写敏感的字符串
// 4.返回的是一个元素对象
var timer = document.getElementById('time');
console.log(timer); // <div id="time">2022-3-15</div>
console.log(typeof timer); // object
// 5.console.dir 打印返回的元素对象 更好的查看里面的属性
console.dir(timer); // div#time
</script>
</body>
2.2.3 根据标签名获取
使用 getElementsByTagName() 方法可以返回带有指定标签名的对象的合集。
document.getElementsByTagName('标签名');
注意:
1.因为得到的是一个对象的集合,所以想要操作里面的元素就需要遍历。
2.得到元素对象是动态的
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
// 1.返回的是 获取过来元素对象的集合 以伪数组的形式存储的
var lis = document.getElementsByTagName('li');
console.log(lis); // HTMLCollection(3) [li, li, li]
console.log(lis[0]);
// 2.想要依次打印里面的元素对象可以采取遍历的方式
for (var i = 0; i < lis.length; i++) {
console.log(lis[i]);
}
// 3.如果页面中只有一个li 返回的还是伪数组的形式
// 4.如果页面中没有这个元素返回的是空的伪数组的形式。
</script>
</body>
还可以获取某个元素(父元素)内部所有指定标签名的子元素。
element.getElementsByTagName('标签名');
注意:父元素必须是 单个对象(必须指明是哪一个元素对象).获取的时候不包括父元素自己。
<body>
<ol id="ol">
<li>4</li>
<li>5</li>
<li>6</li>
</ol>
<script>
// 5. element.getElementsByTagName('标签名')
var ol = document.getElementById('ol');
console.log(ol.getElementsByTagName('li')); // HTMLCollection(3) [li, li, li]
</script>
</body>
2.2.4 通过 HTML5 新增的方法获取
1. document.getElementsByClassName('类名'); // 根据类名返回元素对象集合
2. document.querySelector('选择器); // 根据指定选择器返回第一个元素对象
3. document.querySelectorAll('选择器'); // 根据指定选择器返回
<body>
<div class="box">盒子1</div>
<div class="box">盒子2</div>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
// 1.getElementsByClassName 根据类名获取某些元素集合
var boxs = document.getElementsByClassName('box');
console.log(boxs); // HTMLCollection(2) [div.box, div.box]
// 2.querySelector 返回指定选择器的第一个元素对象 切记 里面的选择器需要加符号 .box #nav
var firstBox = document.querySelector('.box'); //
console.log(firstBox); // <div class="box">盒子1</div>
var nav = document.querySelector('#nav');
console.log(nav); // <div id="nav">...</div>
var li = document.querySelector('li');
console.log(li); // <li>首页</li>
// 3. querySelectorAll() 返回指定选择器的所有元素对象集合
var allBox = document.querySelectorAll('.box');
console.log(allBox); // NodeList(2) [div.box, div.box]
var lis = document.querySelectorAll('li');
console.log(lis); // NodeList(2) [li, li]
</script>
</body>
2.2.5 获取特殊元素(body,html)
获取body元素
1. document.body; // 返回body元素对象
获取html元素
1.document.documentElement; // 返回html元素
2.3 事件基础
2.3.1 事件概述
JavaScript 是我们有能力创建动态页面,而事件是可以被JavaScript侦测到的行为。
简答理解:触发 --- 响应机制。
网页中的每个元素都可以产生某些可以触发JavaScript的事件,例如:可以在用户点击某个按钮时产生一个事件,然后去执行某些操作。
<body>
<button id="btn">btn</button>
<script>
// 点击一个按钮,弹出对话框
// 1.事件是由三部分组成:事件源 事件类型 事件处理程序 称为事件三要素
// (1)事件源 事件被触发的对象
var btn = document.getElementById('btn');
// (2)事件类型 如何触发 什么事件 比如:onclick 鼠标经过
// (3)事件处理程序 通过一个函数赋值的方式 完成
btn.onclick = function () {
alert('事件');
}
</script>
</body>
2.3.2 执行事件的步骤
-
获取事件源
-
注册事件(绑定事件)
-
添加事件处理程序(采取函数赋值形式)
<body>
<div>123</div>
<script>
// 执行事件步骤
// 点击div 控制台输出 我被选中了
// 1.获取事件源
var div = document.querySelector('div');
// 2.绑定事件 注册事件
// div.onclick;
// 3.添加事件处理程序
div.onclick = function () {
console.log('我被选中了');
}
</script>
</body>
2.3.3 常见的鼠标事件
鼠标事件 | 触发条件 |
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfocus | 获取鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
2.4 操作元素
JavaScript的 DOM 操作可以改变网页内容、结构和样式,可以 利用 DOM 操作元素来改变元素里面的内容、属性等。注意以下都是属性
2.4.1 改变元素内容 【不赋值为获取值】
element.innerText
从起始位置到终止位置的内容,但它去除 html 标签,同时空格和换行也会去掉。
element.innerHTML
起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行。
<body>
<button>显示当前系统时间</button>
<div>某个时间</div>
<script>
// 当点击按钮, div里面文字发生变化
// 1.获取元素
var btn = document.querySelector('button');
var div = document.querySelector('div');
// 2.注册事件
btn.onclick = function () {
div.innerText = getDate();
}
function getDate() {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var dates = date.getDate();
var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
var day = date.getDay();
return '今天是:' + year + '年' + month + '月' + dates + '日' + arr[day];
}
// 可以不用添加事件
var p = document.querySelector('p');
p.innerText = getDate();
</script>
</body>
innerText 和 innerHTML 的区别:
<body>
<div></div>
<p>
我是文字
<span>123</span>
</p>
<script>
// innerText 和 innerHTML的区别
// 1.innerText 不识别 html 标签 非标准 去除空格 和 换行
var div = document.querySelector('div');
// div.innerText = '<strong>今天是:</strong>2022';
// 2.innerHTML 识别html标签 W3C标准 保留空格和换行
div.innerHTML = '<strong>今天是:</strong>2022';
// 这两个属性是可读写的 可以获取元素里面的内容
var p = document.querySelector('p');
console.log(p.innerText);
console.log(p.innerHTML);
</script>
</body>
2.4.2 常用元素的属性操作
1. innerText、innerHTML 改变元素内容
2. src、href
3. id、alt、title
案例:修改src属性 和 title属性
<body>
<button id="ldh">ldh</button>
<button id="zxy">zxy</button>
<br>
<img src="image/ldh.webp" alt="" style="width: 300px" title="刘德华">
<script>
// 修改元素属性 src title
// 1.获取元素
var ldh = document.getElementById('ldh');
var zxy = document.getElementById('zxy');
var img = document.querySelector('img');
// 2.注册事件 处理程序
zxy.onclick = function () {
img.src = 'image/zxy.webp';
img.title = '张学友ya';
}
ldh.onclick = function () {
img.src = 'image/ldh.webp';
img.title = '刘德华';
}
</script>
</body>
案例:分时显示不同图片,显示不同问候语
<body>
<img src="image/" alt="" style="width: 300px;">
<div>上午好</div>
<script>
// 1.获取元素
var img = document.querySelector('img');
var div = document.querySelector('div');
// 2.得到档期时间小时数
var date = new Date();
var h = date.getHours();
// 3.判断小时数改变图片和文字信息
if (h < 12) {
img.src = 'image/s.gif';
div.innerHTML = "上午好";
} else if (h < 18) {
img.src = 'image/x.webp';
div.innerHTML = "上午好";
} else {
img.src = 'image/w.webp';
div.innerHTML = "上午好";
}
</script>
</body>
2.4.3 表单元素的属性操作
利用 DOM 可以操作如下表单元素的属性:
type、value、checked、selected、disabled
案例:修改input 的value 和禁用button的disabled
<body>
<button>btn</button>
<input type="text" value="输入内容">
<script>
// 1.获取元素
var btn = document.querySelector('button');
var input = document.querySelector('input');
// 2.注册事件 处理程序
btn.onclick = function () {
// input.innerHTML = '点击了'; // 这个是普通盒子 比如 div 标签里面的内容
// 表单里面的值 文字内容是通过 value 来修改的
input.value = '被电击了';
// 如果想要某个属性被禁用 不能再点击 disabled 把这个按钮禁用
// btn.disabled = true;
this.disabled = true;
// this 指向的是事件函数的调用者 btn
}
</script>
</body>
案例:仿京东显示隐藏密码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>仿京东显示隐藏密码</title>
<style>
.box {
position: relative;
width: 400px;
border-bottom: 1px solid #ccc;
margin: 100px auto;
}
.box input {
width: 370px;
height: 30px;
border: 0;
outline: none;
}
.box img {
position: absolute;
top: 5px;
right: 30px;
width: 24px;
}
</style>
</head>
<body>
<div class="box">
<label for="">
<img src="image/close.webp" alt="" id="eye">
</label>
<input type="password" name="" id="pwd">
</div>
<script>
// 1.获取元素
var eye = document.getElementById('eye');
var pwd = document.getElementById('pwd');
// 2.注册事件
var flag = false;
eye.onclick = function () {
if (flag) {
pwd.type = "password";
eye.src = "image/close.webp";
flag = false;
} else {
pwd.type = "text";
eye.src = "image/open.webp";
flag = true;
}
}
</script>
</body>
</html>
2.4.4 样式属性操作
可以通过js修改元素的大小、颜色、位置等样式。
1. element.style 行内样式操作
2. element.className 类名样式操作
注意:
1.JS里面的样式采取驼峰命名法 比如 : fontSize、backgroundColor
2.JS修改 style 样式操作,产生的是行内样式,css权重比较高
注意:
1.如果样式修改比较多,可以采取操作类名方式更改元素样式。
2.class因为是个保留字,因此使用className来操作元素类名属性。
className 会直接更改元素的类名,会覆盖原先的类名。
<body>
<div style=" width: 200px; height: 200px; background-color: pink;"></div>
<script>
var div = document.querySelector('div');
div.onclick = function () {
div.style.backgroundColor = "blue";
}
</script>
</body>
案例:关闭淘宝二维码案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>关闭淘宝二维码案例</title>
<style>
.box {
position: relative;
width: 74px;
height: 88px;
border: 1px solid #ccc;
margin: 100px auto;
font-size: 12px;
text-align: center;
color: #f40;
}
.box img {
width: 60px;
margin-top: 5px;
}
.close-btn {
position: absolute;
top: -1px;
left: -16px;
width: 14px;
border: 1px solid #ccc;
line-height: 14px;
font-family: Arial, Helvetica, sans-serif;
cursor: pointer;
}
</style>
</head>
<body>
<div class="box">
淘宝二维码
<img src="image/tao.png" alt="">
<i class="close-btn">x</i>
</div>
<script>
// 1.获取元素
var btn = document.querySelector('.close-btn');
var box = document.querySelector('.box');
// 2.注册事件 程序处理
btn.onclick = function () {
box.style.display = 'none';
}
</script>
</body>
</html>
案例:循环精灵图背景
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>循环精灵图背景 </title>
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style-type: none;
}
.box {
width: 250px;
margin: 100px auto;
}
.box li {
float: left;
width: 24px;
height: 24px;
background-color: pink;
margin: 15px;
background: url('image/jinglingtu.png') no-repeat;
}
</style>
</head>
<body>
<div class="box">
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
<script>
// 1.获取元素 所有li
var lis = document.querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
// 让索引号 乘以44 就是每个li 的背景y坐标 index 就是y坐标
var index = i * 44;
lis[i].style.backgroundPosition = '0 -' + index + 'px';
}
</script>
</body>
</html>
案例:显示隐藏文本框内容
当鼠标点击文本时,里面默认文字隐藏,当鼠标离开文本框时,里面的文字显示。
<body>
<input type="text" value="手机">
<script>
// 1.获取元素
var text = document.querySelector('input');
// 2.注册事件 获取焦点事件 onfocus
text.onfocus = function () {
if (this.value === '手机') {
this.value = '';
}
// 获取焦点需要把文本框里面的文字颜色变黑
this.style.color = '#333';
}
// 3.
text.onblur = function () {
if (this.value === '') {
this.value = '手机';
}
// 获取焦点需要把文本框里面的文字颜色变黑
this.style.color = '#999';
}
</script>
</body>
通过 className 更改元素样式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>className修改样式</title>
<style>
.change {
background-color: p