JS的组成
Web APIs与javascript基础的区别
Web APIs是javascript基础的应用,大量使用javascript基础做页面交互效果
API与Web APIs的区别
- API是提供给程序员的一种工具,会使用即可
- Web API是浏览器提供的一套操作浏览器功能与页面元素的API(DOM与BOM)
- Web API一般都有输入与输出(函数的传参与返回值)针对浏览器做交互效果
DOM
DOM:文档对象模型,提供访问与操作网页内容的接口与方法,通过DOM,可以改变网页结构的外观与样式
DOM树
- 一个页面就是一个文档,用document表示
- 页面中所有的元素被称为标签,用element表示
- 页面所有的内容被称为节点,用node表示
获取元素
通过id名获取元素
通过getElementById(id)获取
注意事项
- 返回值是一个元素对象
- 参数是一个大小写敏感的字符串
- js代码从上往下依次执行,所以script元素写在body元素的下面
- console.dir可以打印返回的元素对象,更好的查看元素的属性与方法
<!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>通过id名获取元素</title>
</head>
<body>
<div id='box'>hello word</div>
</body>
<script>
var box = document.getElementById('box');
console.log(box);
console.log(typeof box);
console.dir(box)
</script>
</html>
通过标签名获取元素
根据getElementsByTagName(‘标签名’)获取
注意事项
- 参数是一个大小写敏感的字符串
- 返回值是一个元素对象集合,以伪数组的方式进行存储
- 通过遍历可以获取每一个元素对象
<!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>
<ul>
<li>CSDN 程序员的天堂</li>
<li>CSDN 程序员的天堂</li>
<li>CSDN 程序员的天堂</li>
<li>CSDN 程序员的天堂</li>
<li>CSDN 程序员的天堂</li>
<li>CSDN 程序员的天堂</li>
</ul>
</body>
<script>
var lis = document.getElementsByTagName('li');
console.log(lis);
for (var i = 0; i < lis.length; i++) {
console.log(lis[i]);
}
</script>
</html>
获取某个元素里面的标签(曲线救国)
思路如下
- 先获取元素的id
- 通过元素的id获取元素的标签名
<!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>
<!-- 要求如下:获取第二个ul里面的li -->
<ul>
<li>hello word</li>
<li>hello word</li>
<li>hello word</li>
<li>hello word</li>
<li>hello word</li>
</ul>
<ul id="UI">
<li>尧子陌</li>
<li>尧子陌</li>
<li>尧子陌</li>
<li>尧子陌</li>
<li>尧子陌</li>
<li>尧子陌</li>
</ul>
</body>
<script>
var ul = document.getElementById('UI');
var lis = ul.getElementsByTagName('li');
console.log(lis);
</script>
</html>
通过类名获取元素
通过getElementsByClassName(‘类名’)来获取元素
注意事项
- 参数为一个大小写敏感的字符串
- 返回值是一个元素对象集合
- 具有兼容性(h5新增)
<!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>通过类名获取元素</title>
</head>
<body>
<div class="box"></div>
<div class="box"></div>
</body>
<script>
var boxs = document.getElementsByClassName('box');
console.log(boxs)
</script>
</html>
通过querySelector(‘选择器’)来获取元素
注意事项
- 可以获取指定选择器的第一个元素对象
- 参数里面的选择器要加符号
<!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>通过类名获取元素</title>
</head>
<body>
<div class="box"></div>
<div class="box"></div>
</body>
<script>
var boxs = document.getElementsByClassName('box');
console.log(boxs)
</script>
</html>
通过querySelectorAll(‘选择器’)来获取元素
注意事项
- 返回值是指定选择器的所有元素对象集合。
- 参数里面的选择器必须要加符号
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>通过querySelectorAll('选择器')来获取元素对象</title>
</head>
<body>
<ul id="box">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</body>
<script>
var box = document.getElementById('box')
var lis = box.querySelectorAll('li');
console.log(lis);
</script>
</html>
获取特殊元素(body html)
<!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>
</body>
<script>
var body = document.body;
console.log(body);
console.dir(body);
var html = document.documentElement;
console.log(html);
console.dir(html)
</script>
</html>
事件基础
javascript使我们有能力创建动态页面,但事件是可以被javascript侦测到的行为
触发 ------> 响应机制
事件三要素
- 事件源:事件被触发的对象
- 事件类型:触发什么样的事件,例如点击事件,键盘按下事件
- 事件处理程序:采用函数赋值的方式完成
事件三要素之唐伯虎点秋香
点击按钮 弹出唐伯虎点秋香的警示框
<!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>唐伯虎</button>
</body>
<script>
var bth = document.querySelector('button');
bth.onclick = function() {
alert('唐伯虎点秋香')
}
</script>
</html>
事件执行的步骤
1.获取事件源
2.绑定事件对象
3.事件处理程序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>事件执行的步骤</title>
<style>
div {
width: 200px;
height: 200px;
background-color: red;
}
</style>
</head>
<body>
<div></div>
</body>
<script>
// 获取事件源
var div = document.querySelector('div');
// 绑定事件类型并执行事件处理程序
div.onclick = function() {
console.log('hello word');
}
</script>
</html>
鼠标事件
操作元素
通过操作DOM可以改变元素的外观 结构 内容等
操作元素之改变元素内容
- element.innerHTML
- element.innerText
区别如下
- innerHTML是w3c推荐的标准,识别HTML标签 空格及换行
- innerText是非w3c推荐的标准,不识别HTML标签 空格及换行
- innerHTML及innerText都是实现可读写的
改变元素内容之习题1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>innerHTML执行的步骤</title>
<style>
div {
font: normal normal 20px '楷体';
color: blue;
}
</style>
</head>
<body>
<button>time</button>
<div></div>
</body>
<script>
var bth = document.querySelector('button');
var div = document.querySelector('div')
bth.onclick = function() {
div.innerHTML = getTimer()
}
function getTimer() {
var date = new Date();
var year = date.getFullYear(); //年
var mouth = date.getMonth(); //年
var day = date.getDate(); //当天日期
var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
var week = date.getDay(); //星期
return year + '年' + mouth + '月' + day + '日' + arr[week]
}
</script>
</html>
改变元素内容之习题2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>innerHTML及innerText</title>
</head>
<body>
<div> </div>
<p>
hello word
<span>尧子陌</span>
</p>
</body>
<script>
var div = document.querySelector('div');
div.innerHTML = '<strong>惊鸿</strong>'
var p = document.querySelector('p');
console.log(p.innerHTML);
console.log(p.innerText);
</script>
</html>
常用元素的属性
常用元素属性之习题一
点击对应按钮 显示对应的季节图片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>常用的属性</title>
<style>
img {
width: 528px;
height: 300px;
}
button:nth-of-type(1) {
margin-left: 0px;
}
button {
margin-left: 134px;
}
</style>
</head>
<body>
<img src="./upload/star.jpeg" alt="星星">
<br />
<button id="spring">春</button>
<button id="summer">夏</button>
<button id="fall">秋</button>
<button id="winter">冬</button>
</body>
<script>
var img = document.querySelector('img');
var spring = document.getElementById('spring');
var summer = document.querySelector('#summer');
var fall = document.querySelector('#fall');
var winter = document.getElementById('winter')
spring.onclick = function() {
img.src = './upload/spring.jpg';
img.title = '春'
}
summer.onclick = function() {
img.src = './upload/summer.jpg';
img.title = '夏'
}
fall.onclick = function() {
img.src = './upload/autumn.jpeg';
img.title = '秋'
}
winter.onclick = function() {
img.src = './upload/winter.jpg';
img.title = '冬'
}
</script>
</html>
常用元素属性之习题二
根据不同的时间,来显示不同的图片及文字
思路如下
- 根据系统时间来进行判断,所以需要内置日期对象
- 利用多分支语句进行判断而设置不同的照片
- 需要一个div容器,根据时间的不同来设置不同的文字
- 需要一个图片容器,根据时间的不同来设置不同的时间
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>常用元素属性之习题2</title>
<style>
* {
margin: 0;
padding: 0;
}
img {
width: 600px;
height: 600px;
}
div {
font: normal normal 20px '宋体';
color: blue;
}
</style>
</head>
<body>
<img src="./upload/star.jpeg" alt="">
<div></div>
</body>
<script>
// 获取div及img的元素对象
var div = document.querySelector('div');
var img = document.querySelector('img')
// 获取内置对象之小时
var date = new Date();
var h = date.getHours();
console.log(h);
if (h < 12) {
img.src = './upload/morning.jpg';
div.innerHTML = '早晨好'
} else if (h < 18) {
img.src = './upload/midday.jpg';
div.innerHTML = '下午好'
} else {
img.src = 'upload/night.jpg';
div.innerHTML = '晚上好'
}
</script>
</html>
表单常用属性
注意事项
- 表单里面的值不能通过innerHTML及innerText来改变
- 表单里面的值通过value来改变
- this是当前事件函数的调用者
表单常用属性之习题1
点击当前按钮,表单的内容改变且按钮禁用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>表单常用属性之习题1</title>
</head>
<body>
<button>按钮</button>
<input type="text" value="可用">
</body>
<script>
var bth = document.querySelector('button');
var ipt = document.querySelector('input');
bth.onclick = function() {
ipt.value = '禁用';
this.disabled = true
}
</script>
</html>
表单常用属性之彷京东密码框
核心思路
点击眼睛按钮,input类型从密码框转换成输入框
步骤如下
-
一个按钮有两种状态,点击一次变为输入款类型,再次点击则为密码框类型
-
声明一个flag变量,当flag为0,表单类型为输入框,随后flag为1,当flag为1的时候,表单类型为密码框,flag为0
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>彷京东密码框</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
position: relative;
width: 400px;
height: 40px;
margin: 200px auto;
}
input {
outline: none;
width: 400px;
height: 40px;
border: 0;
border-bottom: 1px solid gray;
}
img {
position: absolute;
top: 10px;
left: 362px;
width: 25px;
}
</style>
</head>
<body>
<div class="box">
<label for="">
<img src="./upload/close.png" alt="" id="eyes">
</label>
<input type="password" id="ipt">
</div>
</body>
<script>
var eyes = document.querySelector('#eyes');
var ipt = document.querySelector('input');
var flag = 0;
eyes.onclick = function() {
if (flag == 0) {
ipt.type = 'text';
this.src = './upload/open.png';
flag = 1
} else {
ipt.type = 'password';
this.src = './upload/close.png';
flag = 0;
}
}
</script>
</html>
样式操作属性
- element.style:行内样式操作
- element.className:类名操作样式
注意事项
- 修改样式时采用驼峰式命名的写法,如fontSize,backgroundColor等等
- js修改的样式属于行内样式,占的比重比较高
样式操作属性之习题1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>样式操作属性之习题</title>
<style>
div {
width: 200px;
height: 200px;
background-color: red;
color: red;
}
</style>
</head>
<body>
<div></div>
</body>
<script>
var box = document.querySelector('div');
box.onclick = function() {
this.style.backgroundColor = 'yellow'
}
</script>
</html>
样式操作之二维码隐藏
核心思路
- 利用display属性来显示或隐藏元素。 dispaly:block(显示) dispaly:block(隐藏)
- 点击按钮,便让二维码隐藏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>样式操作之二维码</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
position: relative;
width: 160px;
margin: 200px auto;
}
img:nth-of-type(2) {
position: absolute;
top: -10px;
right: -14px;
}
</style>
</head>
<body>
<div class="box">
<img src="./upload/tao.png" alt="">
<img src="./upload/wrong.png" alt="" class="bth">
</div>
</body>
<script>
var box = document.querySelector('.box');
var bth = document.querySelector('.bth');
bth.onclick = function() {
box.style.display = 'none'
}
</script>
</html>
样式操作淘宝精灵图
思路如下
- 首先精灵图的图片是有规律可寻的
- 利用循环,修改精灵图的位置background-position
- i*44便是每个精灵图y坐标的位置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>样式操作之精灵图</title>
<style>
* {
margin: 0;
padding: 0;
}
ul {
width: 128px;
margin: 200px auto;
overflow: hidden;
list-style: none;
}
li {
float: left;
width: 24px;
height: 24px;
margin-left: 5px;
margin-bottom: 5px;
border: 1px solid gray;
background: url('./upload/sprite.png') no-repeat;
}
</style>
</head>
<body>
<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>
</body>
<script>
var lis = document.querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
var index = i * 44
console.log(lis[i]);
console.log(index);
console.log(lis[i].style.backgroundPosition = '0 -' + index + 'px');
}
</script>
</html>
样式操作之显示隐藏文本内容
需要两个事件:获得焦点事件及失去焦点事件
- 当获得焦点的时候,表单的内容则会被清空
- 当失去焦点的时候,表单的内容会恢复成默认值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>样式操作之显示与隐藏文本内容</title>
<style>
input {
display: block;
width: 200px;
margin: 200px auto;
padding-left: 20px;
color: #999;
}
</style>
</head>
<body>
<input type="text" value="手机">
</body>
<script>
// 获取元素对象
var ipt = document.querySelector('input');
// 绑定事件
ipt.onfocus = function() {
if (this.value == '手机') {
this.value = ''
}
this.style.color = '#333'
}
ipt.onblur = function() {
if (this.value == '') {
this.value = '手机'
}
this.style.color = '#999'
}
</script>
</html>
calssName操作样式
主要事项
- class是个关键字
- 如果样式比较多,采用类名操作样式属性等
- className会直接改变元素的类名,会覆盖原先的类名
className操作样式之习题1
点击div时,会添加多个类名来改变样式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>className来操作样式</title>
<style>
* {
margin: 0;
padding: 0;
}
div {
width: 200px;
height: 200px;
background: pink;
margin: 200px auto;
}
.box {
box-sizing: border-box;
width: 400px;
height: 400px;
background-color: blueviolet;
margin: 200px auto;
padding-top: 200px;
text-align: center;
font: normal normal 25px '楷体';
}
</style>
</head>
<body>
<div>文本</div>
</body>
<script>
// 获取事件源
var div = document.querySelector('div');
console.log(div);
div.onclick = function() {
this.className = 'box'
}
</script>
</html>
classNmae操作样式之密码框格式提示错误
- 首先判断的是否是失去焦点onblur
- 如果输入正确,则显示正确的信息并且图标提示为绿色
- 如果输入的字数不是6~11位,先显示错误的信息并且图标为红色
- 使用className来操作样式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>classNmae操作样式之密码框格式提示错误</title>
<style>
* {
margin: 0;
padding: 0;
}
.register {
width: 800px;
margin: 200px auto;
}
.message {
display: inline-block;
font-size: 12px;
color: #999;
background: url('./upload/mess.png') no-repeat;
padding-left: 20px;
}
.right {
background: url('./upload/right.png') no-repeat;
color: green;
}
.wrong {
background: url('./upload/wrong.png') no-repeat;
color: red;
}
</style>
</head>
<body>
<div class="register">
<input type="password">
<p class="message">请输入6~16位密码</p>
</div>
</body>
<script>
// 获取元素对象
var ipt = document.querySelector('input');
var message = document.querySelector('.message');
//进行内部处理得出结果
ipt.onblur = function() {
if (this.value.length < 6 || this.value.length > 16) {
message.innerHTML = '输入的信息有误';
message.className = 'message wrong'
} else {
message.innerHTML = '输入的信息正确';
message.className = 'message right'
}
}
</script>
</html>