目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

JavaScript

JavaScript

  • JavaScript一种直译式脚本语言,是一种动态类型、弱类型、 基于原型的语言,内置支持类型
  • Javascript是当今最流行的脚本语言,我们生活中看到的网页 和基于html5的app里面的交互逻辑都是由javascript驱动的
  • 一句话概括就是javascript是一种运行在浏览器中的解释型的编程语言

JS的组成

  • ECMAScript : 解释器、翻译者 (描述了该语言的语法和基本对 象) 它是javascript的标准。
  • DOM : Document Object Model 文档对象模型 W3C是DOM 的标准。
  • BOM : Browser Object Model 浏览器对象模型 缺乏标准。

演示
 注册事件、找到目标元素、修改css属性

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#tim{
			width: 200px;
			height: 200px;
			border:1px solid black;
			margin:0 auto;
		}
	</style>
</head>
<body>
	<div id="tim" onmouseover="tim.style.background='red'" onmouseout="tim.style.background='white'"></div>
</body>
</html>

获取标签元素

# 返回这个id名的元素
	document.getElementById('ID名') 

# 返回所有这个标 签名的元素的集合
	document.getElementsByTagName('div')

# 返回所有这个 class的元素的集合
	document.getElementsByClassName('className')

# 返回第一个 
	document.querySelector("css任意选择器")

# 返回符合的所有
	document.querySelectorAll("css任意选择器")

# 获取HTML元素
	document.documentElement

# 获取body元素
	document.body
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#tim{
			width: 200px;
			height: 200px;
			border:1px solid black;
			margin:0 auto;
		}
	</style>
</head>
<body>
	<div id="tim" class="xiaod"></div>
	<script type="text/javascript">
		//返回这个id名的元素
		// document.getElementById('tim').style.background='red'
		//返回所有这个标签名的元素的集合  获取到的是一个集合,拥有数组的特性
		// document.getElementsByTagName('div')[0].style.background='black'
		//通过classname获取到的也是一个集合
		// document.getElementsByClassName('xiaod')[0].style.background='yellow'
		//document.querySelector("css任意选择器") 返回第一个
		// document.querySelector("div").style.background='black'
		//document.querySelectorAll("css任意选择器")  返回符合的所有
		document.querySelectorAll("div")[0].style.background='red'
	</script>
</body>
</html>

JS编写的位置

  • 一般情况下JS是写在页面的任何位置都可以的,需要script标签包着,但是别写在html标签外
  • 最常见的是写在head标签内部和body内部
  • 写在head标签内需要写上window.onload包着,要不然会报错,因为执行js时页面标签还没加载
* window.onload的作用是当页面加载完成后自动触发事件
* ⼀个页面应该只有⼀个window.onload事件,因为如果写多个的话会覆盖只执行最后一个
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#tim{
			width: 200px;
			height: 200px;
			border:1px solid black;
			margin:0 auto;
		}
	</style>
	<script type="text/javascript" src="js代码应该写在哪里.js"></script>
</head>
<body>
	<div id="tim" class="xiaod"></div>
<!-- <script type="text/javascript">
		//window.onload的作用是当页面加载完成后自动触发事件
		window.onload=function(){
			document.getElementsByTagName('div')[0].style.background='red'
			alert(1)
		}
		window.onload=function(){
			document.getElementsByTagName('div')[0].style.background='black'
			alert(2)
		}
		window.onload=function(){
			document.getElementsByTagName('div')[0].style.background='yellow'
			alert(3)
		}
	</script> -->
</body>
</html>

详细分析JS输出及调试方式

# 弹窗型输出
	alert('输出内容')

# 浏览器调试窗口输出
	console.log('输出内容')

# innerHTML、innerText(innerText不会解析HTML标签,而是原样输出)
	document.getElementById('id名').innerHTML='内容'

# document.wirte("输出内容")
	输出内容会清空原有的 html 再生成一个新的 html
	document.getElementById('rewrite').onclick=function(){
		document.write('我是新的html了,原本的已经被我替代掉')
	}

JS常见事件

 JS事件就是我们的行为能被检测到,且触发相对应的函数(to do sth)

onclick	鼠标点击事件
onmouseover	鼠标被移到某元素之上
onmouseout	鼠标从某元素上面移开
onchange	元素值改变,一般用在表单元素上
onkeydown	用户按下键盘按键
onfocus	元素获得焦点
onblur	元素失去焦点
window.onload	页面加载完成
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#tim{
			width:300px;
			height: 300px;
			background:red;
			margin: 0 auto;
		}

	</style>
</head>
<body>
		<div id="tim"></div>
		<input type="" name="" id="xd">
		<script type="text/javascript">
			//点击事件
			document.getElementById("tim").onclick=function(){
				//函数里面写我们要做的事情
				alert('我是被点击了')
			}
			//鼠标移入事件
			document.getElementById("tim").onmouseover=function(){
				console.log('鼠标移入我的范围内了')
			}
			//鼠标移出事件
			document.getElementById("tim").onmouseout=function(){
				console.log('鼠标移出我的范围内了')
			}
			//元素改变事件,一般用在表单元素
			document.getElementById('xd').onchange=function(){
				console.log(document.getElementById('xd').value)
			}
			//键盘事件,按下键盘事件
			document.getElementById('xd').onkeydown=function(){
				console.log('键盘按下了')
			}
			//获取焦点事件
			document.getElementById('xd').onfocus=function(){
				console.log('我获取到焦点了')
			}
			//失去焦点事件
			document.getElementById('xd').onblur=function(){
				console.log('我失去焦点了')
			}
		</script>
</body>
</html>

手动操作DIV的任意样式

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">

		#tim{
			width: 100px;
			height: 100px;
			background: red;
			margin: 0 auto;
		}
	</style>
</head>
<body>
	<button id="taller">增高</button>
	<button id="longer">增长</button>
	<button id="changebg">改变背景颜色</button>
	<div id="tim" ></div>
	<script type="text/javascript">

		window.onload=function(){
			//给我们的增高按钮添加点击事件
			document.getElementById('taller').onclick=function(){
				//获取id名为tim的div
				document.getElementById('tim').style.height='300px'
			}
			//给我们的增高长按钮添加点击事件
			document.getElementById('longer').onclick=function(){
				//获取id名为tim的div
				document.getElementById('tim').style.width='300px'
			}
			//给我们的改变背景颜色按钮添加点击事件
			document.getElementById('changebg').onclick=function(){
				//获取id名为tim的div
				document.getElementById('tim').style.background='black'
			}
		}
	</script>
</body>
</html>

数据类型

基础数据类型

* 字符串 string
* 数字(整型浮点型) number
* 布尔 boolean
* 空对象 null	console.log(typeof(null))   =>  null
* undefined 未定义

复杂数据类型

* 数组 Array   
* 对象 Object	console.log(typeof({}))  =>  

检测数据类型的两种基本方法

* typeof  //复杂数据类型、引用数据类型 在 typeof() 下都显示为 object
* Object.prototype.toString.call('数据')  //鉴别复杂数据类型、引用数据类型
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//字符串
		console.log(typeof('string'))
		//数字
		console.log(typeof(234))
		//布尔值
		console.log(typeof(true))
		//null
		console.log(typeof(null))
		//undefined
		console.log(typeof(undefined))
		//object 
		// console.log(typeof({}))
		console.log(Object.prototype.toString.call({}))   /* [object Object] */
		//数组
		// console.log(typeof([]))
		console.log(Object.prototype.toString.call([]))   /* [object Array] */
	</script>
</body>
</html>

变量

如何定义变量
var name

命名规则
 首字母(a-zA-Z)或下划线()或美元符($)开头,不能是数字
 后面的可以是字母(a-zA-Z)或下划线(
)或美元符($)或数字,并且是区分大小写的。
 区分大小写的意思是 var name 和 var Name 是定义两个不同的变量。

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">

		#tim{
			width: 100px;
			height: 100px;
			background: red;
			margin: 0 auto;
		}
	</style>
</head>
<body>
	<button id="taller">增高</button>
	<button id="longer">增长</button>
	<button id="changebg">改变背景颜色</button>
	<div id="tim" ></div>
	<script type="text/javascript">

		//定义变量 用var
		console.log('我是'+a)
		var a='tim'

		//上面两行代码等同于下面的代码  因为js执行是先定义再执行   变量提升问题
		var a
		console.log('我是'+a)
		a='tim'

		//变量的使用方式
		window.onload=function(){
			var oDiv=document.getElementById('tim')
			//给我们的增高按钮添加点击事件
			document.getElementById('taller').onclick=function(){
				//获取id名为tim的div
				oDiv.style.height='300px'
			}
			//给我们的增高长按钮添加点击事件
			document.getElementById('longer').onclick=function(){
				//获取id名为tim的div
				oDiv.style.width='300px'
			}
			//给我们的改变背景颜色按钮添加点击事件
			document.getElementById('changebg').onclick=function(){
				//获取id名为tim的div
				oDiv.style.background='black'
			}
		}
	</script>
</body>
</html>

数据类型之间的转换

显式转换(强制类型转换)

Number()
parseInt()
pareFloat()
String()
toString()
Boolean()

隐式转换

* 操作符或者语句进行运算时
* if while 比较里面也会进行隐式转换
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
			var a='123'
			var b='abc'
			//强制类型转换(显式转换)
			console.log(a,"类型:"+typeof(a))
			console.log(a,"用number进行类型转换之后的类型:"+typeof(Number(a)))

			//用number转换一个是字符串类型,但内容不是数字
			console.log(b,"类型:"+typeof(b))
			console.log(b,Number(b),"用number进行类型转换之后的类型:"+typeof(Number(b)))
			//NaN是not a number的缩写 意思是 不是一个数字

			var c='3.1415926abc'
			console.log(c,'整形转换:'+parseInt(c))
			console.log(c,'浮点型转换:'+parseFloat(c))

			var d=123456
			console.log(d,String(d),typeof(String(d)))
			console.log(d,d.toString(),typeof(d.toString()))

			console.log(d,Boolean(d))

			//隐式转换
			//数字跟数字相加,不用转换类型
			// var sum
			// sum=1+2
			// console.log('sum='+sum)
			//数字跟字符串相加 发生类型转换,会变成字符串之间的拼接,就是把我们的数字1变成了字符串‘1’
			var sum
			sum=1+'2'
			console.log('sum='+sum,typeof(sum))
			if(12=='12'){
				console.log('判断成立了,我被执行了')
			}
	</script>
</body>
</html>

复杂数据类型的创建

数组创建

# 直接创建
	var arr=[]	//空数组
	var arr=[1,2]	//创建有内容的数组
# 利用构造函数创建
	var arr1 = new Array();		//创建空数组
	var arr2 = new Array(10);	//创建一个长度为10的数组
	var arr3 = new Array(5,4,3,2,1)	//创建数组并初始化

对象创建

# 直接创建
	var obj={}		//创建空对象
	var obj1={a:1,b:2}	//创建有内容的对象
# 利用构造函数创建
	var obj = new Object()

函数

 函数出现的意义:方便我们封装、调用代码

函数的定义

function fun(){console.log(1)}
var fun = function(){console.log(2)}
var fun = new Function(console.log(3)) //这种方式函数会自调用(函数自己完成调用动作)

函数的调用

fun()

示例

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">

		#tim{
			width: 100px;
			height: 100px;
			background: red;
			margin: 0 auto;
		}
	</style>
</head>
<body>
	<button id="taller" onClick="taller()">增高</button>
	<button id="longer" onClick="longer()">增长</button>
	<button id="changebg" onClick="changebg()">改变背景颜色</button>
	<div id="tim" ></div>
	<script type="text/javascript">
			//获取到要改变的div  id为tim
			var oDiv=document.getElementById('tim')
			//写点击增高的按钮时需要调用的函数
			var taller=function(){
					oDiv.style.height='300px'
			}
			//写点击增长的按钮时需要调用的函数
			function longer(){
					oDiv.style.width='300px'
			}
			//写点击改变背景颜色的按钮时需要调用的函数
			function changebg(){
					oDiv.style.background='black'
			}

		// window.onload=function(){
		// 	//给我们的增高按钮添加点击事件
		// 	document.getElementById('taller').onclick=function(){
		// 		//获取id名为tim的div
		// 		document.getElementById('tim').style.height='300px'
		// 	}
		// 	//给我们的增高长按钮添加点击事件
		// 	document.getElementById('longer').onclick=function(){
		// 		//获取id名为tim的div
		// 		document.getElementById('tim').style.width='300px'
		// 	}
		// 	//给我们的改变背景颜色按钮添加点击事件
		// 	document.getElementById('changebg').onclick=function(){
		// 		//获取id名为tim的div
		// 		document.getElementById('tim').style.background='black'
		// 	}
		// }
	</script>
</body>
</html>

命名规范

# 变量
	小驼峰命名法:第一个单词以小写字母开始,第二个单词开始以后的每个单词的首字母都大写	var  tim  

# 函数名
	小驼峰命名法	function getUserInfo(){}

# 常量
	全大写单词间用下划线隔开(_) 	var CH_NAME='tim' 

函数的几种写法

function fun(){}	//最常见的声明
(function fun(){})	//函数表达式声明方式,只在括号内起作用,外部无法访问
(function(){})	//匿名函数表达式,外部无法访问
new Function()	//通过构造器方式,因为麻烦,很少用
export default function(){}	//es6的向外暴露方法
()=>{}	//箭头函数,es6

函数的传参、取参

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">

		#tim{
			width: 100px;
			height: 100px;
			background: red;
			margin: 0 auto;
		}
	</style>
</head>
<body>
	<button id="taller" onClick="change('height','300px')">增高</button>
	<button id="longer" onClick="change('width','300px')">增长</button>
	<button id="changebg" onClick="change('background','black')">改变背景颜色</button>
	<div id="tim" ></div>
	<script type="text/javascript">
		//获取到要改变的div  id为tim
			var oDiv=document.getElementById('tim')
			//写点击增高的按钮时需要调用的函数
			// var taller=function(){
			// 		oDiv.style.height='300px'
			// }
			// //写点击增长的按钮时需要调用的函数
			// function longer(){
			// 		oDiv.style.width='300px'
			// }
			// //写点击改变背景颜色的按钮时需要调用的函数
			// function changebg(){
			// 		oDiv.style.background='black'
			// }

			function change(styleattr,value){
				//两种写法是一样的,但是如果需要传入变量就需要用第二种
					// oDiv.style.styleattr=value
					oDiv.style[styleattr]=value
			}
	</script>
</body>
</html>

不定参数(arguments)
 不确定传入的参数有多少个。

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>

	<script type="text/javascript">
		//利用arguments来编写一个求和函数
		function sum(){
			var sum=0
			for(var i=0;i<arguments.length;i++){
				sum=sum+arguments[i]
			}
			console.log(sum)
		}

sum(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)

	</script>
</body>
</html>

变量作用域

# 局部变量
	只在定义的函数内部使用

# 全局变量
	可以在整个script作用域内都可以使用

# 作用域链
	只有在自己当前的小作用域内找不到才会向父级作用域寻找,直到找不到为止(存在同名变量时,在当前作用域内局部变量会覆盖全局变量,局部变量优先级比较高)

闭包
 可以调用函数内部变量的函数。

		//闭包
		function a(){
			var tim=10
			var b=function(){
				console.log(tim)
			}
			return b
		}
		//a方法返回b方法,再执行:b方法可以调用函数内部变量tim,避免造成全局变量的污染
		a()()

函数的返回值

* 一个函数可以有多个return,但是第一个return代表函数结束运行。
* 不写return,函数默认返回undefined
* 想返回多个值,可以把多个值封装成:数组、或是json对象
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
		<script type="text/javascript">
			//函数不写返回值会默认返回undefined
			function fun(){
				var tim=10
				var xd=20
				var obj={'tim':tim,'xd':xd}
				return obj

			}
			console.log(fun())
		</script>
</body>
</html>

流程控制

  • if else if else
  • b==='10'?console.log('成立'):console.log('不成立')
  • switch case

示例

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>

	<script type="text/javascript">
		var a=9
		//判断  一个=表示赋值   两个==是判断左右两边是否相等 还会进行类型的转换
		//三个===是全等的类型,意思是不会转换类型 ,要判断===左右两边的类型和值都相等才会返回true
		// if(a==10){
		// 	console.log('a等于10是成立的')
		// }else{
		// 	console.log('a等于10是不成立的')
		// }

		// if(a=='11'){
		// 	console.log('两个==会转换类型')
		// }else if(a==10){
		// 	console.log('a等于10是成立的')
		// }else{
		// 	console.log('a不等于10 也不等于11')
		// }

		//全等是三个=== ,需要左右两边的类型和值都一样才返回true
		// if(a==='9'){
		// 	console.log('现在的是指和类型都相等')
		// }else{
		// 	console.log('现在的是指和类型不全相等,有可能是值不相等,有可能是类型不相等,也有可能两者都不相等')
		// }

		//三目运算    条件?'成立执行冒号前面的': '不成立执行冒号后面的'
		// var b=10
		// b==='10'?console.log('成立'):console.log('不成立')

		//switch  case 的高级用法  这里case 是 === 全等的判断

		function fun(type){
			switch(type){
				case 0:
				console.log('传入的条件是0');
				break;
				case 1:
				console.log('传入的条件是1');
				break;
				case 2:
				console.log('传入的条件是2');
				break;
				case 3:
				console.log('传入的条件是3');
				break;
				case 4:
				console.log('传入的条件是4');
				break;
				default:
				console.log('我是默认的,就是上述条件都不成立就输出我');
				break;
			}
		}
		fun(0)
	</script>
</body>
</html>

循环

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//第一种 while循环
		//1、创建循环变量
		// var tim =10
		// //2、判断循环条件
		// while(tim>=5){
		// 	//3、判断成立就执行循环体里面的操作
		// 	console.log(tim)
		// 	//4、更新循环变量
		// 	tim=tim-1
		// 	// tim--
		// }

		//  do  while 循环
		//创建循环变量
		// var tim = -1;
  //           //即使初始条件不成立,循环体内容还是会执行一次
		// do{
		// 	//执行循环体内容
		//     console.log(tim);//10 9 8 7 6 5 4 3 2 1 0
		//     //更新循环变量
		//     tim--;
		//     }while(tim>=0);//判断循环条件
  
		// console.log(tim);//-1

		//for循环  一般拿来循环数组
		// var arr=['篮球','足球','乒乓球','羽毛球','排球']
		// console.log(arr.length,arr[4])
		// for(var i=0;i<arr.length;i++){
		// 	console.log(arr[i])
		// }

		//for in  一般拿来循环对象
		var  obj={a:'篮球',b:'足球',c:'乒乓球'}
		// console.log(obj.b)
		for(o in obj){
			// console.log(o)
			console.log(obj[o])
		}
	</script>
</body>
</html>

break、continue

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//break用于循环体内部跳出循环
		// for(var i=0;i<=5;i++){
		// 	if(i==3){
		// 		break;
		// 	}
		// 	console.log(i)
		// }
		// console.log(i,'我是循环体外的i,不是循环体内部的内容')

		//continue用于中断符合判断条件的当前迭代
		for(var i=0;i<=5;i++){
			if(i==3){
				continue;
			}
			console.log(i)
		}
		console.log(i,'我是循环体外的i,不是循环体内部的内容')
	</script>
</body>
</html>

真假

  • 真:除了假都是真
  • 假:false 数字0 空字符串 null undefined NAN
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
			//判断里面的真假
			// 假:  false  数字0   空字符串   null  undefined  NAN
			var  a={a:'1'}
			var key=true
			if(key){
				console.log('我是真的')
			}else{
				console.log('我是假的')
			}
	</script>
</body>
</html>

逻辑运算符

  • && 全部真才返回真
  • || 一个真就返回真
  • ! 真变成假,假变成真
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
			//判断里面的真假
			// 假:  false  数字0   空字符串   null  undefined  NAN
			//与 &&   意思是判断条件都需要为真才返回真
			var  a=false  
			var  b=undefined
			var  c=null
			// if( a && b && c){
			// 	console.log('a和b都是真的')
			// }else{
			// 	console.log('a和b不全是真')
			// }

			//或  ||  只需要有一个条件成立为真  就返回真

			// if( a || b || c){
			// 	console.log('a或b或c有一个为真')
			// }else{
			// 	console.log('三者都为假')
			// }

			// !  非   真变成假  假变成真

			if(!a){
				console.log('a是假')
			}
	</script>
</body>
</html>

JSON

 JavaScript Object Notation 的缩写,它是一种数据交换格式。
 JSON基于文本,轻量,用于前后端交换数据。
 JSON是ECMA的一个标准,几乎所有的变成语言都有解析JSON的库。

# JSON VS XML
* 可读写	XML更加规范
* 便捷性	JSON更加便捷
* 轻量级	意味着数据交换速率快

JSON对象

{"name":"JSON对象","address":"广东省广州市","age":28}

JSON数据

[
	{"name":"JSON数组1","address":"广东省广州市","age":28},
	{"name":"JSON数组1","address":"广东省广州市","age":28},
]

JSON字符串

'{"name":"JSON数组1","address":"广东省广州市","age":28}'

演示:json对象、json数组、json字符串

		<script type="text/javascript">
			//json对象
			var jsonObj={"name":"tim","age":28}
			console.log(jsonObj,typeof(jsonObj))

			//json数组
			var  jsonarr=[
				{"name":"tim","age":28},
				{"name":"tim","age":28},
				"json字符串"
			]
			console.log(jsonarr,typeof(jsonarr))

			//json字符串
			var jsonString='{"name":"tim","age":28}'
			console.log(jsonString,typeof(jsonString))
		</script>

JSON字符解析

# 序列化  JSON.parse()
	把 js 对象转成 json 字符串

# 反序列化  JSON.stringify()
	把 JSON 字符串转成 js 对象

JSON对象操作

# 增
	obj.xxx='xxx'

# 删
	delete obj.xxx

# 改
	obj.xxx='xxx'

# 查
	obj.xxx
		<script type="text/javascript">
			//对于json对象的操作
			var obj={"name":"tim","age":18}
			// console.log(obj)

			//对对象增加一个属性
			obj.height="180cm"

			//删除一个属性  删除年龄
			delete obj.age

			//更改一个属性的值  把名字改成tom
			obj.name="tom"

			//查找名字是什么  obj.name
			console.log(obj.name)

			var  arr=[
				{"name":"tim","age":18},
				{"name":"tony","age":20},
				{"name":"jerry","age":23}
			]

			for(var i=0;i<arr.length;i++){
				console.log(arr[i])
			}
		</script>

数组操作

* shift()	删除数组第一个元素,并返回被删除的元素
* pop()	删除数组最后一个元素,并返回被删除的元素
* unshift()	向数组第一个元素前面添加一个元素,返回数组长度
* push()	向数组最后一个元素后面添加一个元素,返回数组长度
* concat()	合并两个或多个数组
* join(separator)	数组转字符串,可传入一个参数用于分隔元素
* split(separator,howmany)	字符串转数组,可传入两个参数
	separator:必选,实现方法为将字符串按某个字符切割成若干个字符串,并以数组形式返回
	howmany:可选,该参数可指定返回的数组的最大长度,如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
* reverse()	翻转数组,颠倒数组中元素的顺序
* sort(fucntion)	数组排序,传入一个参数function
	function	规定排序顺序,必须函数。如果不传入函数则按照字符编码顺序排序
* slice(start,end)	返回数据中被选定的元素,不包含下标end的元素
	start	必选,从何处开始选取。如果是负数,则从数组未必开始算起,-1代表最后一个元素。
	end	可选,规定从何处结束选取。如果不指定则从start开始截取到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组为不开始算起的元素。
* splice(index,howmany,x,y,z)		可以对数组进行增加,删除,更改的操作,会返回被删除的元素。
	index	必选,整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
	howmany	必选,要删除的元素数目,如果设置为0,则不会删除元素.
	x,y,z	可选项,为添加的新元素

* indexOf(item,start)	返回元素的索引,即下标,如果没有查找的元素就返回-1
	item	必选,查找的元素
	start	可选,整数,规定在数组中开始检索的位置,如不选则为第一个开始检索
	<script type="text/javascript">
		//创建数组
		var arr=["篮球","足球","乒乓球","羽毛球"]
		//删除数组第一个元素   返回值为被删除的元素
		// var first=arr.shift()
		// console.log(first)
		// console.log(arr)

		//删除数组最后一个元素  返回值为被删除的元素
		// var end=arr.pop()
		// console.log(end)
		// console.log(arr)

		//向我们的数组的第一个元素前面添加元素,返回添加后数组长度
		// var arrLength=arr.unshift('排球')
		// console.log(arrLength)
		// console.log(arr)

		//向我们数组最后一个元素后面添加元素,返回添加后数组长度
		var arrLength=arr.push("排球")
		console.log(arrLength)
		console.log(arr)


		//创建数组
		//合并数组,可合并两个或多个
		// var arr=["篮球"]
		// var arr1=["足球"]
		// var arr2=["乒乓球"]
		// console.log(arr.concat(arr1,arr2))
		// console.log(arr)
		//数组转字符串
		// var arr=["篮球","足球","乒乓球"]
		// console.log(arr.join(''))
		//字符串转数组
		// var string1="abcdecefg"
		// console.log(string1.split('c',3))
		//翻转数组,颠倒数组中元素的顺序
		var arr=[1,2,3,4,5]
		console.log(arr.reverse())

		// var arr=[1,3,5,4,2,6,7,7,9,11,8]
		//数组排序  有正向和反向(从大到小或从小到大) 不传参数就是按照字符编码排序
		//sort函数接收的参数也是一个函数,里面接收两个参数,
		// 返回第一个参数减第二个参数(a-b)即按照从小到大排序,
		// 返回第二个参数减第一个参数(b-a)即按照从大到小排序
		// console.log(arr.sort(function(a,b){
		// 	return  b-a
		// }))

		//选定数组里面指定下标的元素  slice
		// var a=arr.slice(6,8)
		// console.log(a)

		//可以对数组进行增删改的方法 splice
		// var arr=["篮球","足球"]
		// //利用splice方法增加
		// // arr.splice(0,0,"排球")
		// // console.log(arr)
		// //利用splice方法删除
		// // arr.splice(0,1)
		// // console.log(arr)
		// //利用splice方法进行更改元素
		// arr.splice(0,1,"排球","乒乓球")
		// console.log(arr)

		//查找元素索引,即下标  indexOf
		var arr=["篮球","足球","乒乓球","排球"]
		console.log(arr.indexOf("棒球"))

	</script>

定时器

# 间隔性定时器	setInterval(fun,time)
* fun为执行的函数
* time为间隔执行的时间,单位为毫秒,每过time时间就执行一次fun里面的代码

# 延时性定时器	setTimeout(fun,time)
* fun为执行的函数
* time为延时执行时间,单位为毫秒,经过time时间后执行fun代码,只执行一次
	<script type="text/javascript">
		//延时型的定时器 setTimeout 只会执行一次
		// setTimeout(function(){
		// 	alert("我是延时三秒执行的弹窗")
		// },3000)

		//间隔型定时器  setInterval   每间隔time的时间就会执行一次
		setInterval(function(){
			console.log(1)
		},2000)
	</script>

清除定时器

* clearInterval		清除间隔性定时器
* clearTimeout	清除延时性定时器
	<script type="text/javascript">
		//清除定时器  
		//创建间隔性定时器
		var timer1=setInterval(function(){
			console.log("我是间隔型定时器")
			// clearTimeout(timer2)
		},1000)
		//创建延时性的定时器
		var timer2=setTimeout(function(){
			console.log("我是延时性定时器")
			clearInterval(timer1)
		},3000)
	</script>

延时性定时器演示
 延时提示框

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#div1{
			float: left;
			width: 50px;
			height: 50px;
			background: red;
			margin-right: 30px;
		}
		#div2{
			float: left;
			width: 200px;
			height: 200px;
			background: black;
			display: none;
		}

	</style>
</head>
<body>
	<div id="div1"></div>
	<div id="div2"></div>
	<script type="text/javascript">

		window.onload=function(){
			var oDiv1=document.getElementById('div1')
			var oDiv2=document.getElementById('div2')
			var timer=null
			//给div2添加鼠标移入事件
			oDiv2.onmouseover=oDiv1.onmouseover=function(){
				//改变div2的display
				clearTimeout(timer)
				oDiv2.style.display='block'
			}
			//给div2添加鼠标移出事件
			oDiv2.onmouseout=oDiv1.onmouseout=function(){
				//改变div2的display
				timer=setTimeout(function(){
					oDiv2.style.display='none'
				},500)
			}
	</script>
</body>
</html>

间隔性定时器演示
 无缝滚动图片展示

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		*{margin:0;padding: 0;}
		#banner{
			position: relative;
			width: 600px;
			height: 150px;
			margin:100px auto;
			overflow: hidden;
		}
		#banner ul{
			position: absolute;
			left: 0;
			top:0;
		}
		#banner li{
			float: left;
			width: 200px;
			height: 150px;
			list-style: none;
		}
		#banner li img{
			width: 200px;
			height: 150px;
		}
	</style>
</head>
<body>
	<div id="banner">
		<ul>
			<li><img src="img/1.png"></li>
			<li><img src="img/2.png"></li>
			<li><img src="img/3.png"></li>
			<li><img src="img/4.png"></li>
			<li><img src="img/5.png"></li>
			<li><img src="img/6.png"></li>
		</ul>
	</div>
	<script type="text/javascript">
		window.onload=function(){
			var oDiv=document.getElementById('banner')
			var oUl=oDiv.getElementsByTagName('ul')[0]
			var oLi=oUl.getElementsByTagName('li')
			var timer=null
			//拼接多一份ul里面的内容 这两种写法相等
			// oUl.innerHTML=oUl.innerHTML+oUl.innerHTML
			oUl.innerHTML+=oUl.innerHTML
			//计算ul的宽度
			oUl.style.width=oLi[0].offsetWidth*oLi.length+'px'
			function moving(){
				if(oUl.offsetLeft<-oUl.offsetWidth/2){
					oUl.style.left='0'
				}
				oUl.style.left=oUl.offsetLeft-2+'px'
			}
			timer=setInterval(moving,30)
			oDiv.onmouseover=function(){
				clearInterval(timer)
			}
			oDiv.onmouseout=function(){
				timer=setInterval(moving,30)
			}
		}
	</script>
</body>
</html>

DOM操作

节点获取

# 获取子节点
childNodes	获取子节点(包括换行和空格)
children		children不会返回文本节点,返回的是元素节点

# 获取父节点
parentNode	获取的是当前元素的直接父元素,w3c的标准
parentElement	获取的是当前元素的直接父元素,ie的标准
offsetParent	获取离当前节点最近的一个有定位的父节点或祖先节点,如果没有即为获取body

# 判断节点的类型
nodeType	1为元素节点	3为文本节点(即空格或换行,字符)

# 获取第一个子节点
firstChild	有可能会匹配到时空白或换行的节点信息
firstElementChild	不会匹配空白或换行的节点信息(获取到的是元素节点,不会获取到文本节点)

# 获取最后一个子节点
lastChild	有可能会匹配到时空白或换行的节点信息
lastElementChild	不会匹配空白或换行的节点信息(获取到的是元素节点,不会获取到文本节点)

# 获取上一个兄弟节点
previousSibling	有可能会匹配到空白或换行的节点信息
previousElementSibling		不会匹配空白或换行的节点信息(获取到的是元素节点,不会获取到文本节点)

# 获取下一个兄弟节点
nextSibling	有可能会匹配到时空白或换行的节点信息
nextElementSibling		不会匹配空白或换行的节点信息(获取到的是元素的即诶但,不会获取到文本节点)
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#bigdiv{
			position: relative;
		}
	</style>
</head>
<body>
	<div id="bigdiv">
		<div id="div1">
			<div>1111</div>
			<div>2222</div>
		</div>
	</div>

	<script type="text/javascript">
		var oDiv=document.getElementById('div1')

		//childNodes获取子节点会获取到文本节点和元素节点
		var div1=oDiv.childNodes
		console.log(oDiv.childNodes)

		//这种只获取元素节点,不会获取到文本节点 children
		console.log(oDiv.children)

		//获取父节点
		// console.log(oDiv.parentNode)
		// console.log(oDiv.parentElement)
		// console.log(oDiv.offsetParent)

		//判断节点类型  1是元素节点    3是文本节点
		console.log(div1[0].nodeType,'我是第一个,我是文本节点')
		console.log(div1[1].nodeType,'我是第二个,我是元素节点')
	</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<div id="div1">
		<div>我是第一个</div>
		<div>我是第二个</div>
		<div id="three">我是第三个</div>
		<div>我是第四个</div>
		<div>我是第五个</div>
	</div>

	<script type="text/javascript">
		var oDiv=document.getElementById('div1')
		var three=document.getElementById('three')
		//获取第一个子节点
		// console.log(oDiv.firstChild)
		// console.log(oDiv.firstElementChild)
		//获取最后一个子节点
		// console.log(oDiv.lastElementChild)
		//获取上一个兄弟节点
		console.log(three.previousElementSibling)
		//获取下一个兄弟节点
		console.log(three.nextElementSibling)
	</script>
</body>
</html>

元素属性操作的三种方式

# 第一种
	oDiv.style.display="block";

# 第二种
	oDiv.style["display"]="block";

# 第三种(DOM方式)
	获取	getAttribute(属性名字)
	设置	setAttribute(属性名称,值)
	删除	removeAttribute(属性名称)
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<div id="div1" value="2">123</div>

	<script type="text/javascript">

		var oDiv=document.getElementById('div1')

		//第一种
		// oDiv.style.color='red'
		//第二种
		oDiv.style['color']='red'
		//第三种  dom的方式

		//获取属性
		console.log("我是改变前的id:"+oDiv.getAttribute('id'))
		console.log("我是改变前的value:"+oDiv.getAttribute('value'))

		//改变属性
		oDiv.setAttribute('id','tim')
		oDiv.setAttribute('value','100')
		console.log("我是改变后的id:"+oDiv.getAttribute('id'))
		console.log("我是改变后的value:"+oDiv.getAttribute('value'))

		//删除属性  removeAttribute
		oDiv.removeAttribute('value')

	</script>
</body>
</html>

DOM节点的创建、插入、删除

# 创建并添加DOM元素
document.createElement('标签名')	创建一个DOM节点
appendChild(DOM节点)	为某个DOM添加一个子节点,在最后面添加

# 插入元素
insertBefore(节点,原有节点)	在已有元素前插入

# 删除DOM元素
removeChild(节点)	删除一个节点
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<ul id="ullist">
		<li>我是第一个</li>
		<li>我是第二个</li>
		<li>我是第三个</li>
		<li>我是第四个</li>
	</ul>
	<script type="text/javascript">
		var oUl=document.getElementById('ullist')
		var oLi=oUl.getElementsByTagName('li')

		//创建dom节点
		var li=document.createElement('li')
		li.innerHTML='我是新创建的li'
		// oUl.appendChild(li)
		//我们要在指定的位置插入新创建的li
		// oUl.insertBefore(li,oLi[2])

		//删除节点
		oUl.removeChild(oLi[3])
	</script>
</body>
</html>

文档碎片
 减少页面渲染DOM的次数

DOM操作表格元素
 早期提供了更便捷的方法。

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<table id="table1" border="1">
		<thead>
			<td>姓名</td>
			<td>年龄</td>
			<td>身高</td>
		</thead>
		<tbody>
			<tr>
				<td>张三</td>
				<td>18</td>
				<td>180cm</td>
			</tr>
			<tr>
				<td>李四</td>
				<td>19</td>
				<td>190cm</td>
			</tr>
			<tr>
				<td>王五</td>
				<td>20</td>
				<td>170cm</td>
			</tr>
		</tbody>
	</table>

	<script type="text/javascript">

		var table1=document.getElementById('table1')
		// alert(table1.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[0].getElementsByTagName('td')[0].innerHTML)
		// alert(table1.tBodies[0].rows[0].cells[0].innerHTML)
		table1.tBodies[0].rows[0].cells[0].innerHTML='tim'

	</script>
</body>
</html>

运动框架

运动基础演示

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">

		*{
			margin:0;
			padding:0;
		}
		#div1{
			position: absolute;
			left: 0;
			top:50px;
			width: 200px;
			height: 200px;
			background:red;
		}
	</style>
</head>
<body>
	<button onclick="moving()">开始运动</button>
	<div id="div1"></div>

	<script type="text/javascript">
		var oDiv=document.getElementById('div1')
		var timer=null
		function moving(){
			timer=setInterval(function(){
				if(oDiv.offsetLeft>=300){
					clearInterval(timer)/*清楚定时器就会停止运动*/
				}else{
					oDiv.style.left=oDiv.offsetLeft+1+'px'
				}
	
			},30)
		}

	</script>
</body>
</html>

单物体运动框架
 封装好一个方法,让外部传入目的地的值,即让物体停下来的值。

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">

		*{
			margin:0;
			padding:0;
		}
		#div1{
			position: absolute;
			left: 0;
			top:50px;
			width: 200px;
			height: 200px;
			background:red;
		}
	</style>
</head>
<body>
	<button onclick="moving(500)">开始运动</button>
	<div id="div1"></div>

	<script type="text/javascript">
		var oDiv=document.getElementById('div1')
		var timer=null
		function moving(target){
			var speed=0
			if(oDiv.offsetLeft<target){
				speed=7
			}else{
				speed=-7
			}
			timer=setInterval(function(){
				if(Math.abs(target-oDiv.offsetLeft)<=7){
						oDiv.style.left=target+'px'
						clearInterval(timer)
				}else{
					oDiv.style.left=oDiv.offsetLeft+speed+'px'
				}
	
			},30)
		}

	</script>
</body>
</html>

多物体运动框架

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#div1,div{
			float: left;
			width: 100px;
			height: 100px;
			background: red;
			margin-right: 20px;
		}
	</style>
</head>
<body>
	<div id="div1"></div>
	<div></div>
	<div></div>
	<script type="text/javascript">
		var oDiv=document.getElementsByTagName('div')
		// var timer=null

		for(var i=0;i<oDiv.length;i++){
			//添加鼠标移入事件
			oDiv[i].timer=null
			oDiv[i].onmouseover=function(){
				moving(this,400)
			}
			//添加鼠标移出事件
			oDiv[i].onmouseout=function(){
				moving(this,100)
			}
		}

		// //添加鼠标移入事件
		// oDiv.onmouseover=function(){
		// 	moving(400)
		// }
		// //添加鼠标移出事件
		// oDiv.onmouseout=function(){
		// 	moving(100)
		// }
		function moving(obj,target){
			clearInterval(obj.timer)
			obj.timer=setInterval(function(){
				var speed=(target-obj.offsetHeight)/8
				//做向上取整和向下取整处理
				speed=speed>0?Math.ceil(speed):Math.floor(speed)
				if(obj.offsetHeight==target){
					clearInterval(obj.timer)
				}else{
					obj.style.height=obj.offsetHeight+speed+'px'
				}
			},30)
		}
	</script>

</body>
</html>

改变单一任意值运动框架
 在多物体运动框架的前提下增加一个修改样式的参数

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#div1,div{
			float: left;
			width: 100px;
			height: 100px;
			background: red;
			margin-right: 20px;
		}
	</style>
</head>
<body>
	<div id="div1" style="color:black;">111</div>
	<div id="div2"></div>
	<div id="div3"></div>
	<script type="text/javascript">
		var oDiv1=document.getElementById('div1')
		var oDiv2=document.getElementById('div2')
		var oDiv3=document.getElementById('div3')

			//给div1添加鼠标移入事件

			oDiv1.onmouseover=function(){
				moving(this,'fontSize',50)
			}
			//给div1添加鼠标移出事件
			oDiv1.onmouseout=function(){
				moving(this,'fontSize',12)
			}
			//给div2添加鼠标移入事件

			oDiv2.onmouseover=function(){
				moving(this,'width',400)
			}
			//给div2添加鼠标移出事件
			oDiv2.onmouseout=function(){
				moving(this,'width',100)
			}
			//给div3添加鼠标移入事件

			oDiv3.onmouseover=function(){
				moving(this,'height',400)
			}
			//给div3添加鼠标移出事件
			oDiv3.onmouseout=function(){
				moving(this,'height',100)
			}
			//oDiv1.style.xxx只能获取行内样式(内联样式)
			// console.log(oDiv1.style.color,'颜色')
			// console.log(oDiv1.style.width,'宽度')
			//获取内部样式(写在style标签内部的)  外部样式(通过link引入的样式表)
			//在谷歌浏览器获取内部和外部样式getComputedStyle
			// console.log(getComputedStyle(oDiv1,false)['width'])
			//在ie浏览器下就是用oDiv1.currentStyle

			//写一个方法获取我们需要改变的样式的值
			function getStyleValue(obj,attr){
				if(obj.currentStyle){
					return obj.currentStyle[attr]
				}else{
					return getComputedStyle(obj,false)[attr]
				}
			}

			console.log(getStyleValue(oDiv1,'width'))

			function moving(obj,attr,target){
				clearInterval(obj.timer)
				obj.timer=setInterval(function(){
					//定义一个变量接收我们需要改变的样式的值
					var currvalue=parseInt(getStyleValue(obj,attr)) 
					var speed=(target-currvalue)/8
					//做向上取整和向下取整处理
					speed=speed>0?Math.ceil(speed):Math.floor(speed)
					if(currvalue==target){
						clearInterval(obj.timer)
					}else{
						obj.style[attr]=currvalue+speed+'px'
					}
				},30)
			}

	</script>
</body>
</html>

链式运动框架
 在改变单一任意值运动框架添加一个回调函数参数
 链式运动顾名思义就是先运动完一个值,再运动另一个。

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#div1,div{
			float: left;
			width: 100px;
			height: 100px;
			background: red;
			margin-right: 20px;
		}
	</style>
</head>
<body>
	<div id="div1">点击我展开</div>
	<div id="div2"></div>
	<div id="div3">点击我收起</div>
	<script type="text/javascript">
		var oDiv1=document.getElementById('div1')
		var oDiv2=document.getElementById('div2')
		var oDiv3=document.getElementById('div3')


			oDiv1.onclick=function(){
				moving(oDiv2,'width',400,function(){
					moving(oDiv2,'height',400)
				})
			}
			oDiv3.onclick=function(){
				moving(oDiv2,'height',100,function(){
					moving(oDiv2,'width',100)
				})
			}
			//写一个方法获取我们需要改变的样式的值
			function getStyleValue(obj,attr){
				if(obj.currentStyle){
					return obj.currentStyle[attr]
				}else{
					return getComputedStyle(obj,false)[attr]
				}
			}

			console.log(getStyleValue(oDiv1,'width'))

			function moving(obj,attr,target,callbackfun){
				clearInterval(obj.timer)
				obj.timer=setInterval(function(){
					//定义一个变量接收我们需要改变的样式的值
					var currvalue=parseInt(getStyleValue(obj,attr)) 
					var speed=(target-currvalue)/8
					//做向上取整和向下取整处理
					speed=speed>0?Math.ceil(speed):Math.floor(speed)
					if(currvalue==target){
						clearInterval(obj.timer)
						if(callbackfun){
							callbackfun()
						}
					}else{
						obj.style[attr]=currvalue+speed+'px'
					}
				},30)
			}

	</script>
</body>
</html>

改变多值运动框架
 同时改变多个需要改变的样式值。

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#div1,div{
			float: left;
			width: 100px;
			height: 100px;
			background: red;
			margin-right: 20px;
		}
	</style>
</head>
<body>
	<div id="div1">点击我展开</div>
	<div id="div2"></div>
	<div id="div3">点击我收起</div>
	<script type="text/javascript">
		var oDiv1=document.getElementById('div1')
		var oDiv2=document.getElementById('div2')
		var oDiv3=document.getElementById('div3')


			oDiv1.onclick=function(){
				moving(oDiv2,{"width":400,"height":400})
			}
			oDiv3.onclick=function(){
				moving(oDiv2,{"width":100,"height":100})
			}
			//写一个方法获取我们需要改变的样式的值
			function getStyleValue(obj,attr){
				if(obj.currentStyle){
					return obj.currentStyle[attr]
				}else{
					return getComputedStyle(obj,false)[attr]
				}
			}

			console.log(getStyleValue(oDiv1,'width'))

			function moving(obj,json){
				clearInterval(obj.timer)
				obj.timer=setInterval(function(){
					//判断所有运动是否已完成
					var beclear=true
					for(var attr in json){
						//定义一个变量接收我们需要改变的样式的值
						var currvalue=parseInt(getStyleValue(obj,attr)) 
						var speed=(json[attr]-currvalue)/8
						//做向上取整和向下取整处理
						speed=speed>0?Math.ceil(speed):Math.floor(speed)
						if(currvalue!=json[attr]){
							beclear=false
							obj.style[attr]=currvalue+speed+'px'
						}
					}
					if(beclear){
						clearInterval(obj.timer)
					}
				},30)
			}

	</script>
</body>
</html>

完美运动框架
 基于多值运动框架,在运动完之后传入回调函数。
 改变透明度opacity需要做特殊处理

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#div1,div{
			float: left;
			width: 100px;
			height: 100px;
			background: red;
			margin-right: 20px;
		}
		#div2{
			/*兼容ie的写法*/
			filter: alpha(opacity:30);
			/*兼容非ie浏览器的写法*/
			opacity:0.3;
		}
	</style>
</head>
<body>
	<div id="div1">点击我展开</div>
	<div id="div2"></div>
	<div id="div3">点击我收起</div>
	<script type="text/javascript">
		var oDiv1=document.getElementById('div1')
		var oDiv2=document.getElementById('div2')
		var oDiv3=document.getElementById('div3')


			oDiv1.onclick=function(){
				moving(oDiv2,{"width":400,"height":400,"opacity":100},function(){
					alert('我已经执行完了')
				})
			}
			oDiv3.onclick=function(){
				moving(oDiv2,{"width":100,"height":100,"opacity":30})
			}
			//写一个方法获取我们需要改变的样式的值
			function getStyleValue(obj,attr){
				if(obj.currentStyle){
					return obj.currentStyle[attr]
				}else{
					return getComputedStyle(obj,false)[attr]
				}
			}

			console.log(getStyleValue(oDiv1,'width'))

			function moving(obj,json,callbackfun){
				clearInterval(obj.timer)
				obj.timer=setInterval(function(){
					//判断所有运动是否已完成
					var beclear=true
					for(var attr in json){
						//定义一个变量接收我们需要改变的样式的值
						var currvalue=0
						if(attr=='opacity'){
							// 为什么使用四舍五入的取整方式,是因为计算机对于计算存在一些bug,大家可以尝试输出 0.7*100就明白了 
							currvalue=Math.round(getStyleValue(obj,attr)*100)
						}else{
							currvalue=parseInt(getStyleValue(obj,attr)) 
						}
			
						var speed=(json[attr]-currvalue)/8
						//做向上取整和向下取整处理
						speed=speed>0?Math.ceil(speed):Math.floor(speed)

						if(currvalue!=json[attr]){
							beclear=false
							if(attr=='opacity'){
								obj.style.filter='alpha(opacity:'+(currvalue+speed)+')'
								obj.style.opacity=(currvalue+speed)/100
							}else{
								obj.style[attr]=currvalue+speed+'px'
							}
				
						}
					}
					if(beclear){
						clearInterval(obj.timer)
						if(callbackfun){
							callbackfun()
						}
					}
				},30)
			}

	</script>
</body>
</html>

事件

事件对象
 用来获取事件的详细信息,例如:鼠标位置、键盘按键。
 ie下可以直接使用event、非ie需要传入事件对象参数。

事件冒泡
&esmp;事件流会从DOM节点最里面的事件往最外面执行。
 取消事件冒泡兼容写法

* 获取事件对象(兼容写法)	var oEvent=ev || event;
* 取消事件冒泡 oEvent.cancelBubble=true;
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#div1{
			width: 300px;
			height: 300px;
			background: pink;
		}
		#div2{
			width: 150px;
			height: 150px;
			background: black;
			color: #fff;
		}
	</style>
</head>
<body>
	<div id="div1" >
		<div id="div2"></div>
	</div>

	<script type="text/javascript">
		var oDiv1=document.getElementById('div1')
		var oDiv2=document.getElementById('div2')
		// //通过事件对象获取鼠标移动时的坐标位置
		// document.onmousemove=function(ev){
		// 	//定义获取事件对象兼容(获取鼠标移动的横坐标、纵坐标)
		// 	var oEvent=ev||event
		// 	oDiv2.innerHTML=oEvent.clientX+','+oEvent.clientY
		// }
		// //通过事件对象获取键盘按键的值
		// document.onkeydown=function(ev){
		// 	//定义获取事件对象兼容
		// 	var oEvent=ev||event
		//	//键盘每个键对应的值可以百度搜索一下有一个表的  keyCode就是键的值
		// 	oDiv2.innerHTML=oEvent.keyCode
		// }
		oDiv1.onclick=function(){
			console.log("你点击了div1")
		}
		oDiv2.onclick=function(ev){
			console.log("你点击了div2")
			//阻止冒泡
			var oEvent=ev||event
			oEvent.cancelBubble=true
			console.log(oEvent)
		}

	</script>
</body>
</html>

事件绑定、事件解绑、事件捕获

# 事件绑定
	addEventListener(事件名称,函数,捕获),第三个参数为可选,默认为false,false 即事件流为事件冒泡。

# 事件解绑
	removeEventListener(事件名称,函数,捕获),默认为false,false即事件流为事件冒泡
	注意,时间绑定中传入匿名函数会导致无法进行事件解绑

# 事件捕获
	addEventListener(事件名称,函数,true)    和时间冒泡相反,如果开启了时间捕获就先执行捕获的事件,再执行当前被点击事件。
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#div1{
			width: 300px;
			height: 300px;
			background: pink;
		}
		#div2{
			width: 100px;
			height: 100px;
			background: black;
		}
	</style>
</head>
<body>
	<div id="div1">
		<div id="div2"></div>
	</div>

	<script type="text/javascript">
		var oDiv1=document.getElementById('div1')
		var oDiv2=document.getElementById('div2')
		//当你需要解绑的时候,事件绑定里面的函数不能是匿名函数
		oDiv1.addEventListener('click',fun,true)
		oDiv2.addEventListener('click',function(){
			console.log('你点击了div2')
			oDiv1.removeEventListener('click',fun,true)
		},false)
		function fun(){
			console.log('你点击了div1')
		}
	</script>

</body>
</html>

键盘事件以键盘码

单个键盘事件	document.onkeydown
组合按键事件	document.onkeyup
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//键盘事件
		// document.onkeydown=function(event){
		// 	console.log(event)
		// 	if(event.keyCode==13){
		// 		alert('你按下了回车键')
		// 	}
		// }
		document.onkeyup=function(event){
			if(event.ctrlKey && event.keyCode==67){
				alert('你按下了crtl+c')
			}
		}
	</script>
</body>
</html>

默认行为,阻止默认行为
 在浏览器里鼠标右键事件 oncontextmenu 会默认的给我们显示一个弹窗,这些就是事件的默认行为。
 a标签跳转也是一个默认行为,我们可以通过在他的点击事件里面用return false 来阻止默认行为。

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<a href="https://baidu.com" onClick="return false;">百度</a>
	<script type="text/javascript">

		document.oncontextmenu=function(){
			//用return  false来阻止默认行为
			return false;
		}

	</script>
</body>
</html>

Ajax

AJAX是什么?
 AJAX 是一种无须重新加载整个网页的情况下,能够更新部分网页的技术。
 AJAX 是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量的数据交换,AJAX 可以使网页实现异步更新。 这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

使用AJAX
 调用封装好的AJAX,传入读取的文件地址,成功需要做的事情和失败需要做的事。情.ajax(url,fnSucceed,fnFailed)
npm install -g http-server 安装http-server 启动一个本地静态服务。 启动服务使用 http-server
 浏览器为了安全考虑,默认禁止跨域访问。

调用AJAX

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<button id="read">读取数据</button>
	<script type="text/javascript" src="ajax.js"></script>
	<script type="text/javascript">

		var oBtn=document.getElementById('read')
		oBtn.onclick=function(){
			ajax('xiaod.txt?t='+new Date().getTime(),function(res){
				alert(res)
			},function(){
				alert('读取失败')
			})
		}


	</script>
</body>
</html>

封装AJAX

# 创建AJAX对象
	ie5、ie6 使用 var oAjax=new ActiveXObject("Microsoft.XMLHTTP")
	现在浏览器使用 var oAjax=new XMLHttpRequest()

# 连接服务器
	oAjax.open('GET',url,true)
	请求类型、文件服务器地址、异步(true) || 同步(false)

# 接收数据 (onreadystatechange事件)
readyState属性:请求状态
	0	(为初始化)	还没有调用open()方法
	1	(载入)		已调用send()方法
	2	(载入完成)	send()方法完成,已收到全部响应内容
	3	(解析)		正在解析响应内容
	4	(完成)		响应内容解析完成,可以在客户端调用了

status 属性:请求结果
	200:"OK"
	404:未找到页面

请求成功返回内容
	oAjax.responseText
//封装ajax调用事件
function ajax(url,fnSucceed,fnFailed){
	//1、创建ajax对象
	//创建ajax对象需要兼容,看看是否是ie5、6
	if(window.XMLHttpRequest){
		var oAjax=new XMLHttpRequest()
	}else{
		var oAjax=new ActiveXObject("Microsoft.XMLHTTP")
	}

	//2、连接服务器
	//传入三个参数,第一个为请求类型、第二个给请求地址,第三个是同步(true)或异步(false)
	oAjax.open('GET',url,true)

	//3、发送请求
	oAjax.send()

	//4、接收数据
	oAjax.onreadystatechange=function(){
		if(oAjax.readyState==4){
			if(oAjax.status==200){
				fnSucceed(oAjax.responseText)
			}else{
				if(fnFailed){
					fnFailed()
				}
			}
		}
	}
}

面向对象

 封装、继承、多态。

# 对象的组成
	方法:函数:过程、动态的
	属性:变量:状态、静态的
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		// var obj1=new Object()  //创建对象
		// //定义属性
		// obj1.name='Tim'
		// obj1.age=29
		// //定义方法
		// //this指向调用此方法的对象  所以this指向obj1
		// obj1.showName=function(){
		// 	alert('我的名字'+this.name)
		// }
		// obj1.showAge=function(){
		// 	alert('我的年龄'+this.age)
		// }
		// obj1.showName()
		// obj1.showAge()

		// var obj2=new Object()  //创建对象
		// //定义属性
		// obj2.name='xiaod'
		// obj2.age=32
		// //定义方法
		// //this指向调用此方法的对象  所以this指向obj1
		// obj2.showName=function(){
		// 	alert('我的名字'+this.name)
		// }
		// obj2.showAge=function(){
		// 	alert('我的年龄'+this.age)
		// }
		// obj2.showName()
		// obj2.showAge()

		function createMan(name1,age1){  //构造函数
			var obj=new Object()  //创建对象
			//定义属性
			obj.name=name1
			obj.age=age1
			//定义方法
			obj.showName=function(){
				alert('我的名字'+this.name)
			}
			obj.showAge=function(){
				alert('我的年龄'+this.age)
			}
			return obj
		}

		var obj1=createMan('Tim',29)
		var obj2=createMan('xiaod',32)
		// obj1.showName()
		// obj2.showName()
		alert(obj1.showName==obj2.showName) //返回false  证明每次调用构造函数的时候他都会重新创建showName和showAge这两个方法  ,这不是我们想要的
	</script>
</body>
</html>

构造函数等同于我们此时只做了初始化
我们还需要用new 来实例化我们的构造函数

# new 帮我们做了两件事
	帮我们创建空白对象 var this = new Object()
	帮我们返回经过加工过的对象 obj
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//工厂函数
		//构造函数此时只是做了初始化工作
		function createMan(name1,age1){  //构造函数
			//添加原料
			// var obj=new Object()  //创建对象
			//当使用new实例化的时候,其实系统帮我们做了这步
			//var this=new Object()
			//对我们的原料进行加工
			//定义属性
			this.name=name1
			this.age=age1
			//定义方法
			this.showName=function(){
				alert('我的名字'+this.name)
			}
			this.showAge=function(){
				alert('我的年龄'+this.age)
			}
			//出厂
			// return obj
		}
		//使用new进行实例化构造函数
		//new帮我们做了两件事  1、创建原料var this=new Object()  2、return this
		var obj1=new createMan('Tim',29)
		var obj2=new createMan('xiaod',32)
		obj1.showAge()
		obj2.showAge()
		alert(obj1.showAge==obj2.showAge)
		//输出的还是false ,证明每次调用还是会重新生成了我们的定义的方法
	</script>
</body>
</html>

原型可以避免公共方法的多次创建
 protoype (原型,雏形) 这个英文在不同编程语言里面居然意思完全不一样。 在Java里面,原型属于一种设计模式,原型实例可以指定创建对象的种类,并且通过拷贝这些原型创建新的对象。不需要知道任何创建的细节,不调用构造函数。 属于—— 创建型。 因为 new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等),原型模式性能比直接new一个对象性能高(在内存中进行二进制流拷贝)。 也就是说原型是为了创建多个相同类型对象的模板,很明显是多例。 在Java里面 singleton(单例) 有单例模式去实现。 而在 JavaScript 中 prototype 恰恰相反,它的作用是用来避免对象中的公共方法被的多次创建,也就是说是为了让对象中的公共方法变为单例而出现的。

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//工厂函数
		//构造函数此时只是做了初始化工作
		function createMan(name1,age1){  //构造函数
			//添加原料
			//当使用new实例化的时候,其实系统帮我们做了这步
			//var this=new Object()
			//对我们的原料进行加工
			//定义属性
			this.name=name1
			this.age=age1
			
			//出厂
			// return obj
		}
		//利用原型来添加共用的方法(行为)
		createMan.prototype.showName=function(){
			alert('我的名字'+this.name)
		}
		createMan.prototype.showAge=function(){
			alert('我的年龄'+this.age)
		}
		
		//使用new进行实例化构造函数
		//new帮我们做了两件事  1、创建原料var this=new Object()  2、return this
		var obj1=new createMan('Tim',29)
		var obj2=new createMan('xiaod',32)
		// obj1.showAge()
		// obj2.showAge()
		alert(obj1.showAge==obj2.showAge) //true
		
	</script>
</body>
</html>

BOM

什么是BOM
 BOM(Browser Object Model)即浏览器对象模型,是一个与浏览器窗口进行交互的对象。

打开或关闭一个窗口

window.open()
window.close()
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<button onClick="window.open('12.1.close.html')">打开新页面</button>
	<!-- <button onClick="openNewPage()">打开新页面</button> -->
	<script type="text/javascript">

		function openNewPage(){
			var openPage=window.open()
			openPage.document.write('你好,我是新打开的页面')
		}

	</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<button onClick="window.close()">关闭页面</button>
</body>
</html>

BOM常用属性和系统对话框

# 获取设备及浏览器的类型型号
	windows.navigator.userAgent	

# 获取当前文档地址对象
windows.location
	location.host		主机加端口号
	location.hostname	主机
	location.port		端口号
	location.protocol	协议
	location.pathname	路径
	location.hash		片段标识符,可以用于保存网页状态
	location.search	返回问号后的字段
	location.href		可以用location.href='url'去打开页面

# 系统对话框
	警告框:alert("内容")
	选择框:confirm("提问的内容")
	输入框:prompt()
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<button onClick="window.location.href='http://www.baidu.com'">跳转到官网</button>
	<script type="text/javascript">
		window.onload=function(){
			 //获取设备及浏览器的类型型号
			 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
			 //获取当前文档地址对象
			 console.log(window.location)	//Location

		}
	</script>
</body>
</html>

BOM常用事件

window.onload

windows.onscroll	滚动距离
	谷歌浏览器		document.body.scrollTop
	IE、火狐浏览器		document.documentElement.scrollTop

windows.onresize	可视区尺寸
	document.documentElement.clientWidth
	document.documentElement.clientHeight
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<div style="height:2000px;background:red;"></div>

	<script type="text/javascript">

		window.onload=function(){
			//滚动事件
			window.onscroll=function(){
				//兼容ie 获取滚动距离
				if(document.body.scrollTop){
					console.log(document.body.scrollTop)
				}else{
					console.log(document.documentElement.scrollTop)
				}
			}

			//监听可是窗口变化事件 
			window.onresize=function(){
				console.log(document.documentElement.clientHeight)
			}
		}

	</script>
</body>
</html>

作者:Soulboy