一、WebApi介绍
1. Api的概念
API ( Application Programming Interface:应用程序编程接口) 是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组程序的能力,而又无需访问源码,无需了解其内部的工作机制细节,只需要直接调用即可。
例如:
C语言又一个函数fopen()可以打开硬盘上的文件,这个函数对于我们来说,就是C语言提供的打开文件的工具
javaScript中又一个alert() 可以在页面弹出一个提示框,这个函数就是js提供的一个弹框工具
这些工具(函数)由编程语言提供的,内部的实现已经封装好了,我们只需要学会应用这些工具即可。
-
MDN详细API :
https://developer.mozilla.org/zh-CN/docs/Web/API
-
因为api很多,所以我们将这个学习阶段就称为Web APIs
-
此处webapi特指是浏览器提供的一些api(就是函数或对象方法),即操作网页的一系列工具
2. API 和 WebApi总结
- api是为我们程序员提供的一个接口,帮助我们实现某种功能,我们会使用这个就可以了,不必纠结内部如何实现
- WebApi主要是针对浏览器提供的接口,主要针对于浏览器做交互效果
- WebApi一般都由输入和输出(函数传参 和 返回值),WebApi很多的方法(函数)都是这样
- 学习WebApi可以结合前面你学习内置对象方法的思路学习
二. DOM(document)
1. 什么是DOM
- Document Object Model :文档对象模型。是W3C组织推荐的处理可扩展标记语言的标准编程接口
- W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、接口和样式。
- DOM 是W3C组织定义的一套处理html文档的规范,所有的浏览器都遵循了这个标准。
2. dom树
DOM树又称之为文档树模型,把文档映射成树形结构,通过节点对象对其处理,处理的结果可以加入到当前的页面
- 文档:一个页面就是一个文档,DOM中用document表示
- 节点:网页中的所有内容,在文档树中都有节点(标签、属性、文本、注释等等),使用node表示
- 标签节点:网页中的所有的标签,通常称之为元素节点,又简称为“元素”,使用element表示
DOM把以上内容都看作是对象
三、获取元素的方式
为什么要获取页面的元素?
我们想要取操作页面的某个部分(显示/隐藏)需要先获取到该部分对应的元素,再来对其进行操作。
1. 根据ID获取
var obj = document.getElementById(id);
2.根据标签获取
var objs = document.getElementsByTagName('标签名');
或者 element(元素).getElementsByTagName('标签名');
3.根据类选择器获取
var reds = document.getElementsByClassName('类选择器名');
1. 根据ID获取
语法
var obj = document.getElementById(id);
- 作用:根据id获取元素对象
- 参数:id是区分大小写的字符串
- 返回值:元素对象 或者是null
案例
<body>
<div id="time">
2024-10-15
</div>
<script>
//因为我们文档页面从上往下加载,所以先得有标签,所以我们script写道标签的下面
//获取到了id是time的元素对象
var timer = document.getElementById('time');
console.log(timer); //<div id="time">2024-10-15</div>
console.log(typeof timer); //object
//console.dir:打印我们返回的元素对象,更好的查里面的属性和方法
console.dir(timer);
</script>
</body>
2. 根据标签获取
语法
var objs = document.getElementsByTagName('标签名'); 或者 element.getElementsByTagName('标签名');
- 作用:根据标签的名字获取元素对象
- 参数:标签的名字
- 返回值:元素对象集合 (伪数组,数组元素是元素对象)要返回具体值需要遍历
案例
<ul>
<li>总理同印度尼西亚总统通电话1</li>
<li>总理同印度尼西亚总统通电话2</li>
<li>总理同印度尼西亚总统通电话3</li>
<li>总理同印度尼西亚总统通电话4</li>
</ul>
<ul id="nav">
<li>听泉鉴宝称从未说过自己是北大的1</li>
<li>听泉鉴宝称从未说过自己是北大的2</li>
<li>听泉鉴宝称从未说过自己是北大的3</li>
</ul>
<script>
//1.返回的是 这个页面中所有的li元素,以伪数组的形式返回给lis这个对象
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.可以对象.getElementsByTagName('标签名') 获取的是这个对象里面的标签元素
var nav = document.getElementById('nav'); //获取nav元素
var navLis = nav.getElementsByTagName('li');
console.log(navLis);
</script>
注意:
- 因为得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历
- 得到元素对象是动态的。即:当页面增加了标签,这个集合也就增加了元素。
3. 根据类选择器获取
语法
var reds = document.getElementsByClassName('类选择器名');
- 作用:根据类选择器的名字获取元素对象
- 参数:类选择的名字
- 返回值:元素对象集合 (伪数组,数组元素是元素对象) 要返回具体值需要遍历
案例
<body>
<div>
<p class="red">今天是2024年</p>
<span class="blue">10月15日</span>
<span class="red">10月15日redred</span>
</div>
<script>
//根据类选择器获取元素
var reds = document.getElementsByClassName('red')
//遍历
for(var i = 0; i < reds.length; i++){
console.log(reds[i]);
}
</script>
</body>
4. H5新增获取元素方式
语法
document.getElemensByClassName('类选择器名'); //根据类名返回元素对象集合
document.querySelector('选择器'); //返回指定选择器返回第一个元素对象
document.querySelectorAll('选择器'); //根据指选择器返回
注意:querySelector 和 querySelectorAll 选择器必须要添加符号。
如:document.querySelector(’#nav’); document.querySelector(’.blue’);
案例
<body>
<div class="box">盒子1</div>
<div class="box">盒子2</div>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
//1.document.getElemensByClassName('类选择器名'); //根据类名返回元素对象集合
var boxs = document.getElementsByClassName('box');
console.log(boxs);
//2.document.querySelector('选择器'); //返回指定选择器返回第一个元素对象
var firstBox = document.querySelector('.box');
console.log(firstBox);
//3.document.querySelectorAll('选择器'); //根据指选择器返回
// var divs = document.querySelectorAll('#nav');
var divs = document.getElementById('nav');
console.log(divs);
var divLis = divs.getElementsByTagName('li');
console.log(divLis);
var lis = document.querySelectorAll('li');
console.log(lis)
</script>
</body>
5. 获取特殊元素(html,body)
获取body元素
document.body; //返回的body元素对象
获取html元素
document.documentElement; //返回的是html元素对象
//1.获取body元素
var bodyEle = document.body;
console.log(bodyEle);
console.dir(bodyEle);
//2.获取html元素
//var htmlEle = document.html; 没有这个语法
var htmlEle = document.documentElement;
console.log(htmlEle);
四、事件
1. 概述
- javaScript是我们有能力创建动态页面,而事件是可以被javaScript侦测到的行为
- 简单的理解:触发——响应机制
- 网页中每一个元素都可以产生某些可以触发javaScript的事件,比如:点击某个按钮,在触发事件后去执行某些操作。
2. 事件三要素
- 事件源(谁):触发事件的元素
- 事件类型(什么事件):比如点击就是click
- 事件处理程序(做什么):事件触发后要执行的代码(代码以函数的形式组织),事件处理函数
<!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>
<button id="btn">唐伯虎</button>
<script>
//点击按钮,弹出对话框
//1.事件有三部分组成的:1)事件源 2)事件类型 3)事件处理程序
//1)事件源:事件被触发的对象,谁——是按钮
var btnObj = document.getElementById('btn');
//2)事件类型:如何触发事件,比如我们这里就是要点击按钮,事件都是on + 动作
btnObj.onclick = function(){
//3)事件的处理程序,通过一个函数完成
alert('点秋香');
}
</script>
</body>
</html>
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>
</head>
<body>
<div>123</div>
<script>
//事件执行的步骤
//1.获取事件源
var div = document.querySelector('div'); //获取到第一个div
//2.绑定事件,注册事件 div.onclick
//3.添加事件处理程序
div.onclick = function(){
console.log('我被点击了');
}
</script>
</body>
</html>
4. 常见的鼠标事件
鼠标事件 | 触发条件 |
---|---|
onclick | 鼠标点击(鼠标左键点击触发) |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfocus | 鼠标获取焦点 |
onblue | 失去鼠标焦点 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
5.操作元素
javaScript的Dom操作可以改变网页内容、结构和样式。我们可以利用dom操作来改变元素里面的内容、属性等
6. 改变元素内容
- element.innerText
- 从起始位置到终点位置的内容,但是它会去掉html的标签,同时空格和换行也会被去掉
- element.innerHTML
- 起始位置到终点位置全部内容,包括html的标签,同时保留空格和换行
6.1 innerText
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>innerText</title>
</head>
<body>
<button>显示当前系统时间</button>
<div>某个时间</div>
<p>这是p</p>
<script>
//1.获取元素
var btn = document.querySelector('button'); //获取到第一个button
var div = document.querySelector('div'); //获取到第一个div
//2.注册事件,绑定函数
btn.onclick = function(){
//div.innerText = '2024-4-4'; //修改对象中的文本内容
div.innerText = getDate();
}
//获取时间
function getDate(){
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
return '今天是:' + year + '年' + month + '月' + day + '日';
}
var p = document.querySelector('p');
p.innerText = getDate();
</script>
</body>
</html>
6.2 innerHTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>10.innerHTML</title>
</head>
<body>
<button>显示当前系统时间</button>
<div>某个时间</div>
<p>这是p</p>
<script>
//1.获取元素
var btn = document.querySelector('button'); //获取到第一个button
var div = document.querySelector('div'); //获取到第一个div
//2.注册事件,绑定函数
btn.onclick = function(){
//div.innerText = '2024-4-4'; //修改对象中的文本内容
div.innerHTML = getDate();
}
//获取时间
function getDate(){
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
return '今天是:' + year + '年' + month + '月' + day + '日';
}
var p = document.querySelector('p');
p.innerHTML = getDate();
</script>
</body>
</html>
6.3 他们的区别
- 获取内容的时候有区别
- innserText会去掉空格和换行,而innnerHTML会保留空格和换行
- 设置内容时的区别
- innerText不会识别html,而innerHTML会识别
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>11innserText和innerHTML区别</title>
</head>
<body>
<div></div>
<p>
我是文字
<span>123</span>
</p>
<script>
//innserText 和 innserHTML的区别
//1.innserText:从起始位置到终点位置的内容,但是它会去掉html的标签,同时空格和换行也会被去掉
//2. innserHTML起始位置到终点位置全部内容,包括html的标签,同时保留空格和换行
var div = document.querySelector('div');
//div.innerText = '<strong>天气真好</strong>哈哈哈'
div.innerHTML = '<strong>天气真好</strong>哈哈哈'
var p = document.querySelector('p');
console.log(p.innerText);
console.log(p.innerHTML);
</script>
</body>
</html>
7. 操作元素的属性
7.1 常用的元素属性
1.innerText 或 innerHTML改变元素的内容
2.src href
3.id alt title
7.2 获取属性的值
语法:
元素对象.属性名
7.3 设置属性的值
语法:
元素对象.属性名 = 值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>操作元素的属性</title>
</head>
<body>
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button>
<div></div>
<img src="images/ldh.jpg" alt="" title="刘德华" id="img">
<script>
//1.获取元素
var zxy = document.getElementById('zxy');
var ldh = document.getElementById('ldh');
var div = document.querySelector('div');
var img = document.getElementById('img');
//2.注册事件,处理程序
zxy.onclick = function(){
img.src = 'images/zxy.jpg'
img.title = '张学友'
div.innerText = img.title;
}
ldh.onclick = function(){
img.src = 'images/ldh.jpg'
img.title = '刘德华'
div.innerText = img.title;
}
div.innerText = img.title;
</script>
</body>
</html>
7.4 案例
需求:分时显示不同图片,显示不同的问候语
- 如果是上午时间打开页面,显示上午好,显示上午的图片 ( 6:00 - 12:00 不包括12点)
- 如果是下午时间打开页面,显示下午好,显示下午的图片 (12:00 - 18:00 )
- 如果是晚上时间打开页面,显示晚上好,显示晚上的图片 (18:00- 24:00)
<!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>
<img src="images/z.gif" alt="">
<div>早上好</div>
<script>
//需求:分时显示不同图片,显示不同的问候语
// - 如果是上午时间打开页面,显示上午好,显示上午的图片 ( 6:00 - 12:00 不包括12点)
// - 如果是下午时间打开页面,显示下午好,显示下午的图片 (12:00 - 18:00 )
// - 如果是晚上时间打开页面,显示晚上好,显示晚上的图片 (18:00- 24:00)
//1.得到当前时间的小时
var date = new Date();
var h = date.getHours();
//获取对象
var img = document.querySelector('img');
var div = document.querySelector('div');
//2.判断时间
if(h >= 6 && h < 12){ //上午
img.src = 'images/s.gif';
div.innerText = '上午好';
} else if (h >= 12 && h < 18) { //下午
img.src = 'images/x.gif';
div.innerText = '下午好';
} else { //晚上
img.src = 'images/w.gif';
div.innerText = '晚上好';
}
</script>
</body>
</html>
8. 表单元素的属性操作
利用dom可以操作如下表单元素的属性:
type、value、checked、selected、disabled
8.1 获取属性的值
元素对象.属性名
8.2设置属性的值
元素对象.属性名 = 值
表单元素中有一些属性如:disabled、checked、selected元素对象这些属性的值是布尔型
<!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>
<button id="btn" >按钮</button>
<input type="text" name="" id="txt" value="输入内容">
<button id="btn2">解禁</button>
<script>
//1.获取元素
var btn = document.getElementById('btn');
var input = document.getElementById('txt');
var btn2 = document.getElementById('btn2');
//2.注册事件
btn.onclick = function(){
input.value = '按钮被点击了';
//如果想要某个表单按钮被禁用,不能再点击了就可以是disabled
//btn.disabled = true; //disabled是按钮中的一个属性
this.disabled = true; //this指的是,绑定事件的这个东西.这里指的是btn
}
btn2.onclick = function(){
btn.disabled = false;
}
</script>
</body>
</html>
8.3 案例
<!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>
.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 = false;
eye.onclick = function(){
if(flag == false){
//替换图片
eye.src = 'images/open.png';
pwd.type = 'text';
flag = true;
} else {
//替换图片
eye.src = 'images/close.png';
pwd.type = 'password';
flag = false;
}
}
</script>
</body>
</html>
9. 样式属性操作
我们可以通过js修改元素的大小、颜色和位置等样式
常用方式
- element.style 行内样式操作
- element.className 类名样式操作
9.1 style属性操作
元素对象style属性也是一个对象
元素对象.style.样式属性= 值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>16.style属性操作</title>
<style>
.a {
background-color: purple;
font-size: 30px;
}
</style>
</head>
<body>
<div>现场:朝鲜炸毁朝韩间道路视频曝光</div>
<script>
//style:js里面的样式采用的是驼峰写法
//1.获取元素
var div = document.querySelector('div');
//2.注册事件 处理程序
div.onclick = function(){
div.style.backgroundColor = 'purple';
this.style.width = '250px';
this.style.fontSize = '50px'
}
</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>Document</title>
<style>
.box {
position: relative;
width: 74px;
height: 88px;
border: 1px solid #ccc;
margin: 100px auto;
font-size: 12px;
text-align: center;
color: #f40;
/* display: block; */
}
.box img {
width: 60px;
margin-top: 5px;
}
.close-btn {
position: absolute;
top: -1px;
left: -16px;
width: 14px;
height: 14px;
border: 1px solid #ccc;
line-height: 14px;
font-family: Arial, Helvetica, sans-serif;
cursor: pointer;
}
</style>
</head>
<body>
<div class="box">
淘宝二维码
<img src="images/tao.png" alt="">
<i class="close-btn">×</i>
</div>
<script>
//1.获取元素
var btn = document.querySelector('.close-btn');
var div = document.querySelector('.box');
//2.注册事件,处理程序
btn.onclick = function(){
div.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">
<title>18精灵图</title>
<style>
*{
margin: 0;
padding: 0;
}
.box{
width: 250px;
margin: 100px auto;
}
li{
list-style: none;
}
.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');
//2.遍历li
for(var i = 0; i < lis.length; i++){
var index = i * 44;
lis[i].style.backgroundPosition = '0 -' + index + 'px';
}
</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>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() {
//alert('获取了焦点');
if(this.value === '手机'){
this.value = ''
}
this.style.color = '#333';
}
// 3. 注册事件 失去焦点事件 onblur
text.onblur = function() {
//alert('失去了焦点');
if(this.value === ''){
this.value = '手机'
//失去焦点需要把文本框中的颜色变浅
this.style.color = '#999'
}
}
</script>
</body>
</html>
9.2 操作className属性
元素对象.className = 值;
因为class是关键字,所以使用className
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>20通过className更改元素样式</title>
<style>
div{
width: 100px;
height: 100px;
background-color: pink;
}
.change{
background-color: purple;
color: #fff;
font-size: 25px;
margin-top: 100px;
}
.first{
}
</style>
</head>
<body>
<div class="abc">文本</div>
<script>
//1.获取对象
var test = document.querySelector('div');
//2.注册事件
test.onclick = function(){
// this.style.backgroundColor = 'purple'
// this.style.color = '#fff'
// this.style.fontSize = '25px'
// this.style.marginTop = '100px'
//我们可以通过修改元素的calssName更改元素的样式
//如果要保留原来的样式,记得要加入到后面
test.className = 'change first abc'
}
</script>
</body>
</html>