JS 的组成
1. Web API介绍
1.1 API的概念
-
API
(Application Programming Interface
,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,无需理解其内部工作机制细节,只需直接调用使用即可。
1.2 Web API的概念
Web API
是浏览器提供的一套操作浏览器功能和页面元素的API
(BOM
和DOM
)。现阶段我们主要针对于浏览器讲解常用的
API
, 主要针对浏览器做交互效果。比如我们想要浏览器弹出一个警示框, 直接使用alert(‘弹出’)
。此处的 Web API 特指浏览器提供的一系列API(很多函数或对象方法),即操作网页的一系列工具。例如:操作html标签、操作页面地址的方法。
1.3 API 和 Web API 总结
API 是为我们程序员提供的一个接口,帮助我们实现某种功能,我们会使用就可以了,不必纠结内部如何实现;
Web API 主要是针对于浏览器提供的接口,主要针对于浏览器做交互效果。;
Web API 一般都有输入和输出(函数的传参和返回值),Web API 很多都是方法(函数);
学习 Web API 可以结合前面学习内置对象方法的思路学习。
2. DOM 介绍
2.1 什么是DOM
文档对象模型(
Document Object Model
,简称DOM
),是 W3C 组织推荐的处理可扩展标记语言(html
或者xhtml
)的标准编程接口。W3C
已经定义了一系列的DOM
接口,通过这些DOM
接口可以改变网页的内容、结构和样式。DOM
是W3C
组织制定的一套处理html
和xml
文档的规范,所有的浏览器都遵循了这套标准。
2.2 DOM树
-
DOM
树 又称为文档树模型,把文档映射成树形结构,通过节点对象对其处理,处理的结果可以加入到当前的页面。
- 文档:一个页面就是一个文档,
DOM
中使用document
表示;- 节点:网页中的所有内容,在文档树中都是节点(标签、属性、文本、注释等),使用
node
表示;- 标签节点:网页中的所有标签,通常称为元素节点,又简称为“元素”,使用
element
表示。
3. 获取元素
为什么要获取页面元素?
- 例如:我们想要操作页面上的某部分(显示/隐藏,动画),需要先获取到该部分对应的元素,再对其进行操作。
3.1 根据ID获取
语法:
document.getElementById(id)
;
作用:根据ID
获取元素对象;
参数:id
值,区分大小写的字符串;
返回值:元素对象 或null
。
案例代码
<div id="time">2020-11-29</div>
<script>
// 1. 因为我们文档页面从上往下加载的,所以需要先有标签
let timeDiv = document.getElementById('time');
console.log(typeof timeDiv); // Object
console.dir(timeDiv); // 打印返回的元素对象
</script>
3.2 根据标签名获取元素
语法:
document.getElementsByTagName('标签名')
或者element.getElementsByTagName('标签名')
;
作用:根据标签名获取元素对象;
参数:标签名;
返回值:元素对象集合(伪数组,数组元素是元素对象)。
案例代码
<body>
<ul id="first">
<li>知否知否</li>
<li>知否知否</li>
<li>知否知否</li>
<li>知否知否</li>
<li>知否知否</li>
</ul>
<ul id="second">
<li>哈哈哈哈</li>
<li>哈哈哈哈</li>
<li>哈哈哈哈</li>
<li>哈哈哈哈</li>
<li>哈哈哈哈</li>
<li>哈哈哈哈</li>
</ul>
<script>
let liTag = document.getElementsByTagName('li');
console.log(liTag);
// 打印里面的元素
for (let i = 0; i < liTag.length; i++) {
console.log(liTag[i]);
}
// 如果执行获取第二个ul中的li
let secondUl = document.getElementById('second');
let secondLi = secondUl.getElementsByTagName('li');
// 打印里面的元素
for (let i = 0; i < secondLi.length; i++) {
console.log(secondLi[i]);
}
</script>
</body>
注意:getElementsByTagName()获取到是动态集合,即:当页面增加了标签,这个集合中也就增加了元素。
3.3 H5新增获取元素方式
注意:querySelector和querySelectorAll里面的选择器需要加上选择器对应的符号,比如:document.querySelector('#nav')
案例代码
<body>
<div class="box">盒子1</div>
<div class="box">盒子2</div>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
/* H5新增获取元素的方法 */
let boxs = document.getElementsByClassName('box');
console.log(boxs);
/* querySelector返回指定选择器的第一个元素对象切记里面的选择器需要加上指定的符号 */
let firstBox = document.querySelector('.box');
console.log(firstBox);
let nav = document.querySelector('#nav');
console.log(nav);
let firstLi = document.querySelector('li');
console.log(firstLi);
/* 返回指定选择器的所有元素对象 */
let boxList = document.querySelectorAll('.box');
console.log(boxList);
let lis = document.querySelectorAll('li');
console.log(lis);
</script>
</body>
3.4 获取特殊元素
- 获取body元素:
let bodyEle = document.body;
- 获取html元素:
let htmlEle = document.documentElement;
4. 事件基础
4.1 事件概述
JavaScript
使我们有能力创建动态页面,而事件是可以被JavaScript
侦测到的行为。简单理解: 触发--- 响应机制 。
网页中的每个元素都可以产生某些可以触发
JavaScript
的事件,例如,我们可以在用户点击某按钮时产生一个 事件,然后去执行某些操作。
4.2 事件三要素
事件源(谁):触发事件的元素;
事件类型(什么事件): 例如 click 点击事件;
事件处理程序(做啥):事件触发后要执行的代码(函数形式),事件处理函数。
案例代码
- 点击一个案例弹出一个
alert()
提示框。
<body>
<button id="btn">点我</button>
<script>
// 点击一个按钮弹出对话框
// 1. 事件是由三部分组成的 事件源 事件类型 事件处理程序
// a. 事件源 事件被处罚的对象
let btn = document.getElementById('btn');
// b. 事件类型 :如何触发什么事件 比如鼠标点击还是鼠标经过
// c. 事件处理程序
btn.onclick = function () {
alert('您点我了!')
}
</script>
</body>
4.3 执行事件的步骤
获取事件源;
注册事件;
添加事件处理程序(采取函数形式赋值)。
案例代码
<body>
<div>123</div>
<script>
// 事件执行的步骤
// 点击div 控制台输出我被选中了
// 1. 获取事件源
// 使用 document.getElementsByTagName('div') 获取到的div 元素注册的事件不生效
let div = document.querySelector('div');
console.log(div);
// 2. 绑定事件 注册事件
// div.onclick
// 3. 添加事件处理程序
div.onclick = function () {
console.log('我被选中了');
}
</script>
</body>
4.4 常见的鼠标事件
5. 操作元素
-
JavaScript
的DOM
操作可以改变网页内容、结构和样式,我们可以利用DOM
操作元素来改变元素里面的内容、属性等。(注意:这些操作都是通过元素对象的属性实现的)。
5.1 改变元素内容(获取或设置)
操作元素之改变元素内容
<body>
<button>点击获取时间</button>
<div>****-**-** **:**:**</div>
<script>
let btn = document.querySelector('button');
let div = document.querySelector('div');
btn.onclick = function () {
// 设置元素的内容为当前时间
div.innerText = getDate();
}
function getDate() {
let date = new Date();
let year = date.getFullYear(); // 获取当前的年份
let month = formatDate(date.getMonth() + 1); // 获取月份 需要进行 +1
let dates = formatDate(date.getDate()); // 获取日
let weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
let day = date.getDay(); // 获取今天是星期几
let hour = formatDate(date.getHours());
let minutes = formatDate(date.getMinutes());
let seconds = formatDate(date.getSeconds());
return '今天是:' + year + '年' + month + '月' + dates + '日' + ' ' + hour + ':' + minutes + ':' + seconds + ' ' + weeks[day];
}
function formatDate(param) {
return param < 10 ? '0' + param : param;
}
</script>
</body>
innerText和innerHTML的区别
获取内容时的区别:
innerText
会去除空格和换行,而innerHTML
会保留空格和换行;设置内容时的区别:
innerText
不会识别html
,而innerHTML
会识别。W3C标准。
这两个属性都是可读写的,既可以通过他们设置内容也可以通过他们获取内容。
<body>
<button>点我</button>
<div></div>
<p>
p标签
<span>
哈哈哈哈
</span>
</p>
<script>
// innerText 和 innerHTML 的区别
// 1. innerText 不识别html标签 并且去除空格和换行,非标准
let btn = document.querySelector('button');
let div = document.querySelector('div');
btn.onclick = function () {
// div.innerText = '<strong>加粗</strong> : 123'; // 不识别 html 标签
div.innerHTML = '<strong>加粗</strong> : 123';
}
// 2. innerHtml 识别html标签,W3C标准
// 3. 这两个属性是可读写的,可以获取元素里面的内容
// a. 通过 innerText 获取
let p = document.querySelector('p');
let pInnerText = p.innerText;
let pInnerHtml = p.innerHTML;
console.log(pInnerText); // 结果 p标签 哈哈哈哈
console.log(pInnerHtml); // 结果 p标签<span>哈哈哈哈</span>
</script>
</body>
5.2 常用元素的属性操作
获取属性的值
元素对象.属性名
设置属性的值
元素对象.属性名=值
案例代码
<body>
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button>
<img src="../images/ldh.jpg" alt="刘德华" title="刘德华">
<script>
let ldh = document.querySelector('#ldh');
let zxy = document.querySelector('#zxy');
let img = document.querySelector('img');
ldh.onclick = function () {
img.src = '../images/ldh.jpg';
img.title = '刘德华';
img.alt = '刘德华';
};
zxy.onclick = function () {
img.src = '../images/zxy.jpg';
img.title = '张学友';
img.alt = '张学友';
};
</script>
</body>
5.3 案例:分时问候
- 在不同的时间段内显示不同的图片和问候语:
<body>
<img src="../images/w.gif" alt="">
<div>晚上好</div>
<script>
let img = document.querySelector('img');
let div = document.querySelector('div');
let date = new Date();
let h = date.getHours();
if (h < 12) {
img.src = '../images/z.gif';
div.innerHTML = '早上好';
} else if (h < 18) {
img.src = '../images/x.gif';
div.innerHTML = '下午好';
} else {
img.src = '../images/w.gif';
div.innerHTML = '晚上好';
}
</script>
</body>
5.4 表单元素的属性操作
获取属性的值
元素对象.属性名
设置属性的值
元素对象.属性名 = 值
表单元素中有一些属性如:disabled、checked、selected,元素对象的这些属性的值是布尔型。
案例代码
<body>
<button>按钮</button>
<input type="text" value="请输入内容">
<script>
// this指向当前事件函数的调用者
let button = document.querySelector('button');
let input = document.querySelector('input');
/**
* 处理button的单击事件
*/
button.onclick = function () {
// 点击一次之后就将其禁用
this.disabled = true;
input.value = '被点击了';
}
</script>
</body>
5.5 案例:仿京东显示隐藏密码
-
点击右侧的显示或隐藏按钮显示或隐藏文本框中的密码:
<style>
.box {
position: relative;
width: 400px;
margin: 100px auto;
border-bottom: 1px solid #cccccc;
}
.box input {
width: 370px;
height: 30px;
outline: none;
border: none;
padding-left: 20px;
}
.box img {
position: absolute;
top: 2px;
right: 6px;
width: 24px;
cursor: pointer;
}
/* 去除密码框的默认小眼睛样式 */
input[type="password"]::-ms-reveal {
display: none
}
</style>
<body>
<div class="box">
<label for="password">
<img src="../../images/close.png" alt="" id="eye">
<input type="password" id="password">
</label>
</div>
<script>
let pwd = document.getElementById('password');
let eye = document.getElementById('eye');
let flag = 0;
eye.onclick = function () {
if (flag === 0) {
pwd.type = 'password';
this.src = '../../images/close.png';
flag = 1;
} else {
pwd.type = 'text';
this.src = '../../images/open.png';
flag = 0;
}
}
</script>
</body>
5.6 样式属性操作
- 当触发单击事件时,改变
div
样式。
<style>
div {
width: 200px;
height: 200px;
background-color: skyblue;
}
</style>
<body>
<div></div>
<script>
// 1. 获取元素
let div = document.querySelector('div');
// 2. 注册事件 // 3. 处理程序
div.onclick = function () {
// 行内样式 JS修改style样式操作产生的是行内样式,CSS权重比较高
this.style.backgroundColor = 'purple';
this.style.width = '230px';
}
</script>
</body>
- 我们可以通过
JS
修改元素的大小、颜色、位置等样式。
常用方式
element.style
行内样式。element.className
类名样式。如果原来的className
中有类名样式,此操作将对其进行覆盖。
通过操作style属性
元素对象的style属性也是一个对象!
元素对象.style.样式属性 = 值;
注意:JS
里面的样式采用驼峰命名法,比如fontSize
、 backgroundColor
。
JS
修改Style
样式操作,产生的行内样式CSS
权重比较高。
5.7 案例:淘宝点击关闭二维码
- 当鼠标点击二维码关闭按钮的时候则关闭整个二维码:
<style>
.box {
position: relative;
width: 200px;
height: 200px;
margin: 100px auto;
border: 1px solid #ccc;
text-align: center;
color: #EF522F;
border-radius: 6px;
-webkit-border-radius: 6px;
box-sizing: border-box;
}
.box img {
margin-top: 5px;
}
.box i {
position: absolute;
width: 20px;
height: 20px;
border: 1px solid #ccc;
left: -25px;
color: #ccc;
border-radius: 2px;
cursor: pointer;
}
</style>
<body>
<div class="box">
淘宝二维码
<img src="../images/tao.png" alt="">
<i class="close_btn" id="iBtn">x</i>
</div>
<script>
let iBtn = document.getElementById('iBtn');
let box = document.querySelector('.box');
iBtn.onclick = function () {
box.style.display = 'none';
}
</script>
</body>
5.8 案例 :循环精灵图
- 可以利用for循环设置一组 元素的精灵图背景:
<style>
ul {
list-style: none;
padding: 0;
margin: 0;
}
li {
padding: 0;
margin: 0;
}
.box {
width: 250px;
margin: 100px auto;
}
.box li {
float: left;
width: 24px;
height: 24px;
margin: 15px;
background-image: url(../images/sprite.png);
}
</style>
<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>
let lis = document.querySelectorAll('li');
for (let i = 0; i < lis.length; i++) {
let index = i * 44;
lis[i].style.backgroundPosition = '0 -' + index + 'px';
}
</script>
</body>
5.9 案例:显示和隐藏文本框内容
- 当鼠标点击文本框时,里面默认文字隐藏,当鼠标离开文本框时,里面文字显示。
<body>
<input type="text" value="手机">
<script>
let text = document.querySelector('input');
/**
* 当文本框获取焦点的时候
*/
text.onfocus = function () {
if (this.value === '手机') {
this.value = '';
}
// 当输入文字之后文字颜色变黑
this.style.color = '#333';
}
/**
* 鼠标失去焦点事件
*/
text.onblur = function () {
if (this.value === '') {
this.value = '手机';
}
// 当鼠标移开时文字颜色变浅
this.style.color = '#999'
}
</script>
</body>
通过操作className属性
元素对象.className = 值;
因为class是关键字,所有使用className。
注意
如果样式修改较多的时候可以采取操作类名的方式更改元素样式。
class
因为是保留字 ,因此使用className
来操作元素 类名属性。className
会直接更改元素的类名,会覆盖原先的类名。
案例代码
<style>
div {
width: 200px;
height: 200px;
background-color: skyblue;
}
.change {
background-color: purple;
margin-top: 100px;
color: #fff;
}
</style>
<body>
<div class="first">文本</div>
<script>
let changeClassName = document.querySelector('div');
changeClassName.onclick = function () {
// 可以通过修改元素的className更改元素的样式适合于样式较多或者功能复杂的情况
// 会直接覆盖原来的类名
// 如果想要保留原先的类名 可以这么做
// this.className = 'change';
this.className = 'first change';
// this.className += ' ' + 'change';
}
</script>
</body>
5.10 案例:密码框格式提示错误信息
- 用户如果离开密码框,里面输入 个数不是6~16时,提示错误信息,否则提示输入正确信息。
<style>
div {
width: 600px;
margin: 100px auto;
}
.message {
display: inline-block;
background: url(../images/mess.png) left center no-repeat;
padding-left: 20px;
font-size: 12px;
color: #999;
vertical-align: middle;
}
.wrong {
background-image: url(../images/wrong.png);
color: #f00;
}
.right {
background-image: url(../images/right.png);
color: #0f0;
}
</style>
<body>
<div class="registry">
<input type="password" class="ipt">
<p class="message">请输入6~16位的密码!</p>
</div>
<script>
let ipt = document.querySelector('.ipt');
let message = document.querySelector('.message');
ipt.onblur = function () {
if (this.value.length < 6 || this.value.length > 16) {
message.className = 'message wrong';
message.innerHTML = '您输入的不符合规范!'
} else {
message.className = 'message right';
message.innerHTML = '您输入正确!'
}
}
</script>
</body>