半个月学习HTML CSS JS基础知识总结下(内涵JS)

从基本的编程知识,到用HTML,CSS配合JS实现动态页面

基础知识

  1. 基本操作引入
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			// 弹出一个警告框
			alert('出入平安!!')
			// 在计算机页面输出东西
			document.write('我在页面中显示')
			// 在控制台显示
			console.log('猜猜我在哪啊')
		// 也可以使用:<script src="" type="text/javascript" charset="utf-8">
		<!-- 这样引入外面的Javascript 引入之后 不能在编写代码了 写了计算机也是忽略 -->
		</script>
		
	</head>
	<body>
		<!-- 写在属性中不方便维护 不推荐使用 -->
		<!-- 将js写在onclick中 -->
		<button onclick="alert('讨厌点我干啥')">点我一下</button>
		<!-- 将js写在超链接的href中 点击超链接时会执行js代码 -->
		<a href="javascript:alert('让你点你就点!!');">你也点我一下呗</a>
		<a href="javascript:;"></a>
	</body>
  1. 基本知识
		<script type="text/javascript">
			// 字面量(不可改变):像 1,2,3等
			// 变量(用来保存字面量) 以后常用
			// 不能数字开头 可以含有字母,数字,_,$
			// 标识符--utf-8中的东西都可以当作标识符(例如中文)
			var a=123;
			// 不可以输出var
			console.log(a);
		</script>
  1. 数据类型
			/**
			 * 基本数据类型:
			 * 			String,Number,Boolean,Null,Undefined
			 * 引用数据类型:
			 * 			Object
			 * 
			 * 可以利用 \ 来进行转义
			 * 	\n(表示换行) \t(制表符) \"(表示 ") \'(表示 ')
			 * \\\\		表示两个反斜杠
			 */
  1. number
<script type="text/javascript">
			/**
			 * 最大值:Number.MAX_VALUE
			 * 如果使用计算超过最大数字之后就会返回一个 number类型的
			 * 		Infinity 表示正无穷
			 * 		-Infinity 表示负无穷
			 * NaN是一个特殊的数字 表示Not A Number
			 * 例如a='abc'*'abc'
			 */
			var a=Number.MAX_VALUE;
			a=Number.MIN_VALUE;
			var b=0.3+0.3;
			// js进行浮点数进行计算 可能得到一个不准确的数字
			console.log(b);
			console.log(a);
			var c=null; //类型时object类型的
			var d=undefined  //类型还是undefined类型的
			console.log(typeof d)
			console.log(typeof c)
		</script>
  1. string,number boolean的类型转化
<script type="text/javascript">
			/**
			 * String 
			 * 		调用toString() 方法
			 * 			除了null和undefined没有上面的方法
			 */
			// var a=undefined
			// a=a.toString();
			// console.log(typeof a)
			// console.log(a)
			/**
			 * Number 
			 * 		调用函数Number()来进行转化
			 * 			string-number
			 * 			如果是数字字符串,直接转化为数字
			 * 			如果有字母,返回undefined
			 * 			Boolean-number
			 * 			true----1 false----0
			 * 			null---0
			 * 			undefined---undefined
			 * 
			 * 		可以用parseInt()/parseFloat() 来对字符串进行转换
			 * 			不可以用来转化纯字母 从第一个开始
			 * 
			 * 	js中如果需要表示16进制需要以 0X开头
			 * 					8进制-----0开头
			 * 					2进制-----0b开头
			 * 
			 * 		指定的数字转化用parseInt(a,10)----指定的数字转化
			 */			
			// var a = undefined
			// a=Number(a)
			// console.log(a)
			// var b='123p'
			// b='t123'
			// b=parseInt(b)
			// console.log(b)
			/**
			 * Boolean()  
			 * 			数字--除了0/NaN其余都是true
			 * 			字符串---除了空串 都是true
			 * 			null和undefined 都是false
			 * 			对象会变成true
			 */
			
			var a=undefined
			a=Boolean(a)
			b=''
			b=Boolean(b)
			console.log(b)
			console.log(a)
		</script>
  1. 运算符
<script type="text/javascript">
			/**
			 * 运算符:typedof  
			 * 	算数运算符---非数字计算会先转化为Number
			 * 		+:1数字直接计算 2两个字符串进行 拼串 3任何值和字符串都先会转化为字符串
			 * 			利用3相当于toString() 转化为字符串的操作---直接+''----就可以
			 * 		- * /  和数字进行计算 都会自动转化为 Number 然后进行计算
			 * 
			 * 一元运算符:
			 * 			+ 对于非Number  前面加一个+ 相当于 Number()
			 * 
			 * 自增和自减:
			 * 			a++和++a都是原变量增加1  
			 * 			a++ = 自增前的值/  ++a = 自增后的值
			 * 
			 * 			自减也是同理
			 * n1=10    n=n1++		n=10/n1=11
			 * 			n=++n1		n=12/n1=12
			 * n2=20	n=n2--		n=20/n2=19
			 * 			n=--n2		n=18/n2=18
			 * 
			 * 逻辑运算符 ! && ||
			 * 			!----非布尔值转化为布尔值 进行转化
			 * 				任意类型取两次反 作用相当于Boolean()
			 * 
			 * 			&&---第一个为false  则不会看第二个值
			 * 				第一个值为true 返回第二个值------看看第二个
			 * 				第一个值为false 直接返回第一个值--第一个就不行-就不行
			 * 
			 * 			||---第一个为true	则不会看第二个值
			 * 				第一个值为true  返回第一个------直接放行
			 * 				第一个值为false 返回第二个-----再看看第二个
			 * 赋值运算符
			 * 			+=  -=  *=  /=  %=
			 * 
			 * 关系运算符--字符串比较的是---字符编码
			 * 			> < <= >= = == 
			 * 		==运算符  undefined==null 正确   前者衍生自后者
			 * 				NaN 和谁都不相等包括它本身  用isNaN() 判断是否NaN
			 * 		!=
			 * 
			 * 		===不会自动给你转化
			 * 		!==
			 * 
			 * 使用转义字符输出Unicode编码
			 * 		\u四位编码
			 * 		\#编码---编码需要的是10进制
			 * 
			 * 三目运算符:条件表达式?语句一:语句二
			 *用来判断最大值 var max=a>b?(a>c?a:c):(b>c?b:c)
			 * 
			 * 优先级  对象里面的 第一是 . [] new 第二是 ()
			 * 
			 * 代码块 用来分组  没有其他作用 
			 * 
			 */
			
			var a=1+'';
			console.log(typeof a)
			
			var b=1+ +'2'+3
			console.log(b)
			
		</script>
  1. for循环+ 1-100以内的质数+ 九九乘法表
<script type="text/javascript">
			/**
			 * for(初始化表达式;条件表达式;更新表达式){
				 * 语句
				 * }
			 */
			//输出1-100以内的质数和
			var sum=0,i,j;
			for(i=2;i<100;i++){
				// 你要是在外面改变一次就不改变了
				var flag=true;
				for(j=2;j<=Math.sqrt(i);j++){
					if(i%j==0){
						flag=false;
						break;
					}
				} 
				if(flag){
					console.log(i);
					sum+=i;
				}
			}
			console.log(sum);
			// 九九乘法表
			for(i=1;i<=9;i++){
				for(j=1;j<=i;j++){
					document.write(j+'*'+i+'='+i*j+'\t')
				}document.write('<br />')
			}
		</script>
  1. switch
<script type="text/javascript">
			var score=+prompt('请输入成绩');
			// switch(score/10){
			// 	case 10:
			// 	case 9:
			// 	case 8:
			// 	case 7:
			// 	case 6:
			// 		console.log('合格')
			// 		break
			// 	default:
			// 		console.log('不合格')
			// } 
			switch(score>=60){
				case true:
					console.log('及格');
					break;
				default:
					console.log('不及格');
					break;
			}
		</script>
  1. if语句练习
<script type="text/javascript">
			// prompt() 函数中的返回值是 String 类型的
			var num1=+prompt('请输入第一个数字')
			var num2=+prompt('请输入第二个数字')
			var num3=+prompt('请输入第三个数字')
			if(num1<num2 && num1<num3){
				// num1最小
				if(num2<num3){
					alert(num1+","+num2+","+num3)
				}else{
					alert(num1+","+num3+","+num2)
				}
			}
			if(num2<num1 && num2<num3){
				// num2最小
				if(num1<num3){
					alert(num2+","+num1+","+num3)
				}else{
					alert(num2+","+num3+","+num1)
				}
			}
			if(num3<num2 && num3<num1){
				// num1最小
				if(num2<num1){
					alert(num3+","+num2+","+num1)
				}else{
					alert(num3+","+num1+","+num2)
				}
			}
				
		</script>
  1. 面向对象创建对象
<script type="text/javascript">
			/**
			 * // 使用new创建出来的是构造函数 constructor
			var obj=new Object();
			obj.name='盖世凯';
			obj.age='21'
			obj.sex='male'
			// 替换原来的属性
			obj.name='李哲'
			// 删除属性
			delete obj.name;
			// 特殊的属性名字用 特殊的方法来整
			obj['你好']='盖世凯a'
			n='你好'
			console.log(obj[n]);
			// 属性也可以是一个对象
			var obj2=new Object();
			obj.test=obj2;
			console.log(obj.test);
			// 测试obj中是否有此属性
			console.log('test' in obj);
			 */
			
			// 对象是一个地址  
			// 这种方式创建对象  {里面都是键值对(python中的字典)}
			// var obj3={
			// 	name:'张三',
			// 	age:12,
			// 	sex:'male'
			// };
			// console.log(obj3.name);
		</script>
  1. 函数的参数
<script type="text/javascript">
			function sum(a,b){
				console.log(a+b);
				return a;
				/**
				 * return 后面的语句不会被执行
				 */
				alert('hello')
			}
			/**
			 *调用函数的参数时 不会检查函数的参数类型
			 * 多余的形参将是undefined
			 */
			 // var result =alert('hello')
			 // console.log(result)//没有被定义
			var a =sum(12,13,true,false)
			console.log(a)
			
			/**
			 * 创建一个函数 可以在控制台输出信息
			 */
			var obj={
				name:'盖世凯',
				age:21,
				male:'男'
			};
			function sayHello(o){
				console.log(o.name+o.age+o.male)
			}
			sayHello(obj)
			
			/**
			 * 传递函数
			 */
			function fun(a){
				console.log('a='+a)
				a(obj)
			}
			// fun(sayHello)
			/**
			 * 传递一个对象
			 */
			// main() 调用函数  main 调用对象
			
			fun(function(){alert('hello')})
		</script>
  1. return
<script type="text/javascript">
			function fun1(){
				function fun2(){
					alert('我是fun4中的函数')
				}
				return fun2;
			}
			a=fun1();
			// console.log(a);
			// a();
			fun1()();//原理同上一行
		</script>
  1. 立即执行函数
<script type="text/javascript">
			/**
			 * 只会执行一次
			 */
			(function(a,b){
				alert(a+b);
				alert('我是一个匿名函数');
			})(12,13)
			
		</script>
  1. 对象中的属性是函数
<script type="text/javascript">
			var obj=new Object();
			obj.name='盖世凯';
			obj.age=21;
			obj.sayName=function(){
				console.log(obj.name)
			};
			// console.log(obj.sayName);
			//调方法---函数作为对象的属性--我们叫方法
			obj.sayName()
			
			function fun(){
				console.log('我是函数')
			}
			// 调函数---只是名称不一样
			fun()
		</script>
  1. 枚举对象
<script type="text/javascript">
			var obj={
				name:'盖世凯',
				age:21,
				gender:'男'
			};
			for(x in obj){
				console.log(x);
				console.log(obj[x])
			}
		</script>
  1. 作用域
<script type="text/javascript">
			function fun(){
				console.log('我是fun函数')
			}
			
			/**
			 * 全局作用域
			 * 		在外面时window的--都是window.
			 */
			window.fun();
			
			/**
			 * 关于var声明
			 * 是在最开头声明的 但不会被赋值 不适用不会被提前
			 */
			var a;
			console.log(a);//结果时undefined
			a=123;
			
			/**
			 * 关于function xx()函数
			 * 在所有代码执行之前就被创建
			 * fun2()不会被执行---fun2 is not a function
			 */
			fun1();
			// fun2();
			function fun1(){
				console.log('我是function声明的函数')
			};
			var fun2=function(){
				console.log('我是var声明的函数')
			};
			
			/**
			 * 作用域---var也是提前声明---function也是
			 * 		就近使用 没有往上面找
			 * 			如果非要用 就用window.的方式来使用
			 */
			var b=10;
			function fun3(){
				console.log(window.b);
				console.log(b);
				b=12;
				d=100;//--相当于window.d=100
			}
			fun3();
			console.log(b);//输出的时12 别修改后的数字
			console.log(d)
			 
			/**
			 * 定义了形参就相当于在里面声明了
			 */
			var e=23;
			function fun4(e){
				alert(e);//这里输出的是undefined
			}
			fun4();
			
			// 接下来就是调试bug的课程
		</script>
  1. this关键字谁调用就用谁的对象里面的this
<script type="text/javascript">
			/**
			 * 以函数的形式调用的时候  this永远指向的是window
			 * 以方法的形式调用的时候  this指的是调用方法的对象
			 */
			var name='刘毅'
			function fun(a,b){
				console.log(this.name);//打印不出来this
			}
			// fun(1,2);
			var obj1={
				name:'盖世凯1',
				age:21,
				sayName:fun
			}
			var obj2={
				name:'盖世凯2',
				age:21,
				sayName:fun
			}
			// console.log(obj.sayName==fun)//true
			obj1.sayName();
			obj2.sayName();
			fun();
		</script>
  1. 批量生产对象
<script type="text/javascript">
			/**
			 * 批量生产对象
			 */
			function createPerson(name,age){
				var obj=new Object();
				obj.name=name;
				obj.age=age;
				obj.sayName=function(){
					alert(this.name);
				}
				return obj;
			}
			var a=createPerson('盖世凯',21);
			var b=createPerson('刘毅',21);
			a.sayName()
			b.sayName()
		</script>
  1. 构造函数
<script type="text/javascript">
			/**
			 * 构造函数 也是函数 除了函数名首字母大写 么有区别
			 * 
			 * 不同的是 普通函数直接使用 构造函数需要用new关键字来调用
			 */
			
			/**
			 * 构造函数执行流程
			 * 	1 立即创建一个对象
			 * 	2 将对象设置为函数中的this,在构造函数中可以使用this来引用新建的对象
			 * 	3 逐行执行函数中的代码
			 * 	4 将新建的对象作为返回值返回
			 * 
			 * java理解
			 * 		new(new一个对象)的过程就是 创建你造出来的对象
			 */
			function Person(name,age){
				// this.name='盖世凯'//这样就写死了 所以看下面
				this.name=name;
				this.age=age;
				this.sayName=function(){
					alert(this.name);
				}
				// 像对象中添加一个方法
				this.sayAge=fun;
			}
			// sayAge方法在全局作用域中定义
			function fun(){
				alert(this.age);
			}
			/**
			 * 判断一个对象 是否是一个类的实例
			 * 		对象 instanceof 构造函数
			 * 		是返回true 不是-false
			 */
			
			
			// 向原型中添加sayName方法  之后的拓展
			Person.prototype.sayName=function(){
				alert(this.name+'我是原型中的')
			}
			
			
			var per=new Person('盖世凯',21);
			console.log(per instanceof Person)
			// console.log(per.name)
			per.sayName()
			per.sayAge()
		</script>
  1. 原型
<script type="text/javascript">
			/**
			 * 原型 prototype
			 * 创建每一个函数 解析器都会想函数中添加一个属性prototype
			 */
			function MyClass(){
				
			}
			// 向原型中添加属性
			MyClass.prototype.a=123
			var mc1=new MyClass();
			var mc2=new MyClass();
			// console.log(MyClass.prototype);
			// console.log(mc1.__proto__==mc2.__proto__)//true
			mc1.a='我是更改后的a'
			console.log(mc1.a)
		</script>
		
		<script type="text/javascript">
			
			function MyClass(){
				
			}
			MyClass.prototype.name='我是原型中的名字';
			var mc=new MyClass();
			mc.age=21;
			// console.log(mc.name)
			// 使用in来检查对象中是否含有某个属性 没有去原型中寻找
			console.log('name' in MyClass)
			
			// 使用hasOwnProperty()检查对象自身中是否含有该属性
			console.log(mc.hasOwnProperty('age'))
			
			// 自身有用自身 没有去原型中找 在没有去原型的原型中寻找
			console.log(mc.__proto__.__proto__.hasOwnProperty('hasOwnProperty'));
			console.log(mc.__proto__.__proto__.__proto__);
			
		</script>
  1. toString
<script type="text/javascript">
			function Person(name,age){
				this.name=name;
				this.age=age;
			}
			var per =new Person('盖世凯',21);
			
			// //重写toString方法
			// per.toString=function(){
			// 	return '我是重写的toString方法'
			// }
			
			//重写Person原型的toString方法
			Person.prototype.toString=function(){
				return '我是Person原型中的toString方法'
			}
			
			// console.log(per.__proto__.__proto__.hasOwnProperty('toString'));
			var resule=per.toString();
			console.log(resule);
			
			// 垃圾回收机制 没用的就扔了
			Person=null;
			console.log(Person.toString());
			
		</script>
  1. 数组
<script type="text/javascript">
			/**
			 * 数组的两种创建方法
			 * var arr=new Array();
			 * var arr=[];
			 */
			var arr=new Array(10);//这里的10是数组的总长
			arr[0]=1;
			arr[arr.length]=1
			console.log(arr.length);
			
			arr1=[1,2,true,'hello',null,undefined,{name:'盖世凯'},function(){alert(1)}]
			arr2=[10]//这里的10是数组中的元素
			console.log(arr1);//in 浏览器中显示
			console.log(arr1[6].name);  //数组中放对象
			console.log(arr1[7]());		//数组中放方法
			console.log(arr2.length)
		</script>
  1. 数组中的方法:push 和pop在末尾操作+unshift和shift再开头操作+数组的遍历
<script type="text/javascript">
			var arr=['盖世凯1','盖世凯2','盖世凯3','盖世凯4']
			/**
			 * push()方法
			 * 		末尾添加1/多 个元素并返回数组的 新长度
			 */
			arr.push('李哲','毅哥')
			console.log(arr)
			/**
			 * pop()方法
			 * 		删除最后一个元素  并返回结果
			 */
			a=arr.pop();
			console.log(a);
			/**
			 * unshift()方法
			 * 		数组开头添加 1/多 元素
			 */
			arr.unshift('牛魔王','孙悟空');
			console.log(arr);
			/**
			 * shift()方法
			 * 		删除第一个 并返回
			 */
			arr.shift();
			console.log(arr)
			
			// 数组的遍历
			for(var i=0;i<arr.length;i++){
				console.log(arr[i]);
			}
			
			
		</script>
  1. 数组的练习+forEach方法
<script type="text/javascript">
			// 把大于18岁的人放到一个数组中
			function Person(name,age){
				this.name=name;
				this.age=age;
			}
			var p1=new Person('盖世凯',21);
			var p2=new Person('毅哥',12);
			var p3=new Person('翀哥',34);
			var p4=new Person('松岳',11);
			var arr=[p1,p2,p3,p4];
			var newArray=[]
			for(var i=0;i<arr.length;i++){
				if(arr[i].age>18){
					newArray.push(arr[i])
				}
			}
			/**
			 * forEach() 方法需要一个 函数 作为参数
			 * 		不用我们调用
			 * 		第一个参数返回数组中的值
			 * 		第二个参数表示索引值
			 * 		第三个参数是打印全部
			 */
			newArray.forEach(function(value,index,object){
				console.log(value)
				console.log(index)
				console.log(object)
			})
		</script>
  1. 数组中的splice的切片操作
<script type="text/javascript">
			var arr1=['G','S','K','Y','G'];
			/**
			 * slice(开始截取的位置,结束的位置)方法
			 * 	不会改变原来的数组
			 */
			// var result=arr1.slice(0,-1);//包头不包尾(尾是负数的话就都包括了)
			// console.log(result)
			
			/**
			 * splice(表示开始删除的位置,删除的数量,后面可以添加一些元素)方法
			 * 	删除数组中指定的元素 会影响到原来的数组 有返回值
			 * 第二个参数为0时就是不删除
			 */
			var result=arr1.splice(0,3,'牛魔王','孙悟空');
			console.log(result);
			console.log(arr1);
		</script>
  1. 去除数组中多余的数------sqlice练习
<script type="text/javascript">
			var arr=[1,2,1,3,2,2,4,3,5,4,6]
			for(var i=0;i<arr.length;i++){
				for(var j=i+1;j<arr.length;j++){
					if(arr[i]==arr[j]){
						arr.splice(j,1);
						// j++和j-- 表示没变
						j--;
					}
				}
			}
			for(var x=0;x<arr.length;x++){
				console.log(arr[x])
			}
		</script>
  1. 数组中其他的方法join+concat+sort+reverse
<script type="text/javascript">
			var arr1=[12,3,4,5]
			var arr2=[1,2,3,4,5]
			var arr3=[1,2,3,4,5]
			/**
			 * concat() 进行拼接 返回新数组 不对原数组产生影响
			 */
			var result=arr1.concat(arr2,arr3,'盖世凯');
			console.log(result)
			
			/**
			 * join(@_@)  数组转换成字符串,返回新数组,不对原数组产生影响
			 */
			result =arr1.join('@_@');
			console.log(result);
			
			/**
			 * reverse() 数组都倒过来  修改原数组
			 */
			arr1.reverse()
			console.log(arr1)
			
			/**
			 * sort() 进行排序  按照unicode排序
			 * ()里面是一个>0的数  交换位置
			 * 			  <=0的数  位置不变
			 */
			arr1.sort(function(a,b){
				//升序排列
				return a-b;
				//降序排列
				return b-a;  
			})
		</script>
  1. arguments的隐藏功能
<script type="text/javascript">
			/**
			 * 函数中的两个隐含参数   this & arguments(是一个类数组对象)
			 * arguments.length=实参的长度
			 * arguments[0]----第一个实参
			 * arguments.callee指向当前函数的对象
			 */
			function fun(a,b){
				// 下面两行都是false
				// console.log(arguments instanceof Array);
				// console.log(Array.isArray(arguments));
				console.log(arguments.length);
				console.log(arguments.callee==fun);
			}
			fun('hello',true)
		</script>
  1. 函数中方法:call()+apply()
<script type="text/javascript">
			function fun(){
				alert(this.name)
			}
			/**
			 * call() apply()
			 * 需要通过函数来调用
			 * 使用过程中this.传进来的对象
			 * call() 可以将实参对象之后依次传递fun.call(obj,2,3)
			 * apply() 不同于上面 fun.apply(obj,[2,3])
			 */
			var obj={name:'盖世凯'};
			fun.call()
			fun.apply(obj)
		</script>
  1. Date对象
<script type="text/javascript">
			// Date 表示对象
			/**
			 * getDate()   几日
			 * getDay()		周几0-周日
			 * gatMonth() 	月份0-一月
			 * getFullYear()	当前日期对应的年份
			 * getTime()	当前时间(毫秒呈现出来)
			 * Date.now()	当前的时间(多用于测试)
			 */
			var d=new Date();
			var a=new Date('01/14/2021 04:44:20');//月 日 年 时 分 秒
			console.log(d);
			console.log(a);
		</script>
  1. Math函数
<script type="text/javascript">
			// Math 不是对象是一个函数 通过Math.的方式
			/**
			 * abs()	一个数的绝对值
			 * ceil()	向上取整
			 * floor()	向下取整
			 * round()	四舍五入
			 * Math.random()	0-1之间的随机数
			 * 					x-y之间的随机数	Math.round(Math.random()*(y-x)+x)
			 * pow(x,y)	x的y次幂
			 * sqrt(x)	对x进行开方
			 */
		</script>
  1. 包装类(了解)
<script type="text/javascript">
			/**
			 *String() 将基本数据类型转化为String对象
			 * Number() 将基本数据类型转化为Number对象
			 * Boolean() 将基本数据类型转化为Boolean对象
			 */
			var num=new Number(3)
			var str=new String('hello')
			var bool=new Boolean(true)
			
			var s=123;
			s=s.toString();
			// 都帮我们自动转化了
			s.hello='你好';
			console.log(s.hello)
		</script>
  1. 字符串的相关操作
<script type="text/javascript">
			str='gaishikaiduopeifumu';
			/**
			 * charAt() 可以返回字符串中指定位置的字符   根据索引过去指定的字符
			 * charCodeAt() 获取指定位置字符的编码(unicode编码)
			 * formCharCode() 根据字符编码获取字符
			 * concat() 拼接字符 作用和 + 一样
			 * indexof('a',7)	检索是否含有指定内容(通常返回第一个)--可以指定位置
			 * 					没有返回-1
			 * lastIndexOf('h',1) 从后往前找		功能和上面一样
			 * substring(1,2)	和slice()类似
			 * 					传递的是负值 默认使用0  第二个参数小于第一个(自动换位置)
			 * substr(0.2)		截取字符串  开始的索引位置 截取长度
			 * split('@')	拆分成数组  会根据传进去的东西去拆分数组
			 * toUpperCase()   将字符串转化为大写并返回
			 * toLowerCase()   将字符串转化为xiao写并返回
			 */
			
		</script>
  1. 正则表达式
<script type="text/javascript">
			/**
			 * var 变量 = new RegExp('正则表达式','匹配模式')
			 * 正则表达式是一个对象
			 * 下面是一个测试是否含有a
			 * 		第二个参数可以是	i 忽略大小写
			 * 						g 全局匹配模式
			 */
			var reg=new RegExp('a','i')
			var str='a';
			var result=reg.test(str);
			console.log(result)
			
			/**
			 * 也可以使用字面量来创建正则表达式
			 * var 变量=/正则表达式/匹配模式
			 * reg=/a|b/;  | 表示或的意思
			 * reg=/[ab]/  [] 里面的内容也是或的关系
			 * reg=/[a-z]/  任意小写
			 * reg=/[A-Z]/  任意大写
			 * reg=/[A-z]/  任意字母
			 * [^ abc] 除了abc
			 * search()  搜索是否含有指定内容  传一个正则就会根据 正则来检索(添加全局变量也没用)
			 * match()   传进去一个正则表达式  符合条件的内容 提取出来  装到一个数组中返回
			 * replace() 参数: 1 被替换的内容 2 新的内容 默认只提取第一个
			 * split(/[A-z]/)   任意字母拆分字符串   
			 * 
			 * 量词  只对前面的第一个内容起作用(内容出现的次数)--可以加括号整的-多一点 
			 * 		{n} 正好出现n次
			 * 		{m,n} 出现m-n次
			 * 		{m,}  m次以上
			 * 		+  至少一个,相当于{1,}
			 * 		*   0个或者多个  相当于{0,}
			 * /^a/ 以a开头
			 * /a$/ 以a结尾
			 * 
			 * 检查是否含有.
			 * .表示任意字符  用\.  来表示.
			 * 				用\\   来表示\
			 * 
			 * \w  任意字母,数字,_  [A-z0-9]
			 * \W	上面相反
			 * \d	任意数字 [0-9]
			 * \D	上面相反
			 * \s	空格
			 * \S	上面相反
			 * \b	
			 * \B
			 * 
			 * 
			 */
			var reg=/A/;
			console.log(reg.test('abc'))
		</script>
  1. DOM
<script type="text/javascript">
			/**
			 * 也可以在上面设置
			 */
			window.onload=function(){
				// 这里面写你要执行的代码
				/**
				 * 文档字节 对象这个对象是window属性  文档字节代表整个网页
				 */
				// 获取button对象
				var btn=document.getElementById('btn');
				// 修改按钮文字
				btn.innerHTML='我是被修改的'
				// 绑定一个单击响应函数
				btn.onclick=function(){
					alert('你还点~~~~');
			}
			}
		</script>
  1. dom里面的东西
// 全局里定义
			function myClass(idStr,fun){
				// 传进来的是字符串就不需要再改了
				var btn=document.getElementById(idStr);
				btn.onclick=fun;
			}
			window.onload=function(){
				// 1	查找#bj结点
				myClass('btn01',function(){
					var bj=document.getElementById('bj')   //通过id来获取一个节点的对象
					var lis=document.getElementsByTagName('li');  //通过标签名来获取一个组的节点对象
					var names=document.getElementsByName('gender');   //通过name属性来获取一组对象元素.name  元素.value   元素.id class属性需要使用  元素.className
					


					alert(bj.innerHTML)
				});
				}
  1. dom中的其他方法
<script type="text/javascript">
			window.onload=function(){
				// 获取body标签
				// var body = document.getElementsByName('body');
				/**
				 * document中有一个body标签 它保存的是body的引用
				 */
				var body=document.body;
				console.log(body)
				/**
				 * document.documentElement保存的是html标签
				 */
				var html=document.documentElement;
				// console.log(html)
				/**
				 * document.all 代表页面中所有的元素
				 */
				var all=document.all;
				// console.log(all.length)
				
				// for(var i=0;i<all.length;i++){
				// 	console.log(all[i]);
				// }
				// 作用同上
				all=document.getElementsByTagName('*');
				console.log(all.length)
				/**
				 * 根据元素的class属性查询一组元素节点对象
				 * 不支持IE8及一下的浏览器
				 */
				var box=document.getElementsByClassName('box1');
				console.log(box.length)
				// 获取页面中所有的div
				// var divs=document.getElementsByTagName('div');
				// console.log(divs.length)
				
				 /**
				 * document.querySelector()
				 * 需要一个字符串作为参数 ,可以根据一个CSS选择器来查询一个元素的节点对象
				 */
				var div = document.querySelector('.box1 div');
				console.log(div.innerHTML)
				/**
				 * document.querySelectorAll 和上面的方法类似 会取出所有符合条件的元素
				 */
				var div = document.querySelectorAll('.box1 div');
				
			}
		</script>
  1. 添加节点,删除节点,插入节点+添加删除用户信息练习(在练习里面)
				// 创建一个'广州'节点添加到#city下
				myClick('btn01',function(){
					// 创建<li>广州<li>
					/**
					 * document.createElement()----用于创建元素对象
					 * 	标签名作为参数  会根据标签名创建元素节点对象  并返回
					 */
					var li = document.createElement('li');
					/**
					 * document.createTextNode()----用来创建文本节点
					 */
					var gzText=document.createTextNode('广州');
					/**
					 * 将gzText作为子节点传入li中   认儿子
					 */
					li.appendChild(gzText)
					/**
					 * 将li传入到city下
					 */
					var city=document.getElementById('city');
					city.appendChild(li);
				})
				/**
					 * inserBefore(新节点,旧节点)
					 * 	对子节点插入新的子节点
					 */
					 /**
					 * city.replaceChild  代替节点
					 */
					  * city.removeChild()---父亲杀
					 */
					// city.removeChild(bj);
					bj.parentNode.removeChild(bj);//自杀
  1. 简便的添加东西
var tr=document.createElement('tr');
					// 设置tr中的内容
					tr.innerHTML=
					'<td>'+name+'</td>'+
					'<td>'+email+'</td>'+
					'<td>'+salary+'</td>'+
					'<td><a href="javascript:;">Delete</a></td>'
					// 这里有问题
					var a=document.getElementsByTagName('a')[0];
					a.onclick=delA;
					// 将tr装到table中
					// 获取table
					var showInformation=document.getElementById('showInformation');
					showInformation.appendChild(tr);
  1. 使用dom操作css
<script type="text/javascript">
			window.onload=function(){
				// 点击按钮之后 修改box1的大小
				var box1=document.getElementById('box1');
				var btn01=document.getElementById('btn01');
				btn01.onclick=function(){
					/**
					 * 元素.style.样式名=样式值
					 * 在含有 - 的命名规范中 改用驼峰式写法
					 * background-color写成 backgroundColor
					 * 
					 * 如果使用了!important  js就无法修改
					 */
					box1.style.width='300px';
					box1.style.backgroundColor='yellow'
				}
			}
		</script>
  1. 读取元素的样式
<script type="text/javascript">
			window.onload=function(){
				var box1=document.getElementById('box1');
				var btn01=document.getElementById('btn01');
				btn01.onclick=function(){
					
					box1.style.width='300px';
					box1.style.backgroundColor='yellow'
					// 再里面的可以读出来
					// alert(box1.style.width); 
					/**
					 * 获取当前显示的样式  只能读不可以修改
					 * 元素.currentStyle.样式名
					 * tmd  除了IE都不支持
					 * 所以其他用 getComputedStyle(对象,null);
					 * 返回一个对象 
					 */
					// alert(box1.currentStyle.backgroundColor)
					
					// var obj=getComputedStyle(box1,null);
					// alert(obj.width)
					// alert(getComputedStyle(box1,null).width)
					getStyle(box1,'width')
				};
			};
			/**
			 * 想要两者兼容
			 * 参数 (obj(要获取元素),要获取元素的样式名)
			 */
			function getStyle(obj,name){
				if(window.getComputedStyle){
					alert(getComputedStyle(obj,null)[name])
				}else{
					alert(obj.currentStyle[name])
				}
				//一条语句方法
				// return window.getComputedStyle?getComputedStyle(obj,null)[name]:obj.currentStyle[name]
			}
		</script>
  1. 过去块的元素
<script type="text/javascript">
			window.onload=function(){
				var box1=document.getElementById('box1');
				var btn01=document.getElementById('btn01');
				var box4=document.getElementById('box4')
				btn01.onclick=function(){
					/**
					 * clientWidth
					 * clientHeight
					 * 可见高度和可见高度
					 * 属性都是不带px的 返回的是一个数字 可以直接进行计算
					 * 包括 内容区和内边距
					 * 不能修改
					 */
					// alert(box1.clientWidth)
					
					/**
					 * offsetWidth
					 * offsetHeight
					 * 宽度高度---包括内容区 内边距 边框
					 */
					// alert(box1.offsetWidth)
					
					/**
					 * offsetParent
					 *  获取当前定位父元素
					 * 	最近开启定位的祖先元素
					 *	最上面的定位是body
					 */
					// var op=box1.offsetParent;
					// alert(op.id)
					
					/**
					 * offsetLeft
					 * 相对于定位元素的水平偏移量
					 * offsetTop
					 * 相对于定位元素的垂直偏移量
					 */
					// alert(box1.offsetTop)
					
					/**
					 * box4.scrollHeight
					 * box4.scrollWidth
					 * 整个滚动区
					 * 
					 * box4.scrollLeft
					 * box4.scrollTop
					 * 水平滚动条 垂直滚动条 滚动的距离
					 */
					// alert(parseInt(box4.scrollTop))
					
					/**
					 * 判断滚动条是否已经到底了----这里有小数 计算结果不准确
					 * box4.scrollHeight-box4.scrollTop=box4.clienHeight---垂直
					 * 
					 * box4.scrollWidth-box4.scrollLeft==box4.clienWidth---水平
					 */
					alert(box4.scrollWidth-box4.scrollLeft==box4.clienWidth)

				};
			};
		</script>
  1. 事件对象
<script type="text/javascript">
			window.onload=function(){//一定记得添加这个
				var areaDiv=document.getElementById('areaDiv')
				var showMsg=document.getElementById('showMsg')
				// 字母要写正确
				areaDiv.onmousemove=function(event){
					// event是在页面操作的一些  鼠标 键盘等~~
					event=event||window.event;
					var x=event.clientX;
					var y=event.clientY;
					showMsg.innerHTML='x='+x+' y='+y;
				}
			
			}
		</script>
  1. 冒泡事件
<script type="text/javascript">
			window.onload=function(){
				/**
				 * 冒泡(Bubble)---好似向水里投石 逐渐往外扩散
				 */
				var s1=document.getElementById('s1')
				s1.onclick=function(event){
					event=event||window.event
					alert('我是span的单击响应函数')
					/**
					 * 取消冒泡
					 *  对象.cancelBubble设置为true 即可取消冒泡
					 */
					event.cancelBubble=true;
				}
				var box1=document.getElementById('box1')
				box1.onclick=function(){
					alert('我是div的单击响应函数')
				}
				document.body.onclick=function(){
					alert('我是body中的单击相应函数')
				}
			}
		</script>
  1. 事件的委派
<script type="text/javascript">
			window.onload=function(){
				var ul=document.getElementsByTagName('ul')[0];
				var btn=document.getElementById('btn');
				btn.onclick=function(){
					var li = document.createElement('li');
					li.innerHTML='<a href="javascript:;" class="link">我是添加的超链接</a>'
					ul.appendChild(li);
				}
				
				var allA=document.getElementsByTagName('a');
				// for(var i=0;i<allA.length;i++){
				// 	allA[i].οnclick=function(){
				// 		alert('hello');
				// 	}
				// }
				
				// 我们希望只绑定一次  添加之后也可以使用
				/**
				 * 事件的委派  给祖先绑定了 根据冒泡  总会传到祖先元素
				 */
				ul.onclick=function(event){
					// alert('我是ul的单击相应函数')
					/**
					 * event中的target表示的触发事件的对象  触发的是我们期望的元素 就会执行
					 */
					if(event.target.className=='link'){
						alert('我是ul的单击响应函数')
					}
					
				}
				
			}
		</script>
  1. 事件的绑定
<script type="text/javascript">
			window.onload=function(){
				var btn=document.getElementById('btn');
				// btn.οnclick=function(){
				// 	alert(1)
				// }
				// btn.οnclick=function(){
				// 	alert(2)
				// }
				
				/**
				 * addEventListener(事件的字符串‘不要on’,回调函数‘事件触发时函数调用’,false‘通常’)
				 * 	这个方法也可以为元素绑定响应函数
				 */
				// btn.addEventListener('click',function(){
				// 	alert(1)
				// },false)
				// btn.addEventListener('click',function(){
				// 	alert(2)
				// },false)
				// btn.addEventListener('click',function(){
				// 	alert(3)
				// },false)
				
				/**
				 * attachEvent(事件的字符串‘要on’,回调函数‘事件触发时函数调用’) 
				 * 在IE8中使用绑定事件
				 */
				// btn.attachEvent('onclick',function(){
				// 	alert(1)
				// })
				// btn.attachEvent('onclick',function(){
				// 	alert(2)
				// })
				// btn.attachEvent('onclick',function(){
				// 	alert(3)
				// })
				bind(btn,'click',function(){
					alert(this)
				})
			}
			/**
			 * 定义一个函数 同意要绑定的事件
			 * obj  要绑定的对象
			 * eventStr 事件的字符串
			 * callback  回调函数
			 */
			function bind(obj,eventStr,callback){
				if(obj.addEventListener){
					// 大部分浏览器兼容
					obj.addEventListener(eventStr,callback,false)
				}else{
					// IE8及一下浏览器 this是谁由调用方法决定的
					obj.attachEvent('on'+eventStr,function(){
						// 在匿名函数中回调函数
						callback.call(obj);
					})
				}
			}
		</script>
  1. 事件的传播
<script type="text/javascript">
			window.onload=function(){
				var box1=document.getElementById('box1')
				var box2=document.getElementById('box2')
				var box3=document.getElementById('box3')
				bind(box1,'click',function(){
					alert('我是box1的响应函数')
				})
				bind(box2,'click',function(){
					alert('我是box2的响应函数')
				})
				bind(box3,'click',function(){
					alert('我是box3的响应函数')
				})
				/**
				 * 捕获阶段
				 * 目标阶段
				 * 冒泡阶段
				 * 我们都不希望addEventListener在捕获阶段触发事件 所以第三个参数一般都是false
				 */
			}
			
			function bind(obj,eventStr,callback){
				if(obj.addEventListener){
					// 大部分浏览器兼容
					obj.addEventListener(eventStr,callback,false)
				}else{
					// IE8及一下浏览器 this是谁由调用方法决定的
					obj.attachEvent('on'+eventStr,function(){
						// 在匿名函数中回调函数
						callback.call(obj);
					})
				}
			}
		</script>
  1. 滚轮事件
<script type="text/javascript">
			window.onload=function(){
				var box1=document.getElementById('box1');
					/**
					 * onmousewheel 在火狐里面不支持它支持DOMMouseScroll
					 * 注意该事件用addEventListener来调用
					 */
				box1.onmousewheel=function(event){
					event=event||window.event;
					/**  if(除了0都是可以向下运行)
					 * 目标
					 * 滚轮向上移动的时候  box1边段
					 * 滚轮向下移动的时候  box1边长
					 * 我们使用whellDelta来进行判断滚轮的方向
					 * chrom 中向上150 向下-150
					 * 上面的方法火狐里面不支持 所以用event.detail 来获取滚轮的方向
					 * 向上-3  向下3
					 */
					
					if(event.wheelDelta>0||event.detail <0){
						box1.style.height=box1.clientHeight-10+'px'
					}else{
						box1.style.height=box1.clientHeight+10+'px'
					}
					/**
					 * 我们使用addEventListener绑定响应函数时 不可以用return false
					 * 所以使用event.preventDefault();取消默认行为
					 * 但是IE8不支持 用的话会报错  所以~~~~
					 */
					event.preventDefault||event.preventDefault();
					// 当我们浏览器也有滚动条时 滚条也会随之滚动 我们用false取消浏览器的默认行为
					return false
					
				};
				
				bind(box1,'DOMMouseScroll',box1.onmousewheel)
			}
			function bind(obj,eventStr,callback){
				if(obj.addEventListener){
					// 大部分浏览器兼容
					obj.addEventListener(eventStr,callback,false)
				}else{
					// IE8及一下浏览器 this是谁由调用方法决定的
					obj.attachEvent('on'+eventStr,function(){
						// 在匿名函数中回调函数
						callback.call(obj);
					})
				}
			}
		</script>
  1. 键盘事件
<script type="text/javascript">
			window.onload=function(){
				/**
				 * 键盘事件
				 * onkeyup 按下  不松手一直触发 刚开始慢 之后块
				 * onkeydown 松开
				 * 键盘事件一般使用对象为:具有焦点(文本框) document
				 */
				document.onkeydown=function(event){
					/**
					 * altKey
					 * ctrlKey
					 * shiftKey   
					 * 表示alt ctrl shift 是否被按下
					 */
					if(event.keyCode===89&&event.ctrlKey){
						console.log('ctrl和y被按下啦')
					}
				} 
				// document.οnkeyup=function(){
				// 	console.log('键盘松开了')
				// }
				
				// 获取input
				var input=document.getElementsByTagName('input')[0];
				input.onkeydown=function(event){
					event=event||window.event;
					if(event.keyCode>=48&&event.keyCode<=57){
						alert('hello')
						// 如果不想让输入某个数字就使用这个
						return false
					}
				}
			}
		</script>
  1. 键盘控制
<script type="text/javascript">
			window.onload=function(){
				
				var box1=document.getElementById('box1');
				var speed=10;
				document.onkeydown=function(event){
					event=event||window.event;
					if(event.ctrlKey){
						speed=500;
					}else{
						speed=10;
					}
					switch (event.keyCode){
						case 37:
							// alert('左')
							box1.style.left=box1.offsetLeft-speed+'px';
							break;
						case 39:
							// alert('右')
							box1.style.left=box1.offsetLeft+speed+'px';
							break;
						case 38:
							// alert('上')
							box1.style.top=box1.offsetTop-speed+'px';
							break;
						case 40:
							// alert('下')
							box1.style.top=box1.offsetTop+speed+'px';
							break;
					}
				}
			}
			
		</script>
  1. BOM浏览器对象模型
<script type="text/javascript">
			/**
			 * BOM   浏览器对象模型
			 * 	Window-
			 * 代表整个浏览器的窗口 同时window也是网页中的全局对象
			 * Navigator-
			 * 代表当前浏览器的信息,通过此可以识别不同的浏览器
			 * Location-
			 * 代表浏览器的地址栏信息,通过Location可以过低地址栏信息,过着操作浏览器跳转页面
			 * History-
			 * 代表浏览器的历史记录 可以通过对象来操作浏览器的 历史记录---只有当前记录
			 * Screen-
			 * 代表用户的屏幕信息,可以获得显示器的相关消息
			 */
			
			// 测试Navigator 
			var ua=navigator.userAgent;
			console.log(ua)
			// if(/firefox/i.test(ua)){
			// 	alert('你是火狐浏览器')
			// }else if (/chrom/i.test(ua)){
			// 	alert('你是chrome浏览器')
			// }else if (/msie/i.test(ua)){
			// 	alert('你是IE浏览器')
			// }
			
			/**
			 * 通过navigator.userAgent不可以判断IE了
			 * 使用ActiveXObject
			 */
			// if(window.ActiveXObject){
			// 	alert('你是IE,浏览器')
			// }else{
			// 	alert('你不是IE~~')
			// }
			// alert('ActiveXObject' in window)
		</script>
  1. history
<script type="text/javascript">
			/**
			 * History控制向前向后翻页
			 */
			window.onload=function(){
				/**
				 * length  属性用来获取访问链接数量
				 */
				// alert(history.length)
				/**
				 * back()  回到上一个页面
				 * forward()  跳转到下一个页面
				 * go()  参数是1时相当于forward
				 * 		参数是-1时相当于back()
				 */
				history.back();
				history.forward();
			}
		</script>
  1. location
<script type="text/javascript">
			
			window.onload=function(){
				var btn=document.getElementById('btn');
				btn.onclick=function(){
					// alert(location)
					// location='http://baidu.com';
					/**
					 * location.assign  作用和直接修改 location一样
					 * location.reload(true)  和按下刷新按钮一样(强制刷新)
					 * location.replace()  一个新的页面替换当前页面 没有历史记录 不可以返回
					 */
					location.assign('http://baidu.com')
					location.reload(true)
					location.replace('http://baidu.com')
				}
			}
		</script>
  1. 定时器调用
<script type="text/javascript">
			window.onload=function(){
				var count=document.getElementById('count');
				/**
				 * 利用setInterval(回调函数,间隔时间) 
				 * 返回值是一个Number类型的数据 这个数字作为定时器的唯一标识
				 */
				var num=1;
				var timer=setInterval(function(){
					count.innerHTML=num++;
					if(num==11){
						clearInterval(timer)//关闭定时器
					}
				},1000)
			}
		</script>
  1. 定时器练习(切换图片)
<script type="text/javascript">
			window.onload=function(){
				var photo=["img/01.png","img/02.png","img/03.png","img/04.png","img/05.png"];
				var Gs=document.getElementById('Gs');
				var index=0;
				var timer;
				// 用来开启定时器
				var btn01=document.getElementById('btn01');
				btn01.onclick=function(){
					/**
					 * 每次点击相当于开启一个定时器 点的多开的多 并且我们只能关闭一个定时器
					 * 所以在开启之前先关闭一个定时器
					 */
					clearInterval(timer);
					
					timer=setInterval(function(){
					index++;
					index %= photo.length;
					Gs.src=photo[index];
					},1000)
				}
				// 用来关闭定时器
				var btn02=document.getElementById('btn02');
				btn02.onclick=function(){
					clearInterval(timer);
				}
			}
		</script>
  1. 利用定时器取消延迟
<script type="text/javascript">
			window.onload=function(){
				var box1=document.getElementById('box1');
				var dir=0;
				var speed=10;
				document.onkeydown=function(event){
					event=event||window.event;
					if(event.ctrlKey){
						speed=500;
					}else{
						speed=10;
					}
					dir=event.keyCode;
				}
				setInterval(function(){
					switch (dir){
						case 37:
							// alert('左')
							box1.style.left=box1.offsetLeft-speed+'px';
							break;
						case 39:
							// alert('右')
							box1.style.left=box1.offsetLeft+speed+'px';
							break;
						case 38:
							// alert('上')
							box1.style.top=box1.offsetTop-speed+'px';
							break;
						case 40:
							// alert('下')
							box1.style.top=box1.offsetTop+speed+'px';
							break;
					}
				},30)
			}
		</script>
  1. 延时调用
<script type="text/javascript">
			window.onload=function(){
				var num=1;
				// setInterval(function(){
				// 	console.log(num++);
				// },1000)
				
				/**
				 * 延时调用 只执行一次
				 * 定时调用 一直执行
				 * 两者可以互相代替
				 */
				var timer=setTimeout(function(){
					console.log(num++);
				},1000) 
				clearTimeout(timer)
			}
		</script>
  1. 轮盘图
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			/* 可见边框 */ 
			#outer{
				width: 680px;
				height: 680px;
				margin: 10px auto;
				background-color: yellowgreen;
				padding: 10px 10px;
				position:relative;
				overflow: hidden;
			}
			/* ul 里面有图片(li) */
			#imgList{
				list-style: none;
				position: absolute;
				/* left: -1360px;	 */
			}
			/* li  中有每一个图片 */
			#imgList li{
				padding: 0 0 0 15px;
				float: left;
			}
			/* 地下的每个超链接 */
			#navDiv{
				position: absolute;
				top: 670px;
				/* 这个在js中设置left的值 让他居中 
					(总长度为680px-div块的长度55*5)/2
				*/
			   /* left: 202px; */
			}
			/* 每一个超链接 */
			#navDiv a{
				width: 25px;
				height: 25px;
				background-color: #FF0000;
				margin: 0 15px;
				opacity: 0.5;
				/* 兼顾IE浏览器 设置透明度*/
				filter: alpha(opacity=50);
				float: left;
			}
		</style>
		<!-- 引入移动工具 -->
		<script src="js/tools.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload=function(){
				// 获取最大的div
				var outer=document.getElementById('outer');
				//获得ul
				var imgList=document.getElementById('imgList');
				// 获得<li>
				var imgArr=document.getElementsByTagName('img');
				// 设置ul的宽度
				imgList.style.width=imgArr.length*690+'px';
				
				// 设置单行条居中
				var navDiv=document.getElementById('navDiv');
				navDiv.style.left=(outer.offsetWidth-navDiv.offsetWidth)/2+'px'
				// 设置默认选中效果---获取所有的a
				var index=0;
				var allA=document.getElementsByTagName('a');
				allA[index].style.backgroundColor='black'
				// 点击那个图片就跳转到那个图片里面
				for(var i=0;i<allA.length;i++){
					/**
					 *  在点击的时候for循环就已经执行完了
					 * 所以设置一个存放i的地方 添加一个属性
					 */
					allA[i].num=i;
					allA[i].onclick=function(){
						// alert(this.num) 
						// 点击图片的时候停止 轮盘图
						clearInterval(timer)
						index=this.num;
						// imgList.style.left=index*-680+'px';//用下面的函数代替
						move(imgList,index*-680,50,'left',function(){
							autoChange();
						})
						// 设置a的样式
						setA();
					}
				}
				// 自动切换图片
				autoChange();
				
				// 专门创建一个函数来设置a的样式
				function setA(){
					// 判断当前索引是不是最后一张图片
					if(index>=imgArr.length-1){
						index=0;
						// 此时显示的是最后一张图片 和第一张一摸一样 通过修改css 来进行改变
						imgList.style.left=0;
					}
					
					for(var i=0;i<allA.length;i++){
						allA[i].style.backgroundColor='';
					}
					allA[index].style.backgroundColor='black';
				}
				var timer;
				// 自动切换图片
				function autoChange(){
					// 开启一个定时器进行自动切换图片
					timer=setInterval(function(){
						// 让索引自增
						index++;
						index %=imgArr.length;
						move(imgList,index*-680,50,'left',function(){
							setA();
						})
					},2000)
				}
			}
		</script>
	</head>
	<body>
		<!-- 创建一个大容器 -->
		<div id="outer">
			<!-- ul放置图片 -->
			<ul id="imgList">
				<li><img src="img/01.png" ></li>
				<li><img src="img/02.png" ></li>
				<li><img src="img/03.png" ></li>
				<li><img src="img/04.png" ></li>
				<li><img src="img/05.png" ></li>
				<li><img src="img/01.png" ></li>
			</ul>
			
			<!-- 创建导航条 -->
			<div id="navDiv">
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
				<a href="javascript:;"></a>
			</div>
		</div>
	</body>
</html>
  1. 类的操作
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			.b1{
				width: 100px;
				height: 100px;
				background-color: yellow;
			}
			.b2{
				width: 200px;
				height: 200px;
				background-color: red;
			}
			
		</style>
		<script src="js/tools.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			window.onload=function(){
				var btn01=document.getElementById('btn01');
				var box=document.getElementById('box');
				btn01.onclick=function(){
					// 这样太慢
					// box.style.backgroundColor='black';
					// box.style.width='300px';
					// box.style.height='300px';
					/**
					 * 类的操作  对象.className=‘类名字’  进行修改
					 */
					toggleClass(box,'b2');
				}
			}
		</script>
	</head>
	<body>
		<button id="btn01">点我变形</button>
		<div id="box" class="b1 b2">
			
		</div>
	</body>
</html>

用到的连个工具

/**
			 *创建一个定时器,可以执行简单的动画函数
			 * obj 对象
			 * target:执行的目标
			 * speed 移动速度
			 * attr:要操作的样式
			 * callback  传进去一个回调函数
			 */
			function move(obj,target,speed,attr,callback){
				clearInterval(obj.timer)
				// 过去当前元素的目标位置
				var current=parseInt(getStyle(obj,attr));
				// 让传进来的都是正值
				if(current>target){
					speed=-speed
				}
				obj.timer=setInterval(function(){
				var oldValue=parseInt(getStyle(obj,attr));
				var newValue=oldValue+speed;
				if((speed<0&&newValue<target)||(speed>0&&newValue>target)){
					newValue=target;
				}
				obj.style[attr]=newValue+'px'
				if(newValue==target){
					clearInterval(obj.timer);
					// callback();
					// 你要是不传参数就别调用这个函数
					callback&&callback();
				}
			},30)
			}
			
			/**
			 * 想要两者兼容
			 * 参数 (obj(要获取元素),要获取元素的样式名)
			 */
			function getStyle(obj,name){
				if(window.getComputedStyle){
					return getComputedStyle(obj,null)[name]
				}else{
					return obj.currentStyle[name]
				}
				//一条语句方法
				// return window.getComputedStyle?getComputedStyle(obj,null)[name]:obj.currentStyle[name]
			}
			
			// 类的增加删除
			
			/**
			 * 创建一个函数进行添加 类 样式
			 */
			function addClass(obj,cn){
				if(!haveClass(obj,cn)){
					obj.className +=' '+cn;
				}
			}
			/**
			 * 判断是否有这个类
			 */
			function haveClass(obj,cn){
				var reg=new RegExp('\\b'+cn+'\\b');
				return reg.test(obj.className);
			}
			/**
			 * 删除一个类
			 */
			function removeClass(obj,cn){
				var reg=new RegExp('\\b'+cn+'\\b');
				obj.className=obj.className.replace(reg,'');
			}
			
			/**
			 * 综上  特别好的方法  有就删除 没有就添加
			 */
			function toggleClass(obj,cn){
				if(haveClass(obj,cn)){
					removeClass(obj,cn)
				}else{
					addClass(obj,cn);
				}
			}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值