一、Web APIs 和 JS 基础关联性
1.1 JS 的组成
1.2 JS 基础阶段以及 Web APIs 阶段
二、API 和 Web API
2.1 API
API(Application Programming Interface,应用程序编程接口) 是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
简单理解: API 是给程序员提供的一种工具,以便能更轻松的实现想要完成的功能。
- 比如手机充电的接口:
我们要实现充电这个功能:
我们不关心手机内部变压器,内部怎么存储电等
我们不关心这个充电线怎么制作的
我们只知道,我们拿着充电线插进充电接口就可以充电
这个充电接口就是一个 API
2.2 Web API
Web API是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM )。
现阶段我们主要针对于浏览器讲解常用的 API , 主要针对浏览器做交互效果。
比如我们想要浏览器弹出一个警示框, 直接使用 alert(‘弹出’)
MDN 详细 API : https://developer.mozilla.org/zh-CN/docs/Web/API
因为 Web API 很多,所以我们将这个阶段称为 Web APIs
2.3 API 和 Web API 总结
1.API 是为我们程序员提供的一个接口,帮助我们实现某种功能,我们会使用就可以了,不必纠结内部如何实现
2.Web API 主要是针对于浏览器提供的接口,主要针对于浏览器做交互效果。
3.Web API 一般都有输入和输出(函数的传参和返回值),Web API 很多都是方法(函数)
4.学习 Web API 可以结合前面学习内置对象方法的思路学习
三、DOM
能够说出什么是 DOM
能够获取页面元素
能够给元素注册事件
能够操作 DOM 元素的属性
能够创建元素
能够操作 DOM 节点
1.什么是 DOM
1.1 什么是 DOM
文档对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。
W3C 已经定义了一系列的 DOM 接口,通过这些 DOM 接口可以改变网页的内容、结构和样式。
1.2 DOM 树
2. 获取元素
2.1 如何获取页面元素
DOM在我们实际开发中主要用来操作元素。
我们如何来获取页面中的元素呢?
获取页面中的元素可以使用以下几种方式:
- 根据 ID 获取
- 根据标签名获取
- 通过 HTML5 新增的方法获取
- 特殊元素获取
2.2 根据 ID 获取
使用 getElementById() 方法可以获取带有 ID 的元素对象。
document.getElementById('id');
使用 console.dir() 可以打印我们获取的元素对象,更好的查看对象里面的属性和方法。
<body>
<div id="time">2019-9-9</div>
<script>
// 1.因为我们文档页面从上往下加载,所以先得有标签 所以我们script写在标签的下面
// 2.get 获得 element 元素 by 通过 驼峰命名法
// 3.参数 id是大小写敏感的字符串
// 4.返回的是一个元素对象
var timer = document.getElementById('time')
console.log(timer)
console.log(typeof timer) //objext
// 5.console.dir 打印我们返回的元素对象 更好的查看里面的属性和方法
console.dir(timer)
</script>
</body>
伪数组:并不是真正意义上的数组,但是具有数组的长度属性,也通过索引进行存储,但是不具备数组其他方法,如pop、push等方法
2.3 根据标签名获取
使用 getElementsByTagName() 方法可以返回带有指定标签名的对象的集合。
document.getElementsByTagName('标签名');
注意:
1.因为得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历。
2.得到元素对象是动态的
3.如果获取不到元素,则返回为空的伪数组(因为获取不到对象)
4.父元素必须是单个对象(必须指明是哪一个元素对象). 获取的时候不包括父元素自己。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul>
<li>知否知否,应该是等你好久1</li>
<li>知否知否,应该是等你好久2</li>
<li>知否知否,应该是等你好久3</li>
<li>知否知否,应该是等你好久4</li>
<li>知否知否,应该是等你好久5</li>
</ul>
<ol id="ol">
<li>生僻字</li>
<li>生僻字</li>
<li>生僻字</li>
<li>生僻字</li>
<li>生僻字</li>
</ol>
<script>
// 1.返回的是 获取过来元素对象的集合 以伪数组 的形式存储的
var lis = document.getElementsByTagName('li')
console.log(lis)
console.log(lis[0])
// 2.我们想要依次打印里面的元素对象我们可以采取遍历的方式
for (var i = 0; i < lis.length; i ++){
console.log(lis[i])
}
// 3.如果页面中只有一个li 返回的还是伪数组的形式
// 4.如果页面中没有这个元素 返回的是空伪数组
// 5.element.getElementByTagName('标签名')
// var ol = document.getElementsByTagName('ol')
// console.log(ol[0].getElementsByTagName('li'))
var ol = document.getElementById('ol')
console.log(ol.getElementsByTagName('li'))
</script>
</body>
</html>
2.4 通过 HTML5 新增的方法获取
<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)
// 2.querySelector 返回指定选择器的第一个元素对象 切记 里面的选择器需要加符号 .box #nav
var firstBox = document.querySelector('.box')
console.log(firstBox)
var nav = document.querySelector('#nav')
console.log(nav)
var li = document.querySelector('li')
console.log(li)
// 3.querySelectorAll()返回指定选择器的所有元素对象集合
var allBox = document.querySelectorAll('.box')
console.log(allBox)
var lis = document.querySelectorAll('li')
console.log(lis)
</script>
</body>
2.5 获取特殊元素(body,html)
<body>
<script>
// 1.获取body元素
var bodyEle = document.body
console.log(bodyEle)
console.dir(bodyEle)
// 2.获取html元素
var htmlEle = document.documentElement
console.log(htmlEle)
</script>
</body>
3.事件基础
3.1 事件概述
JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。
简单理解: 触发— 响应机制。
网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个 事件,然后去执行某些操作。
3.2 事件三要素
- 事件源 (谁)
- 事件类型 (什么事件)
- 事件处理程序 (做啥)
案例:点击按钮弹出警示框
页面中有一个按钮,当鼠标点击按钮的时候,弹出“你好”警示框。
案例分析
1.获取事件源(按钮)
2.注册事件(绑定事件),使用 onclick
3.编写事件处理程序,写一个函数弹出 alert 警示框
实现代码
<body>
<btn: id="btn">唐伯虎</btn:>
<script>
// 点击一个按钮,弹出对话框
// 1.事件是由三部分组成的 事件源 事件类型 事件处理程序 我们也成为事件三要素
// (1)事件源 事件被触发的对象 谁 按钮
var btn = document.getElementById('btn')
// (2)事件类型 如何触发 什么事件 比如鼠标点击(onclick)还是鼠标经过 还是键盘按下
// (3)事件处理程序 通过一个函数赋值方式 完成
btn.onclick = function() {
alert('点秋香')
}
</script>
</body>
3.3 执行事件的步骤
- 获取事件源
- 注册事件(绑定事件)
- 添加事件处理程序(采取函数赋值形式)
<body>
<div>123</div>
<script>
// 执行事件步骤
// 点击div 控制台输出 我被选中了
// 1.获取事件源
var div = document.querySelector('div')
// 2.绑定事件 注册事件
// div.onclick
// 3.添加事件处理程序
div.onclick = function(){
console.log('我被选中了')
}
</script>
</body>
4. 操作元素
JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容 、属性等。注意以下都是属性
4.1 改变元素内容
element.innerText
从起始位置到终止位置的内容, 但它去除 html 标签, 同时空格和换行也会去掉
element.innerHTML
起始位置到终止位置的全部内容,包括 html 标签,同时保留空格和换行
4.2 常用元素的属性操作
<body>
<div></div>
<p>
我是文字
<span>123</span>
</p>
<script>
// innerText和innerHTML的区别
// 1.innerText 不识别html标签 非标准 去除空格和换行
var div = document.querySelector('div')
div.innerText = '<strong>今天是</strong>2023年' //<strong>今天是</strong>2023年
// 2.innerHTML 识别html标签 W3C标准 保留空格和换行
div.innerHTML = '<strong>今天是</strong>2023年' //加粗显示 今天是2023年
// 这两个属性是可读写的 可以获取元素里面的内容'
var p = document.querySelector('p')
console.log(p.innerText)
console.log(p.innerHTML)
</script>
</body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div,
p{
width: 300px;
height: 30px;
background-color: pink;
line-height: 30px;
color: #fff;
}
</style>
</head>
<body>
<button>显示当前系统时间</button>
<div>某个时间</div>
<p>123</p>
<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()
// 我们写一个2019年 5月 1日 星期三
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>
</html>
运行结果:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
img {
width: 300px;
}
</style>
</head>
<body>
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button><br>
<img src="./images/ldh.jpg" alt="">
<script>
// 修改元素属性 scr
// 1.获取元素
var ldh = document.getElementById('ldh')
var zxy = document.getElementById('zxy')
var img = document.querySelector('img')
// 2.注册事件 处理程序
zxy.onclick = function() {
img.src = './images/zxy.jpg'
img.title = '张学友'
}
ldh.onclick = function() {
img.src = './images/ldh.jpg'
img.title = '刘德华'
}
</script>
</body>
</html>
运行结果:
案例: 分时显示不同图片,显示不同问候语
根据不同时间,页面显示不同图片,同时显示不同的问候语。
如果上午时间打开页面,显示上午好,显示上午的图片。
如果下午时间打开页面,显示下午好,显示下午的图片。
如果晚上时间打开页面,显示晚上好,显示晚上的图片。
案例分析
根据系统不同时间来判断,所以需要用到日期内置对象
利用多分支语句来设置不同的图片
需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
需要一个div元素,显示不同问候语,修改元素内容即可
<style>
img {
width: 300px;
}
</style>
</head>
<body>
<img src="./images/s.gif" alt="">
<div>上午好</div>
<script>
// 根据系统不同时间来判断,所以需要用到日期内置对象
// 利用多分支语句来设置不同的图片
// 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
// 需要一个div元素,显示不同问候语,修改元素内容即可
// 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 = './images/s.gif'
div.innerHTML = '亲,上午好,好好写代码'
} else if(h < 18){
img.src = './images/x.gif'
div.innerHTML = '亲,下午好,好好写代码'
} else {
img.src = './images/w.gif'
div.innerHTML = '亲,晚午好,好好写代码'
}
</script>
</body>
</html>
4.3 表单元素的属性操作
利用 DOM 可以操作如下表单元素的属性:
type、value、checked、selected、disabled
<body>
<button>按钮</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 我们想要这个按钮 button 禁用
// btn.disabled = true
this.disabled = true
// this指向的是事件函数的调用者btn
}
</script>
</body>
案例:仿京东显示密码
案例分析
核心思路:
1.点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
2.一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框
3.算法:利用一个flag变量,来判断flag的值,如果是1 就切换为文本框,flag 设置为0,如果是0 就切换为密码框,flag设置为1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</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: 2px;
right: 2px;
width: 24px;
}
</style>
</head>
<body>
<div class="box">
<label for="">
<img src="./images/close.png" 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 = 0
eye.onclick = function() {
// 点击一次之后,flag一定要变化
if (flag == 0) {
pwd.type = 'text'
eye.src = './images/open.png'
flag = 1
} else {
pwd.type = 'password'
eye.src = './images/close.png'
flag = 0
}
}
</script>
</body>
</html>
运行程序:
4.4 样式属性操作
我们可以通过 JS 修改元素的大小、颜色、位置等样式。
注意:
1.JS 里面的样式采取驼峰命名法 比如 fontSize、 backgroundColor
2.JS 修改 style 样式操作,产生的是行内样式,CSS 权重比较高
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
}
</style>
</head>
<body>
<div></div>
<script>
// 1.获取元素
var div = document.querySelector('div')
// 2.注册事件 处理程序
div.onclick = function() {
// div.style 里面的属性 采取驼峰命名法
this.style.backgroundColor = 'purple'
this.style.width = '250px'
}
</script>
</body>
</html>
案例: 淘宝点击关闭二维码
案例分析
核心思路:
1.利用样式的显示和隐藏完成, display:none 隐藏元素 display:block 显示元素
2.点击按钮,就让这个二维码盒子隐藏起来即可
var btn = document.querySelector('.close-btn');
var box = document.querySelector('.box');
// 2.注册事件 程序处理
btn.onclick = function() {
box.style.display = 'none';
案例: 循环精灵图背景
案例分析
1.首先精灵图图片排列有规律的
2.核心思路: 利用for循环 修改精灵图片的 背景位置 background-position
3.剩下的就是考验你的数学功底了
4.让循环里面的 i 索引号 * 44 就是每个图片的y坐标
<!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>Document</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(images/sprite.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>
</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>
案例:显示隐藏文本框内容
案例分析
1.首先表单需要2个新事件,获得焦点 onfocus 失去焦点 onblur
2.如果获得焦点, 判断表单里面内容是否为默认文字,如果是默认文字,就清空表单内容
3.如果失去焦点, 判断表单内容是否为空,如果为空,则表单内容改为默认文字
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
input{
color: #999;
}
</style>
</head>
<body>
<input type="text" value='手机'>
<script>
// 1.获取元素
var text = document.querySelector('input')
// 2.注册事件 获得焦点事件 onfocus
text.onfocus = function() {
// console.log('得到焦点')
if (text.value === '手机') {
this.value = ''
}
// 获得焦点需要把文本框里面的文字颜色变黑
this.style.color = '#333'
}
// 3.注册事件 失去焦点 onblur
text.onblur = function() {
// console.log('失去焦点')
if (this.value === ''){
this.value = '手机'
}
// 获得焦点需要把文本框里面的文字颜色变浅色
this.style.color = '#999'
}
</script>
</body>
</html>
4.4 样式属性操作
我们可以通过 JS 修改元素的大小、颜色、位置等样式。
注意:
1.如果样式修改较多,可以采取操作类名方式更改元素样式。
2.class因为是个保留字,因此使用className来操作元素类名属性
3.className 会直接更改元素的类名,会覆盖原先的类名。
案例: 密码框格式提示错误信息
案例分析
1.首先判断的事件是表单失去焦点 onblur
2.如果输入正确则提示正确的信息颜色为绿色小图标变化
3.如果输入不是6到16位,则提示错误信息颜色为红色 小图标变化
4.因为里面变化样式较多,我们采取className修改样式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div{
width: 600px;
margin: 100px auto;
}
.message{
display: inline-block;
font-size: 12px;
color: #999;
background: url(./images/mess.png) no-repeat left center;
padding-left: 20px;
}
.wrong {
color: red;
background-image: url(./images/wrong.png);
}
.right{
color: green;
background-image: url(./images/right.png);
}
</style>
</head>
<body>
<div class="register">
<input type="password" class = 'ipt'>
<p class="message">请输入6~16位密码</p>
</div>
<script>
// 首先判断的事件是表单失去焦点 onblur
// 如果输入正确则提示正确的信息颜色为绿色小图标变化
// 如果输入不是6到16位,则提示错误信息颜色为红色 小图标变化
// 因为里面变化样式较多,我们采取className修改样式
// 1.获取信息
var ipt = document.querySelector('.ipt')
var message = document.querySelector('.message')
// 2.注册事件 失去焦点
ipt.onblur = function() {
// 根据表单里面的长度 ipt.value.length
if (ipt.value.length < 6 || ipt.value.length > 16) {
// console.log('错误');
message.className = 'message wrong'
message.innerHTML = '您输入的位数不对 要求是6~16位'
} else {
message.className = 'message right'
message.innerHTML = '您输入的正确'
}
}
</script>
</body>
</html>