1.Web APIs 和JS基础关联性
1.1 JS组成
- ECMAScript : JavaScript基础
- DOM:页面文档对象模型
- BOM :浏览器对象模型
DOM与BOM即为Web APIs部分
1.2 JS基础阶段和Web APIs
1.JS基础阶段
- 学习ECMAScript标准规定的基本语法,但做不了常用的网页交互效果,目的时为了JS后边的课程打基础、做铺垫
2.Web APIs阶段
- Web APIs是W3C组织的标准,主要学习其中的DOM和BOM,Web APIs是JS独有的部分,要学习页面交互功能
2.API和Web API
2.1 API
是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或者硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节,简单来说,就是给程序员提供的一种工具,一边能更轻松的实现想要的功能。只要会使用就可以了,不用纠结内部如何实现。
2.2 Web API
是浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM),只要针对浏览器提供的接口,做交互效果,Web API一般都有输入和输出(函数大的传参和返回值),Web API很多都是方法(函数)。
MDN详解API:Web API 接口参考 | MDN (mozilla.org)
3.DOM
3.1 什么是DOM
文档对象模型,是W3C组织推荐的处理可扩展标记语言(HTML胡总和XML)的标准编程接口。通过这些接口我们可以改变网页的内容、结构和样式
3.2 DOM树
- 文档:一个页面就是一个文档,DOM中使用document表示
- 元素:网页中的所有标签都是元素,DOM中使用element表示
- 节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中用node表示
- DOM把以上内容都可以看作是对象
4.获取元素
- 根据ID
- 根据标签名
- 通过HTML5新增的方法获取
- 特殊元素获取
4.1 根据ID获取
- 使用getElementByld()方法
// 1. 因为我们文档页面从上往下加载,所以先得有标签 所以我们script写到body标签的下部
// 2. get 获得 element 元素 by 通过 驼峰命名法
// 3. 参数 id是大小写敏感的字符串
// 4. 返回的是一个元素对象
var timer = document.getElementById('time');
console.log(timer);
console.log(typeof timer); //object
// 5. console.dir 打印我们返回的元素对象 更好的查看里面的属性和方法
console.dir(timer);
4.2 根据标签名
- 使用getElementsByTagName()方法可以返回带有指定标签名的对象的集合
注意:因为得到的是一个对象的集合,所以我们想要操作里面的元素就要遍历,而且得到的元素对象是动态的(跟着HTML里的变化而变化)
// 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')); 会报错,ol是一个伪数组,不能用getElementsByTagName
4.3 通过HTML5新增的方法获取
- 使用getElementsByClassName(‘类名’) 返回集合
- document.querySelector('选择器); 返回指定选择器的第一个元素对象
- querySelectorAll(‘选择器’); 返回指定选择器的所有元素对象集合
4.4 获取特殊元素(body,html)
1.获取body元素
- document.body
2.获取html元素
- document.documentElement
5.事件基础
3.1 概述
JavaScript使我们有能力创建动态页面,而时间是可以被JavaScript侦测到的行为
简单理解:触发-响应机制
事件是有三部分组成 事件源(谁:按钮元素) 事件类型(方式:点击) 事件处理程序(一个匿名函数:弹出信息) 我们也称为事件三要素
3.2 执行事件的步骤
1.获取事件源
2.注册事件(绑定事件)
3.添加时间处理程序(采用函数形式)
<div>123</div>
<script>
// 执行事件步骤
// 点击div 控制台输出 我被选中了
// 1. 获取事件源
var div = document.querySelector('div');
// 2.绑定事件 注册事件
// div.onclick
// 3.添加事件处理程序
div.onclick = function() {
console.log('我被选中了');
}
</script>
6.操作元素
JavaScript的DOM操作可以改变网页内容、结构和样式,我们可利用DOM操作元素来改变元素里面的内容、属性等等
6.1 改变元素内容
- innerText 和innerHTML都可以改变元素内容,这是普通盒子才有的,比如div标签
btn.onclick = function () {
div.innerText = '2019-6-6';
div.innerHTML = getDate();
}
-
区别:
- innerText不识别HTML标签(非标准),而innerHTML会识别(W3C标准)
// 1. innerText 不识别html标签 非标准 var div = document.querySelector('div'); div.innerText = '<strong>今天是:</strong> 2019'; // 2. innerHTML 识别html标签 W3C标准 div.innerHTML = '<strong>今天是:</strong> 2019';
- 这两个属性是可读写的 ,可以获取元素里面的内容,用法如下
var p = document.querySelector('p'); console.log(p.innerText); console.log(p.innerHTML);
- innerText:从初始到终止位置的内容,但去除HTML标签,去掉空格和换行
- innerHTML:从初始到终止位置的内容,包括HTML标签,保留空格和换行
6.2 常用元素的操作属性
改变元素属性时使用 ‘.’
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button> <br>
<img src="images/ldh.jpg" alt="" title="刘德华">
<script>
// 修改元素属性 src
// 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>
6.3 表单元素的属性操作
利用DOM可以操作如下表单属性:type、value、checked、selected、disabled
button.onclick = function() {
// input.innerHTML = '点击了'; 这个是 普通盒子 比如 div 标签里面的内容
// 表单里面的值 文字内容是通过 value 来修改的
input.value = '被点击了';
// 如果想要某个表单被禁用 不能再点击 disabled 我们想要这个button禁用
// btn.disabled = true;
this.disabled = true;
// this 指向的是事件函数的调用者 btn ,上边两种都可以
}
仿京东案例:登录输入时为隐藏密码,点击眼睛就可以看见密码
- 核心思路:点击眼睛按钮,将密码框文本类型换成文本框就饿可以看见密码啦,一个按钮要有两个状态,点击一次,变成文本框,再点一次变成密码框(算法,利用一个flag变量,来判断它的值)
<div class="box"> <label for=""> <img src="images/close.png" alt="" id="eye"> </label> <input type="password" name="" id="pwd"> </div>
.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; }
// 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; } }
6.4 修改元素样式属性
我们可以通过JS修改元素的大小、颜色、位置等样式
1.element.style 行内样式操作
// 1. 获取元素
var div = document.querySelector('div');
// 2. 注册事件 处理程序
div.onclick = function() {
// div.style里面的属性 采取驼峰命名法
this.style.backgroundColor = 'purple';
this.style.width = '250px';
}
注意:JS修改style样式操作,产生的是行内样式(即写在标签里的样式),CSS权重比较高,如果冲突以JS为主
案例:显示和隐藏某元素
- 利用样式的显示和隐藏,display:none 隐藏元素 display:block显示元素
<div class="box"> 淘宝二维码 <img src="images/tao.png" alt=""> <i class="close-btn">×</i> </div>
.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; /*悬浮时为一个手*/ }
// 1. 获取元素 var btn = document.querySelector('.close-btn'); var box = document.querySelector('.box'); // 2.注册事件 程序处理 btn.onclick = function() { box.style.display = 'none'; }
案例:循环精灵图
<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>
* { 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; }
// 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'; // background-position: 0 0 ; 第一个值是水平位置,第二个值是垂直位置。左上角是 0 0 // 这里面的 0 -i*44 其实就是将图片往上移动44*i像素 以获取每一个精灵图(纵向的图) }
2.两个新的表单事件:获得焦点(onfocus)和失去焦点(onblur)
// 1.获取元素
var text = document.querySelector('input');
// 2.注册事件 获得焦点事件 onfocus
text.onfocus = function() {
// console.log('得到了焦点');
if (this.value === '手机') {
this.value = '';
}
// 获得焦点需要把文本框里面的文字颜色变黑
this.style.color = '#333';
}
// 3. 注册事件 失去焦点事件 onblur
text.onblur = function() {
// console.log('失去了焦点');
if (this.value === '') {
this.value = '手机';
}
// 失去焦点需要把文本框里面的文字颜色变浅色
this.style.color = '#999';
}
3.element.className 类名样式操作
- 因为class是一个保留字,因此使用className来操作元素类名属性
- className会直接更改元素的类名,会覆盖原先的类名
<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>
div {
width: 100px;
height: 100px;
background-color: pink;
}
.change {
background-color: purple;
color: #fff;
font-size: 25px;
margin-top: 100px;
}
</style>
</head>
<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';
// 这样改变样式太繁琐了,让我们当前元素的类名改为了 change
// 2. 我们可以通过 修改元素的className更改元素的样式 适合于样式较多或者功能复杂的情况
// 3. 如果想要保留原先的类名,我们可以这么做 多类名选择器
// this.className = 'change';
this.className = 'first change';
}
</script>
</body>
案例:输入位数检测
<div class="register"> <input type="password" class="ipt"> <p class="message">请输入6~16位密码</p> </div>
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的,所以下边设置的padding只是把图片上的文字给了一个padding,图片不动 */ padding-left: 20px; } .wrong { color: red; background-image: url(images/wrong.png); } .right { color: green; background-image: url(images/right.png); }
// 首先判断的事件是表单失去焦点 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 = '您输入的正确'; } }