JavaScript
JavaScript
- JavaScript 一种直译式脚本语言,是一种动态类型、弱类型、 基于原型的语言,内置支持类型
- JavaScript 是当今最流行的脚本语言,我们生活中看到的网页 和基于 html5 的 app 里面的交互逻辑都是由 JavaScript 驱动的
- 一句话概括就是 JavaScript 是一种运行在浏览器中的解释型的编程语言
JS 的组成
- ECMAScript : 解释器、翻译者 (描述了该语言的语法和基本对 象) 它是 JavaScript 的标准。
- DOM : Document Object Model 文档对象模型 W3C 是 DOM 的标准。
- BOM : Browser Object Model 浏览器对象模型 缺乏标准。
演示
注册事件、找到目标元素、修改 CSS 属性
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #tim{
7 width: 200px;
8 height: 200px;
9 border:1px solid black;
10 margin:0 auto;
11 }
12 </style>
13</head>
14<body>
15 <div id="tim" onmouseover="tim.style.background='red'" onmouseout="tim.style.background='white'"></div>
16</body>
17</html>
获取标签元素
1# 返回这个id名的元素
2 document.getElementById('ID名')
3
4# 返回所有这个标 签名的元素的集合
5 document.getElementsByTagName('div')
6
7# 返回所有这个 class的元素的集合
8 document.getElementsByClassName('className')
9
10# 返回第一个
11 document.querySelector("css任意选择器")
12
13# 返回符合的所有
14 document.querySelectorAll("css任意选择器")
15
16# 获取HTML元素
17 document.documentElement
18
19# 获取body元素
20 document.body
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #tim{
7 width: 200px;
8 height: 200px;
9 border:1px solid black;
10 margin:0 auto;
11 }
12 </style>
13</head>
14<body>
15 <div id="tim" class="xiaod"></div>
16 <script type="text/javascript">
17 //返回这个id名的元素
18 // document.getElementById('tim').style.background='red'
19 //返回所有这个标签名的元素的集合 获取到的是一个集合,拥有数组的特性
20 // document.getElementsByTagName('div')[0].style.background='black'
21 //通过classname获取到的也是一个集合
22 // document.getElementsByClassName('xiaod')[0].style.background='yellow'
23 //document.querySelector("css任意选择器") 返回第一个
24 // document.querySelector("div").style.background='black'
25 //document.querySelectorAll("css任意选择器") 返回符合的所有
26 document.querySelectorAll("div")[0].style.background='red'
27 </script>
28</body>
29</html>
JS 编写的位置
- 一般情况下 JS 是写在页面的任何位置都可以的,需要 script 标签包着,但是别写在 HTML 标签外
- 最常见的是写在 head 标签内部和 body 内部
- 写在 head 标签内需要写上 window.onload 包着,要不然会报错,因为执行 js 时页面标签还没加载
1* window.onload的作用是当页面加载完成后自动触发事件
2* ⼀个页面应该只有⼀个window.onload事件,因为如果写多个的话会覆盖只执行最后一个
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #tim{
7 width: 200px;
8 height: 200px;
9 border:1px solid black;
10 margin:0 auto;
11 }
12 </style>
13 <script type="text/javascript" src="js代码应该写在哪里.js"></script>
14</head>
15<body>
16 <div id="tim" class="xiaod"></div>
17<!-- <script type="text/javascript">
18 //window.onload的作用是当页面加载完成后自动触发事件
19 window.onload=function(){
20 document.getElementsByTagName('div')[0].style.background='red'
21 alert(1)
22 }
23 window.onload=function(){
24 document.getElementsByTagName('div')[0].style.background='black'
25 alert(2)
26 }
27 window.onload=function(){
28 document.getElementsByTagName('div')[0].style.background='yellow'
29 alert(3)
30 }
31 </script> -->
32</body>
33</html>
详细分析 JS 输出及调试方式
1# 弹窗型输出
2 alert('输出内容')
3
4# 浏览器调试窗口输出
5 console.log('输出内容')
6
7# innerHTML、innerText(innerText不会解析HTML标签,而是原样输出)
8 document.getElementById('id名').innerHTML='内容'
9
10# document.wirte("输出内容")
11 输出内容会清空原有的 html 再生成一个新的 html
12 document.getElementById('rewrite').onclick=function(){
13 document.write('我是新的html了,原本的已经被我替代掉')
14 }
JS 常见事件
JS 事件就是我们的行为能被检测到,且触发相对应的函数(to do sth)
1onclick 鼠标点击事件
2onmouseover 鼠标被移到某元素之上
3onmouseout 鼠标从某元素上面移开
4onchange 元素值改变,一般用在表单元素上
5onkeydown 用户按下键盘按键
6onfocus 元素获得焦点
7onblur 元素失去焦点
8window.onload 页面加载完成
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #tim{
7 width:300px;
8 height: 300px;
9 background:red;
10 margin: 0 auto;
11 }
12
13 </style>
14</head>
15<body>
16 <div id="tim"></div>
17 <input type="" name="" id="xd">
18 <script type="text/javascript">
19 //点击事件
20 document.getElementById("tim").onclick=function(){
21 //函数里面写我们要做的事情
22 alert('我是被点击了')
23 }
24 //鼠标移入事件
25 document.getElementById("tim").onmouseover=function(){
26 console.log('鼠标移入我的范围内了')
27 }
28 //鼠标移出事件
29 document.getElementById("tim").onmouseout=function(){
30 console.log('鼠标移出我的范围内了')
31 }
32 //元素改变事件,一般用在表单元素
33 document.getElementById('xd').onchange=function(){
34 console.log(document.getElementById('xd').value)
35 }
36 //键盘事件,按下键盘事件
37 document.getElementById('xd').onkeydown=function(){
38 console.log('键盘按下了')
39 }
40 //获取焦点事件
41 document.getElementById('xd').onfocus=function(){
42 console.log('我获取到焦点了')
43 }
44 //失去焦点事件
45 document.getElementById('xd').onblur=function(){
46 console.log('我失去焦点了')
47 }
48 </script>
49</body>
50</html>
手动操作 DIV 的任意样式
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6
7 #tim{
8 width: 100px;
9 height: 100px;
10 background: red;
11 margin: 0 auto;
12 }
13 </style>
14</head>
15<body>
16 <button id="taller">增高</button>
17 <button id="longer">增长</button>
18 <button id="changebg">改变背景颜色</button>
19 <div id="tim" ></div>
20 <script type="text/javascript">
21
22 window.onload=function(){
23 //给我们的增高按钮添加点击事件
24 document.getElementById('taller').onclick=function(){
25 //获取id名为tim的div
26 document.getElementById('tim').style.height='300px'
27 }
28 //给我们的增高长按钮添加点击事件
29 document.getElementById('longer').onclick=function(){
30 //获取id名为tim的div
31 document.getElementById('tim').style.width='300px'
32 }
33 //给我们的改变背景颜色按钮添加点击事件
34 document.getElementById('changebg').onclick=function(){
35 //获取id名为tim的div
36 document.getElementById('tim').style.background='black'
37 }
38 }
39 </script>
40</body>
41</html>
数据类型
基础数据类型
1* 字符串 string
2* 数字(整型浮点型) number
3* 布尔 boolean
4* 空对象 null console.log(typeof(null)) => null
5* undefined 未定义
复杂数据类型
1* 数组 Array
2* 对象 Object console.log(typeof({})) =>
检测数据类型的两种基本方法
1* typeof //复杂数据类型、引用数据类型 在 typeof() 下都显示为 object
2* Object.prototype.toString.call('数据') //鉴别复杂数据类型、引用数据类型
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 //字符串
9 console.log(typeof('string'))
10 //数字
11 console.log(typeof(234))
12 //布尔值
13 console.log(typeof(true))
14 //null
15 console.log(typeof(null))
16 //undefined
17 console.log(typeof(undefined))
18 //object
19 // console.log(typeof({}))
20 console.log(Object.prototype.toString.call({})) /* [object Object] */
21 //数组
22 // console.log(typeof([]))
23 console.log(Object.prototype.toString.call([])) /* [object Array] */
24 </script>
25</body>
26</html>
变量
如何定义变量
var name
命名规则
首字母(a-zA-Z)或下划线()或美元符($)开头,不能是数字
后面的可以是字母(a-zA-Z)或下划线()或美元符($)或数字,并且是区分大小写的。
区分大小写的意思是 var name 和 var Name 是定义两个不同的变量。
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6
7 #tim{
8 width: 100px;
9 height: 100px;
10 background: red;
11 margin: 0 auto;
12 }
13 </style>
14</head>
15<body>
16 <button id="taller">增高</button>
17 <button id="longer">增长</button>
18 <button id="changebg">改变背景颜色</button>
19 <div id="tim" ></div>
20 <script type="text/javascript">
21
22 //定义变量 用var
23 console.log('我是'+a)
24 var a='tim'
25
26 //上面两行代码等同于下面的代码 因为js执行是先定义再执行 变量提升问题
27 var a
28 console.log('我是'+a)
29 a='tim'
30
31 //变量的使用方式
32 window.onload=function(){
33 var oDiv=document.getElementById('tim')
34 //给我们的增高按钮添加点击事件
35 document.getElementById('taller').onclick=function(){
36 //获取id名为tim的div
37 oDiv.style.height='300px'
38 }
39 //给我们的增高长按钮添加点击事件
40 document.getElementById('longer').onclick=function(){
41 //获取id名为tim的div
42 oDiv.style.width='300px'
43 }
44 //给我们的改变背景颜色按钮添加点击事件
45 document.getElementById('changebg').onclick=function(){
46 //获取id名为tim的div
47 oDiv.style.background='black'
48 }
49 }
50 </script>
51</body>
52</html>
数据类型之间的转换
显式转换(强制类型转换)
1Number()
2parseInt()
3pareFloat()
4String()
5toString()
6Boolean()
隐式转换
1* 操作符或者语句进行运算时
2* if while 比较里面也会进行隐式转换
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 var a='123'
9 var b='abc'
10 //强制类型转换(显式转换)
11 console.log(a,"类型:"+typeof(a))
12 console.log(a,"用number进行类型转换之后的类型:"+typeof(Number(a)))
13
14 //用number转换一个是字符串类型,但内容不是数字
15 console.log(b,"类型:"+typeof(b))
16 console.log(b,Number(b),"用number进行类型转换之后的类型:"+typeof(Number(b)))
17 //NaN是not a number的缩写 意思是 不是一个数字
18
19 var c='3.1415926abc'
20 console.log(c,'整形转换:'+parseInt(c))
21 console.log(c,'浮点型转换:'+parseFloat(c))
22
23 var d=123456
24 console.log(d,String(d),typeof(String(d)))
25 console.log(d,d.toString(),typeof(d.toString()))
26
27 console.log(d,Boolean(d))
28
29 //隐式转换
30 //数字跟数字相加,不用转换类型
31 // var sum
32 // sum=1+2
33 // console.log('sum='+sum)
34 //数字跟字符串相加 发生类型转换,会变成字符串之间的拼接,就是把我们的数字1变成了字符串‘1’
35 var sum
36 sum=1+'2'
37 console.log('sum='+sum,typeof(sum))
38 if(12=='12'){
39 console.log('判断成立了,我被执行了')
40 }
41 </script>
42</body>
43</html>
复杂数据类型的创建
数组创建
1# 直接创建
2 var arr=[] //空数组
3 var arr=[1,2] //创建有内容的数组
4# 利用构造函数创建
5 var arr1 = new Array(); //创建空数组
6 var arr2 = new Array(10); //创建一个长度为10的数组
7 var arr3 = new Array(5,4,3,2,1) //创建数组并初始化
对象创建
1# 直接创建
2 var obj={} //创建空对象
3 var obj1={a:1,b:2} //创建有内容的对象
4# 利用构造函数创建
5 var obj = new Object()
函数
函数出现的意义:方便我们封装、调用代码
函数的定义
1function fun(){console.log(1)}
2var fun = function(){console.log(2)}
3var fun = new Function(console.log(3)) //这种方式函数会自调用(函数自己完成调用动作)
函数的调用
1fun()
示例
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6
7 #tim{
8 width: 100px;
9 height: 100px;
10 background: red;
11 margin: 0 auto;
12 }
13 </style>
14</head>
15<body>
16 <button id="taller" onClick="taller()">增高</button>
17 <button id="longer" onClick="longer()">增长</button>
18 <button id="changebg" onClick="changebg()">改变背景颜色</button>
19 <div id="tim" ></div>
20 <script type="text/javascript">
21 //获取到要改变的div id为tim
22 var oDiv=document.getElementById('tim')
23 //写点击增高的按钮时需要调用的函数
24 var taller=function(){
25 oDiv.style.height='300px'
26 }
27 //写点击增长的按钮时需要调用的函数
28 function longer(){
29 oDiv.style.width='300px'
30 }
31 //写点击改变背景颜色的按钮时需要调用的函数
32 function changebg(){
33 oDiv.style.background='black'
34 }
35
36 // window.onload=function(){
37 // //给我们的增高按钮添加点击事件
38 // document.getElementById('taller').onclick=function(){
39 // //获取id名为tim的div
40 // document.getElementById('tim').style.height='300px'
41 // }
42 // //给我们的增高长按钮添加点击事件
43 // document.getElementById('longer').onclick=function(){
44 // //获取id名为tim的div
45 // document.getElementById('tim').style.width='300px'
46 // }
47 // //给我们的改变背景颜色按钮添加点击事件
48 // document.getElementById('changebg').onclick=function(){
49 // //获取id名为tim的div
50 // document.getElementById('tim').style.background='black'
51 // }
52 // }
53 </script>
54</body>
55</html>
命名规范
1# 变量
2 小驼峰命名法:第一个单词以小写字母开始,第二个单词开始以后的每个单词的首字母都大写 var tim
3
4# 函数名
5 小驼峰命名法 function getUserInfo(){}
6
7# 常量
8 全大写单词间用下划线隔开(_) var CH_NAME='tim'
函数的几种写法
1function fun(){} //最常见的声明
2(function fun(){}) //函数表达式声明方式,只在括号内起作用,外部无法访问
3(function(){}) //匿名函数表达式,外部无法访问
4new Function() //通过构造器方式,因为麻烦,很少用
5export default function(){} //es6的向外暴露方法
6()=>{} //箭头函数,es6
函数的传参、取参
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6
7 #tim{
8 width: 100px;
9 height: 100px;
10 background: red;
11 margin: 0 auto;
12 }
13 </style>
14</head>
15<body>
16 <button id="taller" onClick="change('height','300px')">增高</button>
17 <button id="longer" onClick="change('width','300px')">增长</button>
18 <button id="changebg" onClick="change('background','black')">改变背景颜色</button>
19 <div id="tim" ></div>
20 <script type="text/javascript">
21 //获取到要改变的div id为tim
22 var oDiv=document.getElementById('tim')
23 //写点击增高的按钮时需要调用的函数
24 // var taller=function(){
25 // oDiv.style.height='300px'
26 // }
27 // //写点击增长的按钮时需要调用的函数
28 // function longer(){
29 // oDiv.style.width='300px'
30 // }
31 // //写点击改变背景颜色的按钮时需要调用的函数
32 // function changebg(){
33 // oDiv.style.background='black'
34 // }
35
36 function change(styleattr,value){
37 //两种写法是一样的,但是如果需要传入变量就需要用第二种
38 // oDiv.style.styleattr=value
39 oDiv.style[styleattr]=value
40 }
41 </script>
42</body>
43</html>
不定参数(arguments)
不确定传入的参数有多少个。
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7
8 <script type="text/javascript">
9 //利用arguments来编写一个求和函数
10 function sum(){
11 var sum=0
12 for(var i=0;i<arguments.length;i++){
13 sum=sum+arguments[i]
14 }
15 console.log(sum)
16 }
17
18sum(1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10,1,2,3,10)
19
20 </script>
21</body>
22</html>
变量作用域
1# 局部变量
2 只在定义的函数内部使用
3
4# 全局变量
5 可以在整个script作用域内都可以使用
6
7# 作用域链
8 只有在自己当前的小作用域内找不到才会向父级作用域寻找,直到找不到为止(存在同名变量时,在当前作用域内局部变量会覆盖全局变量,局部变量优先级比较高)
闭包
可以调用函数内部变量的函数。
1 //闭包
2 function a(){
3 var tim=10
4 var b=function(){
5 console.log(tim)
6 }
7 return b
8 }
9 //a方法返回b方法,再执行:b方法可以调用函数内部变量tim,避免造成全局变量的污染
10 a()()
函数的返回值
1* 一个函数可以有多个return,但是第一个return代表函数结束运行。
2* 不写return,函数默认返回undefined
3* 想返回多个值,可以把多个值封装成:数组、或是json对象
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 //函数不写返回值会默认返回undefined
9 function fun(){
10 var tim=10
11 var xd=20
12 var obj={'tim':tim,'xd':xd}
13 return obj
14
15 }
16 console.log(fun())
17 </script>
18</body>
19</html>
流程控制
- if else if else
- b==='10'?console.log('成立'):console.log('不成立')
- switch case
示例
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7
8 <script type="text/javascript">
9 var a=9
10 //判断 一个=表示赋值 两个==是判断左右两边是否相等 还会进行类型的转换
11 //三个===是全等的类型,意思是不会转换类型 ,要判断===左右两边的类型和值都相等才会返回true
12 // if(a==10){
13 // console.log('a等于10是成立的')
14 // }else{
15 // console.log('a等于10是不成立的')
16 // }
17
18 // if(a=='11'){
19 // console.log('两个==会转换类型')
20 // }else if(a==10){
21 // console.log('a等于10是成立的')
22 // }else{
23 // console.log('a不等于10 也不等于11')
24 // }
25
26 //全等是三个=== ,需要左右两边的类型和值都一样才返回true
27 // if(a==='9'){
28 // console.log('现在的是指和类型都相等')
29 // }else{
30 // console.log('现在的是指和类型不全相等,有可能是值不相等,有可能是类型不相等,也有可能两者都不相等')
31 // }
32
33 //三目运算 条件?'成立执行冒号前面的': '不成立执行冒号后面的'
34 // var b=10
35 // b==='10'?console.log('成立'):console.log('不成立')
36
37 //switch case 的高级用法 这里case 是 === 全等的判断
38
39 function fun(type){
40 switch(type){
41 case 0:
42 console.log('传入的条件是0');
43 break;
44 case 1:
45 console.log('传入的条件是1');
46 break;
47 case 2:
48 console.log('传入的条件是2');
49 break;
50 case 3:
51 console.log('传入的条件是3');
52 break;
53 case 4:
54 console.log('传入的条件是4');
55 break;
56 default:
57 console.log('我是默认的,就是上述条件都不成立就输出我');
58 break;
59 }
60 }
61 fun(0)
62 </script>
63</body>
64</html>
循环
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 //第一种 while循环
9 //1、创建循环变量
10 // var tim =10
11 // //2、判断循环条件
12 // while(tim>=5){
13 // //3、判断成立就执行循环体里面的操作
14 // console.log(tim)
15 // //4、更新循环变量
16 // tim=tim-1
17 // // tim--
18 // }
19
20 // do while 循环
21 //创建循环变量
22 // var tim = -1;
23 // //即使初始条件不成立,循环体内容还是会执行一次
24 // do{
25 // //执行循环体内容
26 // console.log(tim);//10 9 8 7 6 5 4 3 2 1 0
27 // //更新循环变量
28 // tim--;
29 // }while(tim>=0);//判断循环条件
30
31 // console.log(tim);//-1
32
33 //for循环 一般拿来循环数组
34 // var arr=['篮球','足球','乒乓球','羽毛球','排球']
35 // console.log(arr.length,arr[4])
36 // for(var i=0;i<arr.length;i++){
37 // console.log(arr[i])
38 // }
39
40 //for in 一般拿来循环对象
41 var obj={a:'篮球',b:'足球',c:'乒乓球'}
42 // console.log(obj.b)
43 for(o in obj){
44 // console.log(o)
45 console.log(obj[o])
46 }
47 </script>
48</body>
49</html>
break、continue
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 //break用于循环体内部跳出循环
9 // for(var i=0;i<=5;i++){
10 // if(i==3){
11 // break;
12 // }
13 // console.log(i)
14 // }
15 // console.log(i,'我是循环体外的i,不是循环体内部的内容')
16
17 //continue用于中断符合判断条件的当前迭代
18 for(var i=0;i<=5;i++){
19 if(i==3){
20 continue;
21 }
22 console.log(i)
23 }
24 console.log(i,'我是循环体外的i,不是循环体内部的内容')
25 </script>
26</body>
27</html>
真假
- 真:除了假都是真
- 假:false 数字 0 空字符串 null undefined NAN
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 //判断里面的真假
9 // 假: false 数字0 空字符串 null undefined NAN
10 var a={a:'1'}
11 var key=true
12 if(key){
13 console.log('我是真的')
14 }else{
15 console.log('我是假的')
16 }
17 </script>
18</body>
19</html>
逻辑运算符
- && 全部真才返回真
- || 一个真就返回真
- ! 真变成假,假变成真
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 //判断里面的真假
9 // 假: false 数字0 空字符串 null undefined NAN
10 //与 && 意思是判断条件都需要为真才返回真
11 var a=false
12 var b=undefined
13 var c=null
14 // if( a && b && c){
15 // console.log('a和b都是真的')
16 // }else{
17 // console.log('a和b不全是真')
18 // }
19
20 //或 || 只需要有一个条件成立为真 就返回真
21
22 // if( a || b || c){
23 // console.log('a或b或c有一个为真')
24 // }else{
25 // console.log('三者都为假')
26 // }
27
28 // ! 非 真变成假 假变成真
29
30 if(!a){
31 console.log('a是假')
32 }
33 </script>
34</body>
35</html>
JSON
JavaScript Object Notation 的缩写,它是一种数据交换格式。
JSON 基于文本,轻量,用于前后端交换数据。
JSON 是 ECMA 的一个标准,几乎所有的变成语言都有解析 JSON 的库。
1# JSON VS XML
2* 可读写 XML更加规范
3* 便捷性 JSON更加便捷
4* 轻量级 意味着数据交换速率快
JSON 对象
1{"name":"JSON对象","address":"广东省广州市","age":28}
JSON 数据
1[
2 {"name":"JSON数组1","address":"广东省广州市","age":28},
3 {"name":"JSON数组1","address":"广东省广州市","age":28},
4]
JSON 字符串
1'{"name":"JSON数组1","address":"广东省广州市","age":28}'
演示:JSON 对象、JSON 数组、JSON 字符串
1 <script type="text/javascript">
2 //json对象
3 var jsonObj={"name":"tim","age":28}
4 console.log(jsonObj,typeof(jsonObj))
5
6 //json数组
7 var jsonarr=[
8 {"name":"tim","age":28},
9 {"name":"tim","age":28},
10 "json字符串"
11 ]
12 console.log(jsonarr,typeof(jsonarr))
13
14 //json字符串
15 var jsonString='{"name":"tim","age":28}'
16 console.log(jsonString,typeof(jsonString))
17 </script>
JSON 字符解析
1# 序列化 JSON.parse()
2 把 js 对象转成 json 字符串
3
4# 反序列化 JSON.stringify()
5 把 JSON 字符串转成 js 对象
JSON 对象操作
1# 增
2 obj.xxx='xxx'
3
4# 删
5 delete obj.xxx
6
7# 改
8 obj.xxx='xxx'
9
10# 查
11 obj.xxx
1 <script type="text/javascript">
2 //对于json对象的操作
3 var obj={"name":"tim","age":18}
4 // console.log(obj)
5
6 //对对象增加一个属性
7 obj.height="180cm"
8
9 //删除一个属性 删除年龄
10 delete obj.age
11
12 //更改一个属性的值 把名字改成tom
13 obj.name="tom"
14
15 //查找名字是什么 obj.name
16 console.log(obj.name)
17
18 var arr=[
19 {"name":"tim","age":18},
20 {"name":"tony","age":20},
21 {"name":"jerry","age":23}
22 ]
23
24 for(var i=0;i<arr.length;i++){
25 console.log(arr[i])
26 }
27 </script>
数组操作
1* shift() 删除数组第一个元素,并返回被删除的元素
2* pop() 删除数组最后一个元素,并返回被删除的元素
3* unshift() 向数组第一个元素前面添加一个元素,返回数组长度
4* push() 向数组最后一个元素后面添加一个元素,返回数组长度
5* concat() 合并两个或多个数组
6* join(separator) 数组转字符串,可传入一个参数用于分隔元素
7* split(separator,howmany) 字符串转数组,可传入两个参数
8 separator:必选,实现方法为将字符串按某个字符切割成若干个字符串,并以数组形式返回
9 howmany:可选,该参数可指定返回的数组的最大长度,如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
10* reverse() 翻转数组,颠倒数组中元素的顺序
11* sort(fucntion) 数组排序,传入一个参数function
12 function 规定排序顺序,必须函数。如果不传入函数则按照字符编码顺序排序
13* slice(start,end) 返回数据中被选定的元素,不包含下标end的元素
14 start 必选,从何处开始选取。如果是负数,则从数组未必开始算起,-1代表最后一个元素。
15 end 可选,规定从何处结束选取。如果不指定则从start开始截取到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组为不开始算起的元素。
16* splice(index,howmany,x,y,z) 可以对数组进行增加,删除,更改的操作,会返回被删除的元素。
17 index 必选,整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
18 howmany 必选,要删除的元素数目,如果设置为0,则不会删除元素.
19 x,y,z 可选项,为添加的新元素
20
21* indexOf(item,start) 返回元素的索引,即下标,如果没有查找的元素就返回-1
22 item 必选,查找的元素
23 start 可选,整数,规定在数组中开始检索的位置,如不选则为第一个开始检索
1 <script type="text/javascript">
2 //创建数组
3 var arr=["篮球","足球","乒乓球","羽毛球"]
4 //删除数组第一个元素 返回值为被删除的元素
5 // var first=arr.shift()
6 // console.log(first)
7 // console.log(arr)
8
9 //删除数组最后一个元素 返回值为被删除的元素
10 // var end=arr.pop()
11 // console.log(end)
12 // console.log(arr)
13
14 //向我们的数组的第一个元素前面添加元素,返回添加后数组长度
15 // var arrLength=arr.unshift('排球')
16 // console.log(arrLength)
17 // console.log(arr)
18
19 //向我们数组最后一个元素后面添加元素,返回添加后数组长度
20 var arrLength=arr.push("排球")
21 console.log(arrLength)
22 console.log(arr)
23
24
25 //创建数组
26 //合并数组,可合并两个或多个
27 // var arr=["篮球"]
28 // var arr1=["足球"]
29 // var arr2=["乒乓球"]
30 // console.log(arr.concat(arr1,arr2))
31 // console.log(arr)
32 //数组转字符串
33 // var arr=["篮球","足球","乒乓球"]
34 // console.log(arr.join(''))
35 //字符串转数组
36 // var string1="abcdecefg"
37 // console.log(string1.split('c',3))
38 //翻转数组,颠倒数组中元素的顺序
39 var arr=[1,2,3,4,5]
40 console.log(arr.reverse())
41
42 // var arr=[1,3,5,4,2,6,7,7,9,11,8]
43 //数组排序 有正向和反向(从大到小或从小到大) 不传参数就是按照字符编码排序
44 //sort函数接收的参数也是一个函数,里面接收两个参数,
45 // 返回第一个参数减第二个参数(a-b)即按照从小到大排序,
46 // 返回第二个参数减第一个参数(b-a)即按照从大到小排序
47 // console.log(arr.sort(function(a,b){
48 // return b-a
49 // }))
50
51 //选定数组里面指定下标的元素 slice
52 // var a=arr.slice(6,8)
53 // console.log(a)
54
55 //可以对数组进行增删改的方法 splice
56 // var arr=["篮球","足球"]
57 // //利用splice方法增加
58 // // arr.splice(0,0,"排球")
59 // // console.log(arr)
60 // //利用splice方法删除
61 // // arr.splice(0,1)
62 // // console.log(arr)
63 // //利用splice方法进行更改元素
64 // arr.splice(0,1,"排球","乒乓球")
65 // console.log(arr)
66
67 //查找元素索引,即下标 indexOf
68 var arr=["篮球","足球","乒乓球","排球"]
69 console.log(arr.indexOf("棒球"))
70
71 </script>
定时器
1# 间隔性定时器 setInterval(fun,time)
2* fun为执行的函数
3* time为间隔执行的时间,单位为毫秒,每过time时间就执行一次fun里面的代码
4
5# 延时性定时器 setTimeout(fun,time)
6* fun为执行的函数
7* time为延时执行时间,单位为毫秒,经过time时间后执行fun代码,只执行一次
1 <script type="text/javascript">
2 //延时型的定时器 setTimeout 只会执行一次
3 // setTimeout(function(){
4 // alert("我是延时三秒执行的弹窗")
5 // },3000)
6
7 //间隔型定时器 setInterval 每间隔time的时间就会执行一次
8 setInterval(function(){
9 console.log(1)
10 },2000)
11 </script>
清除定时器
1* clearInterval 清除间隔性定时器
2* clearTimeout 清除延时性定时器
1 <script type="text/javascript">
2 //清除定时器
3 //创建间隔性定时器
4 var timer1=setInterval(function(){
5 console.log("我是间隔型定时器")
6 // clearTimeout(timer2)
7 },1000)
8 //创建延时性的定时器
9 var timer2=setTimeout(function(){
10 console.log("我是延时性定时器")
11 clearInterval(timer1)
12 },3000)
13 </script>
延时性定时器演示
延时提示框
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #div1{
7 float: left;
8 width: 50px;
9 height: 50px;
10 background: red;
11 margin-right: 30px;
12 }
13 #div2{
14 float: left;
15 width: 200px;
16 height: 200px;
17 background: black;
18 display: none;
19 }
20
21 </style>
22</head>
23<body>
24 <div id="div1"></div>
25 <div id="div2"></div>
26 <script type="text/javascript">
27
28 window.onload=function(){
29 var oDiv1=document.getElementById('div1')
30 var oDiv2=document.getElementById('div2')
31 var timer=null
32 //给div2添加鼠标移入事件
33 oDiv2.onmouseover=oDiv1.onmouseover=function(){
34 //改变div2的display
35 clearTimeout(timer)
36 oDiv2.style.display='block'
37 }
38 //给div2添加鼠标移出事件
39 oDiv2.onmouseout=oDiv1.onmouseout=function(){
40 //改变div2的display
41 timer=setTimeout(function(){
42 oDiv2.style.display='none'
43 },500)
44 }
45 </script>
46</body>
47</html>
间隔性定时器演示
无缝滚动图片展示
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 *{margin:0;padding: 0;}
7 #banner{
8 position: relative;
9 width: 600px;
10 height: 150px;
11 margin:100px auto;
12 overflow: hidden;
13 }
14 #banner ul{
15 position: absolute;
16 left: 0;
17 top:0;
18 }
19 #banner li{
20 float: left;
21 width: 200px;
22 height: 150px;
23 list-style: none;
24 }
25 #banner li img{
26 width: 200px;
27 height: 150px;
28 }
29 </style>
30</head>
31<body>
32 <div id="banner">
33 <ul>
34 <li><img src="img/1.png"></li>
35 <li><img src="img/2.png"></li>
36 <li><img src="img/3.png"></li>
37 <li><img src="img/4.png"></li>
38 <li><img src="img/5.png"></li>
39 <li><img src="img/6.png"></li>
40 </ul>
41 </div>
42 <script type="text/javascript">
43 window.onload=function(){
44 var oDiv=document.getElementById('banner')
45 var oUl=oDiv.getElementsByTagName('ul')[0]
46 var oLi=oUl.getElementsByTagName('li')
47 var timer=null
48 //拼接多一份ul里面的内容 这两种写法相等
49 // oUl.innerHTML=oUl.innerHTML+oUl.innerHTML
50 oUl.innerHTML+=oUl.innerHTML
51 //计算ul的宽度
52 oUl.style.width=oLi[0].offsetWidth*oLi.length+'px'
53 function moving(){
54 if(oUl.offsetLeft<-oUl.offsetWidth/2){
55 oUl.style.left='0'
56 }
57 oUl.style.left=oUl.offsetLeft-2+'px'
58 }
59 timer=setInterval(moving,30)
60 oDiv.onmouseover=function(){
61 clearInterval(timer)
62 }
63 oDiv.onmouseout=function(){
64 timer=setInterval(moving,30)
65 }
66 }
67 </script>
68</body>
69</html>
DOM 操作
节点获取
1# 获取子节点
2childNodes 获取子节点(包括换行和空格)
3children children不会返回文本节点,返回的是元素节点
4
5# 获取父节点
6parentNode 获取的是当前元素的直接父元素,w3c的标准
7parentElement 获取的是当前元素的直接父元素,ie的标准
8offsetParent 获取离当前节点最近的一个有定位的父节点或祖先节点,如果没有即为获取body
9
10# 判断节点的类型
11nodeType 1为元素节点 3为文本节点(即空格或换行,字符)
12
13# 获取第一个子节点
14firstChild 有可能会匹配到时空白或换行的节点信息
15firstElementChild 不会匹配空白或换行的节点信息(获取到的是元素节点,不会获取到文本节点)
16
17# 获取最后一个子节点
18lastChild 有可能会匹配到时空白或换行的节点信息
19lastElementChild 不会匹配空白或换行的节点信息(获取到的是元素节点,不会获取到文本节点)
20
21# 获取上一个兄弟节点
22previousSibling 有可能会匹配到空白或换行的节点信息
23previousElementSibling 不会匹配空白或换行的节点信息(获取到的是元素节点,不会获取到文本节点)
24
25# 获取下一个兄弟节点
26nextSibling 有可能会匹配到时空白或换行的节点信息
27nextElementSibling 不会匹配空白或换行的节点信息(获取到的是元素的即诶但,不会获取到文本节点)
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #bigdiv{
7 position: relative;
8 }
9 </style>
10</head>
11<body>
12 <div id="bigdiv">
13 <div id="div1">
14 <div>1111</div>
15 <div>2222</div>
16 </div>
17 </div>
18
19 <script type="text/javascript">
20 var oDiv=document.getElementById('div1')
21
22 //childNodes获取子节点会获取到文本节点和元素节点
23 var div1=oDiv.childNodes
24 console.log(oDiv.childNodes)
25
26 //这种只获取元素节点,不会获取到文本节点 children
27 console.log(oDiv.children)
28
29 //获取父节点
30 // console.log(oDiv.parentNode)
31 // console.log(oDiv.parentElement)
32 // console.log(oDiv.offsetParent)
33
34 //判断节点类型 1是元素节点 3是文本节点
35 console.log(div1[0].nodeType,'我是第一个,我是文本节点')
36 console.log(div1[1].nodeType,'我是第二个,我是元素节点')
37 </script>
38</body>
39</html>
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <div id="div1">
8 <div>我是第一个</div>
9 <div>我是第二个</div>
10 <div id="three">我是第三个</div>
11 <div>我是第四个</div>
12 <div>我是第五个</div>
13 </div>
14
15 <script type="text/javascript">
16 var oDiv=document.getElementById('div1')
17 var three=document.getElementById('three')
18 //获取第一个子节点
19 // console.log(oDiv.firstChild)
20 // console.log(oDiv.firstElementChild)
21 //获取最后一个子节点
22 // console.log(oDiv.lastElementChild)
23 //获取上一个兄弟节点
24 console.log(three.previousElementSibling)
25 //获取下一个兄弟节点
26 console.log(three.nextElementSibling)
27 </script>
28</body>
29</html>
元素属性操作的三种方式
1# 第一种
2 oDiv.style.display="block";
3
4# 第二种
5 oDiv.style["display"]="block";
6
7# 第三种(DOM方式)
8 获取 getAttribute(属性名字)
9 设置 setAttribute(属性名称,值)
10 删除 removeAttribute(属性名称)
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <div id="div1" value="2">123</div>
8
9 <script type="text/javascript">
10
11 var oDiv=document.getElementById('div1')
12
13 //第一种
14 // oDiv.style.color='red'
15 //第二种
16 oDiv.style['color']='red'
17 //第三种 dom的方式
18
19 //获取属性
20 console.log("我是改变前的id:"+oDiv.getAttribute('id'))
21 console.log("我是改变前的value:"+oDiv.getAttribute('value'))
22
23 //改变属性
24 oDiv.setAttribute('id','tim')
25 oDiv.setAttribute('value','100')
26 console.log("我是改变后的id:"+oDiv.getAttribute('id'))
27 console.log("我是改变后的value:"+oDiv.getAttribute('value'))
28
29 //删除属性 removeAttribute
30 oDiv.removeAttribute('value')
31
32 </script>
33</body>
34</html>
DOM 节点的创建、插入、删除
1# 创建并添加DOM元素
2document.createElement('标签名') 创建一个DOM节点
3appendChild(DOM节点) 为某个DOM添加一个子节点,在最后面添加
4
5# 插入元素
6insertBefore(节点,原有节点) 在已有元素前插入
7
8# 删除DOM元素
9removeChild(节点) 删除一个节点
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <ul id="ullist">
8 <li>我是第一个</li>
9 <li>我是第二个</li>
10 <li>我是第三个</li>
11 <li>我是第四个</li>
12 </ul>
13 <script type="text/javascript">
14 var oUl=document.getElementById('ullist')
15 var oLi=oUl.getElementsByTagName('li')
16
17 //创建dom节点
18 var li=document.createElement('li')
19 li.innerHTML='我是新创建的li'
20 // oUl.appendChild(li)
21 //我们要在指定的位置插入新创建的li
22 // oUl.insertBefore(li,oLi[2])
23
24 //删除节点
25 oUl.removeChild(oLi[3])
26 </script>
27</body>
28</html>
文档碎片
减少页面渲染 DOM 的次数
DOM 操作表格元素
早期提供了更便捷的方法。
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <table id="table1" border="1">
8 <thead>
9 <td>姓名</td>
10 <td>年龄</td>
11 <td>身高</td>
12 </thead>
13 <tbody>
14 <tr>
15 <td>张三</td>
16 <td>18</td>
17 <td>180cm</td>
18 </tr>
19 <tr>
20 <td>李四</td>
21 <td>19</td>
22 <td>190cm</td>
23 </tr>
24 <tr>
25 <td>王五</td>
26 <td>20</td>
27 <td>170cm</td>
28 </tr>
29 </tbody>
30 </table>
31
32 <script type="text/javascript">
33
34 var table1=document.getElementById('table1')
35 // alert(table1.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[0].getElementsByTagName('td')[0].innerHTML)
36 // alert(table1.tBodies[0].rows[0].cells[0].innerHTML)
37 table1.tBodies[0].rows[0].cells[0].innerHTML='tim'
38
39 </script>
40</body>
41</html>
运动框架
运动基础演示
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6
7 *{
8 margin:0;
9 padding:0;
10 }
11 #div1{
12 position: absolute;
13 left: 0;
14 top:50px;
15 width: 200px;
16 height: 200px;
17 background:red;
18 }
19 </style>
20</head>
21<body>
22 <button onclick="moving()">开始运动</button>
23 <div id="div1"></div>
24
25 <script type="text/javascript">
26 var oDiv=document.getElementById('div1')
27 var timer=null
28 function moving(){
29 timer=setInterval(function(){
30 if(oDiv.offsetLeft>=300){
31 clearInterval(timer)/*清楚定时器就会停止运动*/
32 }else{
33 oDiv.style.left=oDiv.offsetLeft+1+'px'
34 }
35
36 },30)
37 }
38
39 </script>
40</body>
41</html>
单物体运动框架
封装好一个方法,让外部传入目的地的值,即让物体停下来的值。
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6
7 *{
8 margin:0;
9 padding:0;
10 }
11 #div1{
12 position: absolute;
13 left: 0;
14 top:50px;
15 width: 200px;
16 height: 200px;
17 background:red;
18 }
19 </style>
20</head>
21<body>
22 <button onclick="moving(500)">开始运动</button>
23 <div id="div1"></div>
24
25 <script type="text/javascript">
26 var oDiv=document.getElementById('div1')
27 var timer=null
28 function moving(target){
29 var speed=0
30 if(oDiv.offsetLeft<target){
31 speed=7
32 }else{
33 speed=-7
34 }
35 timer=setInterval(function(){
36 if(Math.abs(target-oDiv.offsetLeft)<=7){
37 oDiv.style.left=target+'px'
38 clearInterval(timer)
39 }else{
40 oDiv.style.left=oDiv.offsetLeft+speed+'px'
41 }
42
43 },30)
44 }
45
46 </script>
47</body>
48</html>
多物体运动框架
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #div1,div{
7 float: left;
8 width: 100px;
9 height: 100px;
10 background: red;
11 margin-right: 20px;
12 }
13 </style>
14</head>
15<body>
16 <div id="div1"></div>
17 <div></div>
18 <div></div>
19 <script type="text/javascript">
20 var oDiv=document.getElementsByTagName('div')
21 // var timer=null
22
23 for(var i=0;i<oDiv.length;i++){
24 //添加鼠标移入事件
25 oDiv[i].timer=null
26 oDiv[i].onmouseover=function(){
27 moving(this,400)
28 }
29 //添加鼠标移出事件
30 oDiv[i].onmouseout=function(){
31 moving(this,100)
32 }
33 }
34
35 // //添加鼠标移入事件
36 // oDiv.onmouseover=function(){
37 // moving(400)
38 // }
39 // //添加鼠标移出事件
40 // oDiv.onmouseout=function(){
41 // moving(100)
42 // }
43 function moving(obj,target){
44 clearInterval(obj.timer)
45 obj.timer=setInterval(function(){
46 var speed=(target-obj.offsetHeight)/8
47 //做向上取整和向下取整处理
48 speed=speed>0?Math.ceil(speed):Math.floor(speed)
49 if(obj.offsetHeight==target){
50 clearInterval(obj.timer)
51 }else{
52 obj.style.height=obj.offsetHeight+speed+'px'
53 }
54 },30)
55 }
56 </script>
57
58</body>
59</html>
改变单一任意值运动框架
在多物体运动框架的前提下增加一个修改样式的参数
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #div1,div{
7 float: left;
8 width: 100px;
9 height: 100px;
10 background: red;
11 margin-right: 20px;
12 }
13 </style>
14</head>
15<body>
16 <div id="div1" style="color:black;">111</div>
17 <div id="div2"></div>
18 <div id="div3"></div>
19 <script type="text/javascript">
20 var oDiv1=document.getElementById('div1')
21 var oDiv2=document.getElementById('div2')
22 var oDiv3=document.getElementById('div3')
23
24 //给div1添加鼠标移入事件
25
26 oDiv1.onmouseover=function(){
27 moving(this,'fontSize',50)
28 }
29 //给div1添加鼠标移出事件
30 oDiv1.onmouseout=function(){
31 moving(this,'fontSize',12)
32 }
33 //给div2添加鼠标移入事件
34
35 oDiv2.onmouseover=function(){
36 moving(this,'width',400)
37 }
38 //给div2添加鼠标移出事件
39 oDiv2.onmouseout=function(){
40 moving(this,'width',100)
41 }
42 //给div3添加鼠标移入事件
43
44 oDiv3.onmouseover=function(){
45 moving(this,'height',400)
46 }
47 //给div3添加鼠标移出事件
48 oDiv3.onmouseout=function(){
49 moving(this,'height',100)
50 }
51 //oDiv1.style.xxx只能获取行内样式(内联样式)
52 // console.log(oDiv1.style.color,'颜色')
53 // console.log(oDiv1.style.width,'宽度')
54 //获取内部样式(写在style标签内部的) 外部样式(通过link引入的样式表)
55 //在谷歌浏览器获取内部和外部样式getComputedStyle
56 // console.log(getComputedStyle(oDiv1,false)['width'])
57 //在ie浏览器下就是用oDiv1.currentStyle
58
59 //写一个方法获取我们需要改变的样式的值
60 function getStyleValue(obj,attr){
61 if(obj.currentStyle){
62 return obj.currentStyle[attr]
63 }else{
64 return getComputedStyle(obj,false)[attr]
65 }
66 }
67
68 console.log(getStyleValue(oDiv1,'width'))
69
70 function moving(obj,attr,target){
71 clearInterval(obj.timer)
72 obj.timer=setInterval(function(){
73 //定义一个变量接收我们需要改变的样式的值
74 var currvalue=parseInt(getStyleValue(obj,attr))
75 var speed=(target-currvalue)/8
76 //做向上取整和向下取整处理
77 speed=speed>0?Math.ceil(speed):Math.floor(speed)
78 if(currvalue==target){
79 clearInterval(obj.timer)
80 }else{
81 obj.style[attr]=currvalue+speed+'px'
82 }
83 },30)
84 }
85
86 </script>
87</body>
88</html>
链式运动框架
在改变单一任意值运动框架添加一个回调函数参数
链式运动顾名思义就是先运动完一个值,再运动另一个。
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #div1,div{
7 float: left;
8 width: 100px;
9 height: 100px;
10 background: red;
11 margin-right: 20px;
12 }
13 </style>
14</head>
15<body>
16 <div id="div1">点击我展开</div>
17 <div id="div2"></div>
18 <div id="div3">点击我收起</div>
19 <script type="text/javascript">
20 var oDiv1=document.getElementById('div1')
21 var oDiv2=document.getElementById('div2')
22 var oDiv3=document.getElementById('div3')
23
24
25 oDiv1.onclick=function(){
26 moving(oDiv2,'width',400,function(){
27 moving(oDiv2,'height',400)
28 })
29 }
30 oDiv3.onclick=function(){
31 moving(oDiv2,'height',100,function(){
32 moving(oDiv2,'width',100)
33 })
34 }
35 //写一个方法获取我们需要改变的样式的值
36 function getStyleValue(obj,attr){
37 if(obj.currentStyle){
38 return obj.currentStyle[attr]
39 }else{
40 return getComputedStyle(obj,false)[attr]
41 }
42 }
43
44 console.log(getStyleValue(oDiv1,'width'))
45
46 function moving(obj,attr,target,callbackfun){
47 clearInterval(obj.timer)
48 obj.timer=setInterval(function(){
49 //定义一个变量接收我们需要改变的样式的值
50 var currvalue=parseInt(getStyleValue(obj,attr))
51 var speed=(target-currvalue)/8
52 //做向上取整和向下取整处理
53 speed=speed>0?Math.ceil(speed):Math.floor(speed)
54 if(currvalue==target){
55 clearInterval(obj.timer)
56 if(callbackfun){
57 callbackfun()
58 }
59 }else{
60 obj.style[attr]=currvalue+speed+'px'
61 }
62 },30)
63 }
64
65 </script>
66</body>
67</html>
改变多值运动框架
同时改变多个需要改变的样式值。
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #div1,div{
7 float: left;
8 width: 100px;
9 height: 100px;
10 background: red;
11 margin-right: 20px;
12 }
13 </style>
14</head>
15<body>
16 <div id="div1">点击我展开</div>
17 <div id="div2"></div>
18 <div id="div3">点击我收起</div>
19 <script type="text/javascript">
20 var oDiv1=document.getElementById('div1')
21 var oDiv2=document.getElementById('div2')
22 var oDiv3=document.getElementById('div3')
23
24
25 oDiv1.onclick=function(){
26 moving(oDiv2,{"width":400,"height":400})
27 }
28 oDiv3.onclick=function(){
29 moving(oDiv2,{"width":100,"height":100})
30 }
31 //写一个方法获取我们需要改变的样式的值
32 function getStyleValue(obj,attr){
33 if(obj.currentStyle){
34 return obj.currentStyle[attr]
35 }else{
36 return getComputedStyle(obj,false)[attr]
37 }
38 }
39
40 console.log(getStyleValue(oDiv1,'width'))
41
42 function moving(obj,json){
43 clearInterval(obj.timer)
44 obj.timer=setInterval(function(){
45 //判断所有运动是否已完成
46 var beclear=true
47 for(var attr in json){
48 //定义一个变量接收我们需要改变的样式的值
49 var currvalue=parseInt(getStyleValue(obj,attr))
50 var speed=(json[attr]-currvalue)/8
51 //做向上取整和向下取整处理
52 speed=speed>0?Math.ceil(speed):Math.floor(speed)
53 if(currvalue!=json[attr]){
54 beclear=false
55 obj.style[attr]=currvalue+speed+'px'
56 }
57 }
58 if(beclear){
59 clearInterval(obj.timer)
60 }
61 },30)
62 }
63
64 </script>
65</body>
66</html>
完美运动框架
基于多值运动框架,在运动完之后传入回调函数。
改变透明度 opacity 需要做特殊处理
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #div1,div{
7 float: left;
8 width: 100px;
9 height: 100px;
10 background: red;
11 margin-right: 20px;
12 }
13 #div2{
14 /*兼容ie的写法*/
15 filter: alpha(opacity:30);
16 /*兼容非ie浏览器的写法*/
17 opacity:0.3;
18 }
19 </style>
20</head>
21<body>
22 <div id="div1">点击我展开</div>
23 <div id="div2"></div>
24 <div id="div3">点击我收起</div>
25 <script type="text/javascript">
26 var oDiv1=document.getElementById('div1')
27 var oDiv2=document.getElementById('div2')
28 var oDiv3=document.getElementById('div3')
29
30
31 oDiv1.onclick=function(){
32 moving(oDiv2,{"width":400,"height":400,"opacity":100},function(){
33 alert('我已经执行完了')
34 })
35 }
36 oDiv3.onclick=function(){
37 moving(oDiv2,{"width":100,"height":100,"opacity":30})
38 }
39 //写一个方法获取我们需要改变的样式的值
40 function getStyleValue(obj,attr){
41 if(obj.currentStyle){
42 return obj.currentStyle[attr]
43 }else{
44 return getComputedStyle(obj,false)[attr]
45 }
46 }
47
48 console.log(getStyleValue(oDiv1,'width'))
49
50 function moving(obj,json,callbackfun){
51 clearInterval(obj.timer)
52 obj.timer=setInterval(function(){
53 //判断所有运动是否已完成
54 var beclear=true
55 for(var attr in json){
56 //定义一个变量接收我们需要改变的样式的值
57 var currvalue=0
58 if(attr=='opacity'){
59 // 为什么使用四舍五入的取整方式,是因为计算机对于计算存在一些bug,大家可以尝试输出 0.7*100就明白了
60 currvalue=Math.round(getStyleValue(obj,attr)*100)
61 }else{
62 currvalue=parseInt(getStyleValue(obj,attr))
63 }
64
65 var speed=(json[attr]-currvalue)/8
66 //做向上取整和向下取整处理
67 speed=speed>0?Math.ceil(speed):Math.floor(speed)
68
69 if(currvalue!=json[attr]){
70 beclear=false
71 if(attr=='opacity'){
72 obj.style.filter='alpha(opacity:'+(currvalue+speed)+')'
73 obj.style.opacity=(currvalue+speed)/100
74 }else{
75 obj.style[attr]=currvalue+speed+'px'
76 }
77
78 }
79 }
80 if(beclear){
81 clearInterval(obj.timer)
82 if(callbackfun){
83 callbackfun()
84 }
85 }
86 },30)
87 }
88
89 </script>
90</body>
91</html>
事件
事件对象
用来获取事件的详细信息,例如:鼠标位置、键盘按键。
IE 下可以直接使用 event、非 IE 需要传入事件对象参数。
事件冒泡
&esmp;事件流会从 DOM 节点最里面的事件往最外面执行。
取消事件冒泡兼容写法
1* 获取事件对象(兼容写法) var oEvent=ev || event;
2* 取消事件冒泡 oEvent.cancelBubble=true;
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #div1{
7 width: 300px;
8 height: 300px;
9 background: pink;
10 }
11 #div2{
12 width: 150px;
13 height: 150px;
14 background: black;
15 color: #fff;
16 }
17 </style>
18</head>
19<body>
20 <div id="div1" >
21 <div id="div2"></div>
22 </div>
23
24 <script type="text/javascript">
25 var oDiv1=document.getElementById('div1')
26 var oDiv2=document.getElementById('div2')
27 // //通过事件对象获取鼠标移动时的坐标位置
28 // document.onmousemove=function(ev){
29 // //定义获取事件对象兼容(获取鼠标移动的横坐标、纵坐标)
30 // var oEvent=ev||event
31 // oDiv2.innerHTML=oEvent.clientX+','+oEvent.clientY
32 // }
33 // //通过事件对象获取键盘按键的值
34 // document.onkeydown=function(ev){
35 // //定义获取事件对象兼容
36 // var oEvent=ev||event
37 // //键盘每个键对应的值可以百度搜索一下有一个表的 keyCode就是键的值
38 // oDiv2.innerHTML=oEvent.keyCode
39 // }
40 oDiv1.onclick=function(){
41 console.log("你点击了div1")
42 }
43 oDiv2.onclick=function(ev){
44 console.log("你点击了div2")
45 //阻止冒泡
46 var oEvent=ev||event
47 oEvent.cancelBubble=true
48 console.log(oEvent)
49 }
50
51 </script>
52</body>
53</html>
事件绑定、事件解绑、事件捕获
1# 事件绑定
2 addEventListener(事件名称,函数,捕获),第三个参数为可选,默认为false,false 即事件流为事件冒泡。
3
4# 事件解绑
5 removeEventListener(事件名称,函数,捕获),默认为false,false即事件流为事件冒泡
6 注意,时间绑定中传入匿名函数会导致无法进行事件解绑
7
8# 事件捕获
9 addEventListener(事件名称,函数,true) 和时间冒泡相反,如果开启了时间捕获就先执行捕获的事件,再执行当前被点击事件。
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5 <style type="text/css">
6 #div1{
7 width: 300px;
8 height: 300px;
9 background: pink;
10 }
11 #div2{
12 width: 100px;
13 height: 100px;
14 background: black;
15 }
16 </style>
17</head>
18<body>
19 <div id="div1">
20 <div id="div2"></div>
21 </div>
22
23 <script type="text/javascript">
24 var oDiv1=document.getElementById('div1')
25 var oDiv2=document.getElementById('div2')
26 //当你需要解绑的时候,事件绑定里面的函数不能是匿名函数
27 oDiv1.addEventListener('click',fun,true)
28 oDiv2.addEventListener('click',function(){
29 console.log('你点击了div2')
30 oDiv1.removeEventListener('click',fun,true)
31 },false)
32 function fun(){
33 console.log('你点击了div1')
34 }
35 </script>
36
37</body>
38</html>
键盘事件以键盘码
1单个键盘事件 document.onkeydown
2组合按键事件 document.onkeyup
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 //键盘事件
9 // document.onkeydown=function(event){
10 // console.log(event)
11 // if(event.keyCode==13){
12 // alert('你按下了回车键')
13 // }
14 // }
15 document.onkeyup=function(event){
16 if(event.ctrlKey && event.keyCode==67){
17 alert('你按下了crtl+c')
18 }
19 }
20 </script>
21</body>
22</html>
默认行为,阻止默认行为
在浏览器里鼠标右键事件 oncontextmenu 会默认的给我们显示一个弹窗,这些就是事件的默认行为。
a 标签跳转也是一个默认行为,我们可以通过在他的点击事件里面用 return false 来阻止默认行为。
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <a href="https://baidu.com" onClick="return false;">百度</a>
8 <script type="text/javascript">
9
10 document.oncontextmenu=function(){
11 //用return false来阻止默认行为
12 return false;
13 }
14
15 </script>
16</body>
17</html>
AJAX
AJAX 是什么?
AJAX 是一种无须重新加载整个网页的情况下,能够更新部分网页的技术。
AJAX 是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量的数据交换,AJAX 可以使网页实现异步更新。 这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
使用 AJAX
调用封装好的 AJAX,传入读取的文件地址,成功需要做的事情和失败需要做的事。情.ajax(url,fnSucceed,fnFailed)
npm install -g http-server
安装 http-server 启动一个本地静态服务。 启动服务使用 http-server
浏览器为了安全考虑,默认禁止跨域访问。
调用 AJAX
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <button id="read">读取数据</button>
8 <script type="text/javascript" src="ajax.js"></script>
9 <script type="text/javascript">
10
11 var oBtn=document.getElementById('read')
12 oBtn.onclick=function(){
13 ajax('xiaod.txt?t='+new Date().getTime(),function(res){
14 alert(res)
15 },function(){
16 alert('读取失败')
17 })
18 }
19
20
21 </script>
22</body>
23</html>
封装 AJAX
1# 创建AJAX对象
2 ie5、ie6 使用 var oAjax=new ActiveXObject("Microsoft.XMLHTTP")
3 现在浏览器使用 var oAjax=new XMLHttpRequest()
4
5# 连接服务器
6 oAjax.open('GET',url,true)
7 请求类型、文件服务器地址、异步(true) || 同步(false)
8
9# 接收数据 (onreadystatechange事件)
10readyState属性:请求状态
11 0 (为初始化) 还没有调用open()方法
12 1 (载入) 已调用send()方法
13 2 (载入完成) send()方法完成,已收到全部响应内容
14 3 (解析) 正在解析响应内容
15 4 (完成) 响应内容解析完成,可以在客户端调用了
16
17status 属性:请求结果
18 200:"OK"
19 404:未找到页面
20
21请求成功返回内容
22 oAjax.responseText
1//封装ajax调用事件
2function ajax(url,fnSucceed,fnFailed){
3 //1、创建ajax对象
4 //创建ajax对象需要兼容,看看是否是ie5、6
5 if(window.XMLHttpRequest){
6 var oAjax=new XMLHttpRequest()
7 }else{
8 var oAjax=new ActiveXObject("Microsoft.XMLHTTP")
9 }
10
11 //2、连接服务器
12 //传入三个参数,第一个为请求类型、第二个给请求地址,第三个是同步(true)或异步(false)
13 oAjax.open('GET',url,true)
14
15 //3、发送请求
16 oAjax.send()
17
18 //4、接收数据
19 oAjax.onreadystatechange=function(){
20 if(oAjax.readyState==4){
21 if(oAjax.status==200){
22 fnSucceed(oAjax.responseText)
23 }else{
24 if(fnFailed){
25 fnFailed()
26 }
27 }
28 }
29 }
30}
面向对象
封装、继承、多态。
1# 对象的组成
2 方法:函数:过程、动态的
3 属性:变量:状态、静态的
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 // var obj1=new Object() //创建对象
9 // //定义属性
10 // obj1.name='Tim'
11 // obj1.age=29
12 // //定义方法
13 // //this指向调用此方法的对象 所以this指向obj1
14 // obj1.showName=function(){
15 // alert('我的名字'+this.name)
16 // }
17 // obj1.showAge=function(){
18 // alert('我的年龄'+this.age)
19 // }
20 // obj1.showName()
21 // obj1.showAge()
22
23 // var obj2=new Object() //创建对象
24 // //定义属性
25 // obj2.name='xiaod'
26 // obj2.age=32
27 // //定义方法
28 // //this指向调用此方法的对象 所以this指向obj1
29 // obj2.showName=function(){
30 // alert('我的名字'+this.name)
31 // }
32 // obj2.showAge=function(){
33 // alert('我的年龄'+this.age)
34 // }
35 // obj2.showName()
36 // obj2.showAge()
37
38 function createMan(name1,age1){ //构造函数
39 var obj=new Object() //创建对象
40 //定义属性
41 obj.name=name1
42 obj.age=age1
43 //定义方法
44 obj.showName=function(){
45 alert('我的名字'+this.name)
46 }
47 obj.showAge=function(){
48 alert('我的年龄'+this.age)
49 }
50 return obj
51 }
52
53 var obj1=createMan('Tim',29)
54 var obj2=createMan('xiaod',32)
55 // obj1.showName()
56 // obj2.showName()
57 alert(obj1.showName==obj2.showName) //返回false 证明每次调用构造函数的时候他都会重新创建showName和showAge这两个方法 ,这不是我们想要的
58 </script>
59</body>
60</html>
构造函数等同于我们此时只做了初始化
我们还需要用 new 来实例化我们的构造函数
1# new 帮我们做了两件事
2 帮我们创建空白对象 var this = new Object()
3 帮我们返回经过加工过的对象 obj
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 //工厂函数
9 //构造函数此时只是做了初始化工作
10 function createMan(name1,age1){ //构造函数
11 //添加原料
12 // var obj=new Object() //创建对象
13 //当使用new实例化的时候,其实系统帮我们做了这步
14 //var this=new Object()
15 //对我们的原料进行加工
16 //定义属性
17 this.name=name1
18 this.age=age1
19 //定义方法
20 this.showName=function(){
21 alert('我的名字'+this.name)
22 }
23 this.showAge=function(){
24 alert('我的年龄'+this.age)
25 }
26 //出厂
27 // return obj
28 }
29 //使用new进行实例化构造函数
30 //new帮我们做了两件事 1、创建原料var this=new Object() 2、return this
31 var obj1=new createMan('Tim',29)
32 var obj2=new createMan('xiaod',32)
33 obj1.showAge()
34 obj2.showAge()
35 alert(obj1.showAge==obj2.showAge)
36 //输出的还是false ,证明每次调用还是会重新生成了我们的定义的方法
37 </script>
38</body>
39</html>
原型可以避免公共方法的多次创建
protoype (原型,雏形) 这个英文在不同编程语言里面居然意思完全不一样。 在 Java 里面,原型属于一种设计模式,原型实例可以指定创建对象的种类,并且通过拷贝这些原型创建新的对象。不需要知道任何创建的细节,不调用构造函数。 属于—— 创建型。 因为 new 产生的一个对象需要非常繁琐的过程(数据准备、访问权限等),原型模式性能比直接 new 一个对象性能高(在内存中进行二进制流拷贝)。 也就是说原型是为了创建多个相同类型对象的模板,很明显是多例。 在 Java 里面 singleton(单例) 有单例模式去实现。 而在 JavaScript 中 prototype 恰恰相反,它的作用是用来避免对象中的公共方法被的多次创建,也就是说是为了让对象中的公共方法变为单例而出现的。
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <script type="text/javascript">
8 //工厂函数
9 //构造函数此时只是做了初始化工作
10 function createMan(name1,age1){ //构造函数
11 //添加原料
12 //当使用new实例化的时候,其实系统帮我们做了这步
13 //var this=new Object()
14 //对我们的原料进行加工
15 //定义属性
16 this.name=name1
17 this.age=age1
18
19 //出厂
20 // return obj
21 }
22 //利用原型来添加共用的方法(行为)
23 createMan.prototype.showName=function(){
24 alert('我的名字'+this.name)
25 }
26 createMan.prototype.showAge=function(){
27 alert('我的年龄'+this.age)
28 }
29
30 //使用new进行实例化构造函数
31 //new帮我们做了两件事 1、创建原料var this=new Object() 2、return this
32 var obj1=new createMan('Tim',29)
33 var obj2=new createMan('xiaod',32)
34 // obj1.showAge()
35 // obj2.showAge()
36 alert(obj1.showAge==obj2.showAge) //true
37
38 </script>
39</body>
40</html>
BOM
什么是 BOM
BOM(Browser Object Model)即浏览器对象模型,是一个与浏览器窗口进行交互的对象。
打开或关闭一个窗口
1window.open()
2window.close()
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <button onClick="window.open('12.1.close.html')">打开新页面</button>
8 <!-- <button onClick="openNewPage()">打开新页面</button> -->
9 <script type="text/javascript">
10
11 function openNewPage(){
12 var openPage=window.open()
13 openPage.document.write('你好,我是新打开的页面')
14 }
15
16 </script>
17</body>
18</html>
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <button onClick="window.close()">关闭页面</button>
8</body>
9</html>
BOM 常用属性和系统对话框
1# 获取设备及浏览器的类型型号
2 windows.navigator.userAgent
3
4# 获取当前文档地址对象
5windows.location
6 location.host 主机加端口号
7 location.hostname 主机
8 location.port 端口号
9 location.protocol 协议
10 location.pathname 路径
11 location.hash 片段标识符,可以用于保存网页状态
12 location.search 返回问号后的字段
13 location.href 可以用location.href='url'去打开页面
14
15# 系统对话框
16 警告框:alert("内容")
17 选择框:confirm("提问的内容")
18 输入框:prompt()
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <button onClick="window.location.href='http://www.baidu.com'">跳转到官网</button>
8 <script type="text/javascript">
9 window.onload=function(){
10 //获取设备及浏览器的类型型号
11 console.log(window.navigator.userAgent)//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
12 //获取当前文档地址对象
13 console.log(window.location) //Location
14
15 }
16 </script>
17</body>
18</html>
BOM 常用事件
1window.onload
2
3windows.onscroll 滚动距离
4 谷歌浏览器 document.body.scrollTop
5 IE、火狐浏览器 document.documentElement.scrollTop
6
7windows.onresize 可视区尺寸
8 document.documentElement.clientWidth
9 document.documentElement.clientHeight
1<!DOCTYPE html>
2<html>
3<head>
4 <title></title>
5</head>
6<body>
7 <div style="height:2000px;background:red;"></div>
8
9 <script type="text/javascript">
10
11 window.onload=function(){
12 //滚动事件
13 window.onscroll=function(){
14 //兼容ie 获取滚动距离
15 if(document.body.scrollTop){
16 console.log(document.body.scrollTop)
17 }else{
18 console.log(document.documentElement.scrollTop)
19 }
20 }
21
22 //监听可是窗口变化事件
23 window.onresize=function(){
24 console.log(document.documentElement.clientHeight)
25 }
26 }
27
28 </script>
29</body>
30</html>