Web APIs - 第一天
一.Webapi 简介
1.0.学习目标
能够说出 Web APIs 阶段与 JavaScript 语法阶段的关联性
能够说出什么是 API
能够说出什么是 Web API
1.1.Web APIs 和 Js基础的关联性
1.1.1.js的组成
1.1.2.JS 基础阶段以及 Web APIs 阶段
JS 基础学习 ECMAScript 基础语法为后面作铺垫, Web APIs 是 JS 的应用,大量使用 JS 基础语法做交互效果
1.2. Web API介绍
1.2.1 API的概念
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,无需理解其内部工作机制细节,只需直接调用使用即可。
简单理解:API是给程序员提供的工具,以便能更轻松的实现想要完成的功能;
举例解释什么是API。
例如,
C语言中有一个函数 fopen()可以打开硬盘上的文件,这个函数对于我们来说,就是一个C语言提供的打开文件的工具。
javascript中有一个函数alert()可以在页面弹一个提示框,这个函数就是js提供的一个弹框工具。
这些工具(函数)由编程语言提供,内部的实现已经封装好了,我们只要学会灵活的使用这些工具即可。
1.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。
此处的 Web API 特指浏览器提供的一系列API(很多函数或对象方法),即操作网页的一系列工具。例如:操作html标签、操作页面地址的方法。
API 和 Web API 总结
- API 是一些预先定义好函数,让开发人员直接使用, 无需关注内部实现。
- Web API 是 浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM ) 。
- Web API 一般都有输入和输出(函数的传参和返回值),Web API 很多都是方法(函数)
二.DOM
1.2.1 什么是DOM
文档对象模型(Document Object Model,简称DOM),是 W3C 组织推荐的处理可扩展标记语言(html或者xhtml)的标准编程接口。
W3C 已经定义了一系列的 DOM 接口,通过这些 DOM 接口可以改变网页的内容、结构和样式。
DOM是W3C组织制定的一套处理 html和xml文档的规范,所有的浏览器都遵循了这套标准。
1.2.2. DOM树
DOM树 又称为文档树模型,把文档映射成树形结构,通过节点对象对其处理,处理的结果可以加入到当前的页面。
- 文档:一个页面就是一个文档,DOM中使用document表示
- 标签节点:网页中的所有标签,通常称为元素节点,又简称为“元素”,使用element表示
- 节点:网页中的所有内容,在文档树中都是节点(标签、属性、文本、注释等),使用node表示
DOM把以上内容都看做是对象
1.3. 获取元素(重要!!)
场景:DOM在我们实际开发中主要用来操作元素。我们如何来获取页面中的元素呢?
常见页面中获取元素的方式如下:
- 根据 ID 获取
- 根据标签名获取
- 通过 HTML5 新增的方法获取
- 特殊元素获取
1.3.1. 根据ID获取
// 语法:document.getElementById(id)
// 作用:根据ID获取元素对象
// 参数:id值,区分大小写的字符串
// 返回值:元素对象 或 null
案例代码
<body>
<div id="time">2019-9-9</div>
<script>
// 因为我们文档页面从上往下加载,所以先得有标签 所以我们script写到标签的下面
var timer = document.getElementById('time');
console.log(timer);
console.log(typeof timer); // object
// console.dir 打印我们返回的元素对象 更好的查看里面的属性和方法
console.dir(timer);
</script>
</body>
1.3.2. 根据标签名获取某类元素
// 语法:document.getElementsByTagName('标签名') 或者 element.getElementsByTagName('标签名')
// 作用:根据标签名获取元素对象
// 参数:标签名
// 返回值:元素对象集合(伪数组,数组元素是元素对象)
案例代码
<body>
<ul>
<li>知否知否,应是等你好久11</li>
<li>知否知否,应是等你好久11</li>
<li>知否知否,应是等你好久11</li>
<li>知否知否,应是等你好久11</li>
</ul>
<ol id="ol">
<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.getElementsByTagName('标签名'); 父元素必须是指定的单个元素
// var ol = document.getElementsByTagName('ol'); // [ol]
// console.log(ol[0].getElementsByTagName('li'));
var ol = document.getElementById('ol');
console.log(ol.getElementsByTagName('li'));
</script>
</body>
注意
getElementsByTagName()获取到是动态集合,即:当页面增加了标签,这个集合中也就增加了元素。
得到的对象是个集合,要循环操作具体元素,需要遍历
1.3.3. H5新增获取元素方式
案例代码
<body>
<div class="box">盒子1</div>
<div class="box">盒子2</div>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<div id="test">
<ul>
<li>首页test</li>
<li>产品test</li>
</ul>
</div>
<script>
// 1. getElementsByClassName 根据类名获得某些元素集合
var boxs = document.getElementsByClassName("box")
console.log(boxs);
// 2. querySelector(css选择器)
// 返回指定选择器的第一个元素对象 选择器 需要加符号
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(css选择器)
// 返回指定选择器的所有元素对象集合
var allBox = document.querySelectorAll('.box')
console.log(allBox);
var allli = document.querySelectorAll('li')
console.log(allli);
// 4.可以用 querySelectorAll 获取 test 下面的小li
var testlis = document.querySelectorAll('#test li');
console.log(testlis);
</script>
</body>
1.3.4 获取特殊元素(body,html)
- 获取body元素 document.body
- 获取html元素 document.documentElement
// 1. 获取body元素 document.body
var body = document.querySelector('body');// 可以获取
console.log(body);
var bodyEle = document.body;// 可以获取 // 推荐这种
console.log(bodyEle);
console.dir(bodyEle);
// 2. 获取html元素 document.documentElement
var html = document.querySelector('html');// 可以获取
console.log(html);
var htmlEle = document.html; // 无法获取
console.log(htmlEle); // undefined
var htmlEle = document.documentElement;// 可以获取
// 推荐这种
console.log(htmlEle);
1.4. 事件基础
1.4.1. 事件概述
JavaScript 使我们有能力去实现动态页面 ,而事件是可以被理解成 JavaScript 侦测到的行为。
简单理解: 触发— 响应机制。
网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个 事件,然后去执行某些操作。
1.4.2. 事件三要素
- 事件源(谁):触发事件的元素
- 事件类型(什么事件): 例如 click 点击事件
- 事件处理程序(做啥):事件触发后要执行的代码(函数形式),事件处理函数
案例代码
<body>
<button id="btn">唐伯虎</button>
<script>
// 点击一个按钮,弹出对话框
// 1. 事件是有三部分组成 事件源 事件类型 事件处理程序 我们也称为事件三要素
//(1) 事件源 事件被触发的对象 谁 按钮
var btn = document.getElementById('btn');
//(2) 事件类型 如何触发 什么事件 比如鼠标点击(onclick) 还是鼠标经过 还是键盘按下
//(3) 事件处理程序 通过一个函数赋值的方式 完成
btn.onclick = function() {
alert('点秋香');
}
</script>
</body>
1.4.3. 执行事件的步骤
案例代码
<body>
<div>123</div>
<script>
// 执行事件步骤
// 点击div 控制台输出 我被选中了
// 1. 获取事件源
var div = document.querySelector('div');
// 2.绑定事件 注册事件
// div.onclick
// 3.添加事件处理程序
div.onclick = function() {
console.log('我被选中了');
}
</script>
</body>
1.4.4. 分析事件三要素
京东首页轮播图 点击箭头 轮播图 切换
事件源:小箭头 事件类型:点击事件 事件处理程序:轮播图切换
1.4.4. 常见的鼠标事件
1.5. 操作元素
JavaScript的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容、属性等。(注意:这些操作都是通过元素对象的属性实现的)
1.5.1. 改变元素内容(获取或设置)
innerText和innerHTML的区别:
- 获取内容时的区别:
innerText会去除空格和换行,而innerHTML会保留空格和换行
- 设置内容时的区别:
innerText不会识别html,而innerHTML会识别
<body>
<div>我是div</div>
<p>
我是文字
<span>123</span>
</p>
<script>
// 操作元素之修改元素内容 element.innerText / element.innerHTML
// 用法 1.设置值 2.取值 (属性是可读写)
var div = document.querySelector('div');
// div.innerText = '12312'; // 可以设置值
// div.innerText = '<h1>asdasda</h1>'; // 不识别html标签 非标准属性
// div.innerHTML = '12312'; // 可以设置值
div.innerHTML = '<h1>122</h1>'; // 识别html标签 W3C标准
var p = document.querySelector('p')
console.log('p.innerHTML', p.innerHTML); // 获取标签内的所有内容 包括子标签,空格换行
console.log('p.innerText', p.innerText); // 获取标签内的所有文本内容 不包括 标签 空格换行
</script>
</body>
案例–点击按钮显示当前时间
<body>
<button> 显示当前系统时间 </button>
<div> 某个时间 </div>
<p>12312</p>
<script>
// 实现效果: 当我们点击了按钮div里面的内容显示成当前时间
// 1.获取元素
var btn = document.querySelector('button');
var div = document.querySelector('div');
// 2.注册事件
btn.onclick = function() {
div.innerText = getDate()
}
// 3.加上对应的处理程序
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>
1.5.2. 元素的常用属性操作
- innerText,innerHTML 改变元素内容
- src , href
- Id,alt,title
获取属性的值
元素对象.属性名
设置属性的值
元素对象.属性名 = 值
<body>
<div title="刘德华" id="test">
操作元素属性的值 以title为例
</div>
<script>
// 操作元素属性的值 以title为例
// 1. 获取
// element.属性
var div = document.querySelector('div')
console.log(div.id);
console.log(div.title);
console.dir(div);
// 2.设置
// element.属性 = 'XXXXX'
div.title = '刘德华刘德华刘德华刘德华刘德华'
</script>
</body>
案例代码–点击按钮,切换图片
<body>
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button> <br>
<img src="images/ldh.jpg" alt="" title="刘德华">
<script>
// 实现效果:点击按钮,切换图片
// 修改元素属性 src
// 1. 获取元素
var ldh = document.querySelector('#ldh');
var zxy = document.getElementById('zxy');
var img = document.querySelector('img')
// 2. 注册事件 处理程序
ldh.onclick = function() {
img.src = 'images/ldh.jpg'
img.title = '刘德华'
}
zxy.onclick = function() {
img.src = 'images/zxy.jpg'
img.title = '张学友'
}
</script>
</body>
1.5.3. 案例:分时问候
// 1.获取元素
var img = document.querySelector('img');
var div = document.querySelector('div');
// 2.获取当前小时数
var h = (new Date()).getHours();
// 3.做判断
if (h<12) {
img.src = 'images/s.gif'
div.innerHTML = '大家上午好,好好写代码'
} else if (h<18) {
img.src = 'images/x.gif'
div.innerHTML = '大家x午好,好好写代码'
} else {
img.src = 'images/w.gif'
div.innerHTML = '大家晚上好,好好写代码'
}
1.5.4. 表单元素的属性操作
获取属性的值
元素对象.属性名
设置属性的值
元素对象.属性名 = 值
表单元素中有一些属性如:disabled、checked、selected,元素对象的这些属性的值是布尔型。
案例代码
<body>
<button>按钮</button>
<input type="text" value="输入内容">
<script>
// 实现效果:点击按钮 input的内容显示成被点击了
// 操作元素之表单属性(value/disabled/checked/selected)
// 1. 获取元素
var btn = document.querySelector('button');
var input = document.querySelector('input');
// 2.事件绑定
btn.onclick = function () {
// input.innerHTML = '被点击了' // innerHTML 给普通标签用的
// 表单里的值是通过 value 来改变的
input.value = '被点击了'
// 表单(button按钮)禁用 disabled = true
// btn.disabled = true;
// this 指向函数调用者 btn
this.disabled = true;
}
// q1: 表单里的值是通过谁来改变的???value
// q2: 表单(button按钮)禁用可以用什么属性???disabled
</script>
</body>
1.5.5. 案例:仿京东显示密码
<body>
<div class="box">
<label for="">
<img id="ele" src="./images/close.png" alt="" srcset="">
</label>
<input type="password" name="" id="pwd" class="">
</div>
<script>
// 1.获取元素
var ele = document.getElementById('ele');
var pwd = document.getElementById('pwd');
// 2.注册事件
var flag = 0
ele.onclick = function() {
// 点击一次之后, flag 一定要变化
if (flag == 0) {
ele.src = 'images/open.png'
pwd.type = 'text'
flag = 1 // 赋值操作
} else {
ele.src = 'images/close.png'
pwd.type = 'password'
flag = 0
}
}
</script>
</body>
1.5.6. 样式属性操作
我们可以通过 JS 修改元素的大小、颜色、位置等样式。
常用方式
方式1:通过操作style属性
元素对象的style属性也是一个对象!
元素对象.style.样式属性 = 值;
注意:
- JS 里面的样式采取驼峰命名法 比如 fontSize、 backgroundColor
- JS 修改 style 样式操作,产生的是行内样式,CSS 权重比较高
案例代码
<body>
<div style="width: 250px; height:250px" class="test"></div>
<script>
// 样式属性操作
// 常用的两种方式:element.style / element.className
// 用法两种:1.取值 2.设置值
// var div = document.querySelector('div')
// console.log(div.style.width); // 250px 取的是行内样式
// div.style.width = '400px'; // 设置值的必须带上单位
// console.log(div.className); // 'test'
// div.className = 'test1'; // 如何赋值 会直接覆盖 原有的值
// 1.获取元素
var div = document.querySelector('div')
// 2.注册事件 处理程序
div.onclick = function () {
// 注意这个属性 采用驼峰写法
this.style.backgroundColor = 'purple'
this.style.width = '250px'
}
// 需求:点击盒子,盒子背景颜色改成紫色,宽度变成200
</script>
</body>
案例:淘宝点击关闭二维码
<body>
<div class="box">
淘宝二维码
<img src="images/tao.png" alt="">
<i class="close-btn">×</i>
</div>
<script>
// 例子效果:点击关闭按钮 关闭淘宝的二维码
// 1. 获取元素
var closeBtn = document.querySelector('.close-btn');
var box =document.querySelector('.box');
// 2.注册事件 程序处理
closeBtn.onclick = function() {
box.style.display = 'none'
}
</script>
</body>
案例:循环精灵图背景
<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>
案例:显示隐藏文本框内容
<body>
<input type="text" value="手机">
<script>
// 获得焦点事件 onfocus 失去焦点事件 onblur
// 1.获取元素
var input = document.querySelector('input');
// 2.注册事件
input.onfocus = function () {
if (this.value === '手机') {
this.value = ''
}
// 获得焦点需要把文本框里面的文字颜色变黑
this.style.color = '#333'
}
input.onblur = function () {
if (this.value === '') {
this.value = '手机'
}
// 失去焦点需要把文本框里面的文字颜色变浅色
this.style.color = '#999'
}
</script>
</body>
方式2:通过操作className属性
元素对象.className = 值;
因为class是关键字,所以使用className。
案例代码
<body>
<div class="first">文本</div>
<script>
// 1. 使用 element.style 获得修改元素样式 如果样式比较少 或者 功能简单的情况下使用
var test = document.querySelector('div');
test.onclick = function() {
// this.style.backgroundColor = 'purple';
// this.style.color = '#fff';
// this.style.fontSize = '25px';
// this.style.marginTop = '100px';
// 2. 我们可以通过 修改元素的className更改元素的样式 适合于样式较多或者功能复杂的情况
// 3. 如果想要保留原先的类名,我们可以这么做 多类名选择器
// this.className = 'change';
this.className = 'first change';
}
</script>
</body>
案例:密码框格式提示错误信息
<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 (this.value.length < 6 || this.value.length > 16) {
// console.log('错误');
message.className = 'message wrong';
message.innerHTML = '您输入的位数不对要求6~16位';
} else {
message.className = 'message right';
message.innerHTML = '您输入的正确';
}
}
</script>
</body>
1.6. 今日总结
点击跳转第二天👉 | https://blog.csdn.net/weixin_46862327/article/details/124154254 |
---|