webAPI

  1. API:应用程序编程接口
    Web API:浏览器提供的一套操作浏览器功能和页面元素的API
    DOM(文档对象模型):处理可扩展标记语言的标准编程接口
    2.获取元素
    (1)利用DOM提供的方法获取
<div id="a" class="b" ></div>

document.getElementById('a');  //根据id获取元素
document.getElementsByTagName('div');  //标签名  element.getElementsByTagName('div')
//以下H5新增,IE678不兼容 
document.getElementsByClassName('b');  //类名
document.querySelector('.a');  //根据指定选择器返回第一个元素对象
document.querySelectorAll('.a');  //根据指定选择器返回全部元素对象
//特殊元素
document.body; //获取body标签
document.documentElement; //获取html标签

(2)利用节点层级关系获取

element.parentNode  //父亲节点,找不到返回null  *****重要******
element.childNodes   //所有子节点,包括元素节点,文本节点等
element.children  //所有子元素节点   *****重要******
element.children[0]  //第一个子元素节点  element.children[element.children.length-1 ]  *****重要******
element.firstChild  //第一个子节点,包括元素节点,文本节点  lastChild
element.firstElementChild  //第一个子元素节点 IE9以上才支持  element.lastElementChild
element.nextSibling  //下一个兄弟节点,包括元素节点,文本节点等
element.previousSibling  //上一个兄弟节点,包括元素节点,文本节点等
element.nextElementSibling  //下一个兄弟元素节点 IE9以上才支持
element.previousElementSibling  //上一个兄弟元素节点 IE9以上才支持

获取下一个兄弟元素节点,兼容性函数

function getNextElementSibling(element) {
    var el = element;
    while(el = el.nextSibling) {
        if(el.nodeType === 1) {
            return el;
        }
    }
    return null;
}

3.事件三要素:事件源,事件类型,事件处理程序

var btn = document.querySelector('.b')
btn.onclick = function() {
	var date = new Date();
	var year = date.getFullYear();
	var month = date.getMonth() + 1;
	var dates = date.getDate();
	var week = date.getDay();
	var arr = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六']
	console.log(year + '年' + month + '月' + dates + '日' + arr[week])
}

4.改变标签内容
innerText:不识别标签,非标准,去除空格和换行
innerHTML:识别标签,W3C标准,保留空格和换行
表单内容通过 .value 修改,表单禁用.disabled=true

5.点击闭眼,眼睛睁开,密码框切换为文本框显示密码123;再点击睁眼,眼睛闭上,文本框切换为密码框显示●●●
算法:利用一个flag变量,判断flag的值,如果是1就切换为文本框,flag设置为0,如果是0就切换为密码框,flag设置为1。

var eye = document.querySelector('.b'); //眼睛图片
var pwd = document.querySelector('.a'); //文本框、密码框
eye.onclick = function() {
	var flag = 0;
	eye.onclick = function() {
		if(flag = 0) {
			pwd.type = 'text';
			eye.src = 'img/open.png';
			flag = 1;
		}else {
			pwd.type = 'password';
			eye.src = 'img/close.png';
			flag = 0;
		}
	}
}

6.样式属性操作
element.style 行内样式,驼峰命名
element.className 类名样式

this.style.backgroundColor = 'pink';
this.className = 'change'

7.获取焦点onfocus,失去焦点onblur
8.换肤案例,点击某个图片,body背景图片就换成这个。鼠标经过表格某行,某行变色同理思路。
利用循环绑定注册事件

<ul class="ulBox"> 
	<li><img src="a.png" ></li>
	<li><img src="b.png" ></li>
	<li><img src="c.png" ></li>
</ul>
<script type="text/javascript">
	var imgs = document.querySelector('.ulBox').querySelectorAll('img'); 
	for(var i = 0; i < imgs.length; i++) {
		imgs[i].onclick = function() {
			document.body.style.backgroundImage = 'url(' + this.src + ')'
		}
	}
</script>

9.全选反选

<table border="" cellspacing="" cellpadding="">
	<thead>
		<tr>
			<th><input type="checkbox" name="" id="thAll" value="" /></th>
			<th>Header1</th>
			<th>Header2</th>
		</tr>
	</thead>
	<tbody id="tbBox">
		<tr>
			<th><input type="checkbox" name="" id="" value="" /></th>
			<td>Data1</td>
			<td>Data2</td>
		</tr>
		<tr>
			<th><input type="checkbox" name="" id="" value="" /></th>
			<td>Data1</td>
			<td>Data2</td>
		</tr>
	</tbody>
</table>
<script type="text/javascript">
	var thAll = document.getElementById('thAll');
	var tbs = document.getElementById('tbBox').getElementsByTagName('input'); 
	//全选和全不选
	thAll.onclick = function() { 
		for(var i = 0; i < tbs.length; i++) {
			tbs[i].checked = this.checked;
		}
	}
	//反选 -变量
	for(var i = 0; i < tbs.length; i++) { 
		tbs[i].onclick = function() {
			var flag = true;
			for(var i = 0; i < tbs.length; i++) {
				if(!tbs[i].checked) {
					flag = false;
					break;
				}
			}
			thAll.checked = flag
		}
	}
</script>

10.获取 / 设置 / 移除属性值

//获取属性值
element.属性  //获得内置属性值
element.getAttribute('属性')  //获得内置属性值 还可以获得自定义属性值

<div data-index="0"></div>  //H5规定自定义属性data开头  以下两种获取:
element.dataset.index  //H5新增  或者 element.dataset['index']
<div data-list-name="aaa"></div>
element.dataset.listName  //或者 element.dataset['listName']  驼峰命名

//设置属性值
element.属性 = '值' //element.className= '值'
element.setAttribute('属性','值')  //特殊 element.setAttribute('class','值')
//移除属性值
element.removeAttribute('属性')

11.tab栏切换

.item {
	display: none;
}
.item:first-child {
	display: block;
}
.current {
	color: red;
}
<div class="tab">
	<div class="tab_list">
		<ul>
			<li class="current">分类一</li>
			<li>分类二</li>
			<li>分类三</li>
		</ul>
	</div>
	<div class="tab_con">
		<div class="item">内容一</div>
		<div class="item">内容二</div>
		<div class="item">内容三</div>
	</div>
</div>
<script type="text/javascript">
	var lis = document.querySelector('.tab_list').querySelectorAll('li');
	var items = document.querySelectorAll('.item');
	for(var i = 0; i < lis.length; i++) {
		lis[i].setAttribute('index',i)
		lis[i].onclick = function() {
			for(var i = 0; i < lis.length; i++) { //排他思想
				lis[i].className = ''
			}
			this.className = 'current';
			var index = this.getAttribute('index');
			for(var i = 0; i < items.length; i++) { //排他思想
				items[i].style.display = 'none';
			}
			items[index].style.display = 'block';
		}
	}
</script>

12.创建 / 添加 / 删除节点

<ul>
    <li>123</li>
</ul>
var li = document.createElement('li') //创建元素  三种看15
var ul = document.querySelecter('ul')
ul.appendChild(li) //后面追加元素
ul.insertBefore(li,ul.children[0]) //前面追加元素
ul.removeChild(ul.children[0]) //删除元素

13.克隆节点
如果括号里为空或者false,是浅拷贝,只克隆节点本身,不克隆里面子节点
如果括号里true,是深拷贝

node.cloneNode()

14.动态创建表格
在这里插入图片描述

<table border="" cellspacing="" cellpadding="">
	<thead>
		<tr>
			<th>姓名</th>
			<th>科目</th>
			<th>成绩</th>
			<th>操作</th>
		</tr>
	</thead>
	<tbody>
		
	</tbody>
</table>
<script type="text/javascript">
	var datas = [{
		name:'张三',
		subject:'js',
		score:'100'
	},{
		name:'李四',
		subject:'js',
		score:'90'
	},{
		name:'王五',
		subject:'js',
		score:'10'
	},]
	var tbody = document.querySelector('tbody');
	for(var i = 0; i < datas.length; i++) {
		var tr = document.createElement('tr');  //创建行
		tbody.appendChild(tr)
		for(var k in datas[i]) {  //创建列,遍历对象 (var k in obj)  k得到属性名,obj[k]得到属性值
			var td = document.createElement('td');
			td.innerHTML = datas[i][k]
			tr.appendChild(td)
		}  
		var td = document.createElement('td');
		td.innerHTML = '<a href="javascript;;">删除</a>'
		tr.appendChild(td)
	}
	//删除
	var as = document.querySelectorAll('a');
	for(var i = 0; i < as.length; i++) {
		as[i].onclick = function() {
			tbody.removeChild(this.parentNode.parentNode)
		}
	}
</script>

15.三种动态创建元素区别

document.write('<div>123</div>')  //几乎不用 文档流执行完,页面全部重绘
element.innerHTML('<div>123</div>')  //创建多个元素效率更高,不要拼接字符串,用数组形式拼接,结构复杂
document.creatElement('div') //创建多个元素效率低,结构清晰

innerHTML数组形式拼接

var arr = [];
for(var i = 0; i < 100; i++) {
	arr.push('<div>啦啦啦</div>')
} 
element.innerHTML = arr.join('') //数组转换成字符串,去掉,

16.总结DOM操作
(1)元素操作
创建:document.write,innerHTML,createElement
追加:appendChild,insertBefore
删:removeChild
修改:
在这里插入图片描述
查:
在这里插入图片描述
(2)属性操作
setAttribute:设置属性值
getAttribute:得到属性值
removeAttribute:移除属性
(3)事件操作
onclick 点击
onmouseover 鼠标经过
onmouseout 鼠标离开
onfocus 获得鼠标焦点
onblur 失去鼠标焦点
onmousemove 鼠标移动
onmouseup 鼠标弹起
onmousedown 鼠标按下
17.注册事件78

//传统注册方式  
//利用on开头的事件  同一元素同一事件只能设置一个函数,否则后面会覆盖前一个
<buttn onclick="alert('你好')"></button>
btn.onclick=function(){}


//方法监听注册方式  
//addEventListener()方法, IE9之前不支持, 用attachEvent()代替
// 同一元素同一事件可以注册多个监器   按注册顺序依次执行
eventTarget.addEventListener(type,listener[,useCapture])
//事件类型如click,事件处理函数,可选参数(默认false)
btn[0].addEventListener('click',function(){
    alert(1)
})

17.删除、解绑事件

btn.onclick=function(){
    alert(1);
    btn.onclick = null  //传统方式
}

btn.addEventListener('click',fn)
function fn(){
    alert(1);    
    btn.removeEventListener('click',fn)
}

btn.attachListener('onclick',fn)
function fn(){
    alert(1);    
    btn.detachListener('onclick',fn)
}

18.DOM事件流 – 页面中接受事件的顺序
在这里插入图片描述注意:
1、js代码中只能执行捕获或者冒泡其中一个阶段。
2、onclick和attachEvent只能得到冒泡阶段
3、eventTarget.addEventListener(type,listener[,useCapture])第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;如果是false,表示在事件冒泡阶段调用事件处理程序

以下事件没有冒泡:
onblur、onfocus、onmouseenter、onmouseleave

18.事件对象
div.onclick = function(event){}
事件对象包含的内容跟事件相关 ,比如鼠标点击事件包含鼠标的相关信息,鼠标坐标~
可以自定义event、e…
IE678用window.event,兼容写法:e = e || window.event

常见事件对象的属性和方法:
e.target :返回触发事件的对象(IE678用 e.srcElement)(this返回绑定事件的对象 )
e.currentTarget :跟this相似,IE678不认识
e.type:返回事件类型
e.preventDefault() :该方法阻止默认行为,如不让链接跳转(IE678用e.returnValue)
(return false 没有兼容性,但是后面的代码不执行了,只能用在传统注册方式)
e.stopPropagetion():阻止冒泡 (Ie678用 e.cancelBubble = true )

//兼容性写法   了解
if( e && e.stopPropagetion){
    e.stopPropagetion()
}else {
    window.event.cancelBubble = true
}

19.事件委托
原理:不是每个子节点单独设置事件监听器,而是把事件监听器设置在父节点上,利用冒泡原理影响每个子节点
比如:给ul注册点击事件,利用事件对象的Ttarget来找到当前点击的li,点击li,事件会冒泡到ul上,ul有注册事件,就会触发事件监听器。

//点击哪个li哪个li背景变粉色
ul.addEventListener('click',function(e){
    e.target.style.backgroundColor = 'pink'
})

20.鼠标事件
禁止鼠标右键菜单

document.addEventListener('contextmenu',function(e){
    e.preventDefault()
})

禁止鼠标选中—不让复制

document.addEventListener('selectstart',function(e){
    e.preventDefault()
})

鼠标事件对象
e.clientX:相对于浏览器窗口可视区的X坐标----滚动条下滑坐标也不变
e.pageX:相对于文档页面的X坐标(IE9以上)
e.screenX:相对于电脑屏幕的X坐标
案例:图片跟随鼠标移动—把最新的鼠标坐标作为top和left值

img {position:absolute}
var pic = document.querySelector('img')
document.addEventListener('mousemove',function(e){
    pic.style.left = e.pageX - 40 + 'px';
    pic.style.top = e.pageY - 40 + 'px'
})

21.键盘事件
onkeyup:按键松开时触发 ,不区分字母大小写
onkeydown:按键按下时触发
onkeypress:按键按下时触发,但不识别功能键如ctrl,shift,箭头,区分字母大小写
键盘事件对象
e.keyCode:返回改键的ASCII值

案例:按s键,光标定到搜索框里

var search = document.querySelector('input')
document.addEventListener('keyup',function(e){
    if(e.keyCode === 83) {
        search.focus()
    }
})

案例:输入内容,显示大盒子
在这里插入图片描述
22.BOM—浏览器对象模型
提供了独立于内容而与浏览器窗口进行交互的对象,核心对象window
23.window常见事件
窗口加载事件:文档内容都加载完触发

window.onload = function(){}  //只能写一次
window.addEventListener("load",function(){})  //全部加载完,包括dom元素 图片 css等
window.addEventListener("DOMContentLoaded",function(){})  //dom元素加载完,不包括图片 css等,加载速度快

调整窗口大小事件

window.onresize = function(){} 
window.addEventListener("resize",function(){
    if(window.innerWidth <= 800){    //window.innerWidth 屏幕宽度
        div.style.display = 'none'
    }
})


24.两种定时器04 00
setTimeout() 时间到了就调用一次
setInterval() 重复调用这个函数,每隔这个时间就调用一次

vae timer = setTimeout(function(){
    console.log('啦啦啦')
},2000)  //毫秒
//点击停止定时器
btn.addEventListener(click,function(){
    clearTimeout(timer)    //第二种clearInterval()
})

//调用
function fun() {
    console.log('啦啦啦')
}
setTimeout(fun,2000) 

案例:倒计时
在这里插入图片描述

<div class="day"></div>
<div class="hour"></div>
<div class="minute"></div>
<div class="second"></div>

<script type="text/javascript">
	var day = document.querySelector('.day')
	var hour = document.querySelector('.hour')
	var minute = document.querySelector('.minute')
	var second = document.querySelector('.second')
	var inputTime = +new Date('2021-1-1 10:00:00'); // 返回的是用户输入时间总的毫秒数
	countDown();   //先调用一次,防止第一次刷新页面有空白
	setInterval(countDown,1000);
	function countDown() {
	    var nowTime = +new Date(); // 返回的是当前时间总的毫秒数
	    var times = (inputTime - nowTime) / 1000; // times是剩余时间总的秒数 
	    var d = parseInt(times / 60 / 60 / 24); // 天
	    d = d < 10 ? '0' + d : d;
		day.innerHTML = d + '天';
	    var h = parseInt(times / 60 / 60 % 24); //时
	    h = h < 10 ? '0' + h : h;
		hour.innerHTML = h + '时';
	    var m = parseInt(times / 60 % 60); // 分
	    m = m < 10 ? '0' + m : m;
		minute.innerHTML = m + '分';
	    var s = parseInt(times % 60); // 当前的秒
	    s = s < 10 ? '0' + s : s;
		second.innerHTML = s + '秒';
	}
</script>

案例:验证码60s倒计时

var btn = document.querySelector('button');
var time = 60;
btn.addEventListener('click',function() {
	btn.disabled = true;
	var timer = setInterval(function(){
		if(time == 0) {
			clearInterval(timer)
			btn.disabled = false;
			btn.innerHTML = '发送';
			time = 60;
		}else {
			btn.innerHTML = '还剩下' + time + '秒';
			time--;
		}
	},1000)
})

25.this指向问题 — 04 1907
全局作用域、普通函数、定时器 this指向window
方法调用中谁调用this指向谁
构造函数中this指向构造函数的实例

26.JS执行机制
特点----单线程—同一时间只能做同一件事

JS执行机制:
1.先执行执行栈中的同步任务。
2.异步任务(回调函数)放入任务队列中。
3.执行栈中的所有同步任务执行完,系统按次序读取任务队列中的异步任务,被读取的异步任务结束等待任务,进入执行栈,开始执行。

异步任务有以下三种:
1.普通事件,click、resize
2.资源加载,load、error
3.定时器,setInterval、setTimeout

//主线程执行栈
console.log(1);
document.onclick = function(){console.log(2)}
console.log(3);
setTimeout(function(){console.log(4)},1000)

//先打印1
//点击事件交给“异步进程处理”,点击了才放入异步任务队列里
//打印3
//计时器交给“异步进程处理”,到了3s放入异步任务队列里
//点击事件没触发,打印134;3s前触发点击事件,打印1324;3s后触发点击事件,打印1342

27.location对象
http: //www.baidu.com /index.html ?name=a&age=b #link
通信协议 ----主机(域名) ---- 路径 ----------- 参数-------- 片段

location对象的属性
location.href 获取或设置整个href
location.host 返回主机(域名)
location.port 返回端口号
location.pathname 返回路径
location.search 返回参数
location.hash 返回片段
案例:登录页输入名字,跳转到首页出现该名字

//登录页
<form action="b.html">
	用户名:<input type="text" name="uname"/>
	<input type="submit" value="登录"/>
</form>
//首页
console.log(location.search)  //?uname=aaaa
var params = location.search.substr(1);  //去掉?  
var arr = params.split('=')  // ["uname","aaaa"]
document.querySelector('.show').innerHTML = arr[1] + '欢迎你'

location.assign() 跟href一样,可以跳转页面,记录历史可以后退页面
location.replace() 替换当前页面,所以不能后退
location.reload() 重新加载页面,括号为true为强制刷新
28.navigator对象
navigator.userAgent 一般用来判断在哪个终端打开的页面
29.history对象
history.back() 后退
history.forward()前进
go(1)前进一个页面go(-1)后退一个页面

30,元素偏移量offset系列
element.offsetParent 返回带有定位的父级元素,父级元素都没有定位返回body
element.offsetTop 距离带有定位父元素上边框距离
element.offsetLeft 距离带有定位父元素左边框距离
element.offsetWidth 返回自身宽度,包括padding、边框、内容区
element.offsetHeight 返回自身高度,包括padding、边框、内容区
在这里插入图片描述
案例:盒子内点击,得到鼠标距离盒子左右的距离

box.addEventListener('click',function(e) {
	var x = e.pageX - this.offsetLeft   //鼠标距离顶部距离- 盒子距离顶部距离
})

案例:可以拖动的弹框

<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title></title>
	<style type="text/css">
		.mask {
			display: none;
			width: 100%;
			height: 100%;
			background-color: rgba(0,0,0,.2);
			position: fixed;
			top: 0;
			left: 0;
		}
		.popBox {
			display: none;
			width: 200px;
			height: 100px;
			background-color: #fff;
			position: fixed;
			top: 50%;
			left: 50%;
			transform: translate(-50%,-50%);
		}			
		.close {
			position: absolute;
			top: 0;
			right: 0;
		}
	</style>
</head>
<body>
	<div class="mask"></div><!-- 遮罩层 -->
	<div class="popBox">
		弹框
		<div class="close">X</div>
	</div>
	<div class="btn">点击弹出</div>
	
	<script type="text/javascript">
		var btn = document.querySelector(".btn")
		var mask = document.querySelector(".mask")
		var popBox = document.querySelector(".popBox")
		var close = document.querySelector(".close")
		btn.addEventListener('click',function(){
			mask.style.display = 'block'
			popBox.style.display = 'block'
		})
		close.addEventListener('click',function(){
			mask.style.display = 'none'
			popBox.style.display = 'none'
		})
		popBox.addEventListener('mousedown',function(e){
			var x = e.pageX - popBox.offsetLeft; //鼠标在盒子中的位置固定不变
			var y = e.pageY - popBox.offsetTop;
			document.addEventListener('mousemove',move)
			function move(e){
				popBox.style.left = e.pageX - x + 'px';
				popBox.style.top = e.pageY - y + 'px'
			}
			document.addEventListener('mouseup',function(){
				document.removeEventListener('mousemove',move)
			})
		})
		
	</script>
</body>
</html>

31元素可视区client系列
element.clientTop 返回元素上边框大小
element.clientLeft 返回元素左边框大小
element.clientWidth 返回自身宽度,包括padding、内容区,不含边框
element.clientHeight 返回自身高度,包括padding、内容区,不含边框

32元素滚动scroll系列
element.scrollTop 返回内容超出盒子上方的距离
element.scrollLeft 返回容超出盒子左侧的距离
element.scrollWidth 返回自身实际内容宽度(因为内容可能比盒子大 ),不含边框
element.scrollHeight 返回自身实际内容高度,不含边框
在这里插入图片描述
页面被卷出去距离通过window.pageYOffset

<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title></title>
	<style type="text/css">
		.slide {
			display: none;
            position: fixed;
			top: 70%;
			right: 30px;
		}
		.a {
			width: 100%;
			height: 100px;
			background-color: red;
		}
		.b {
			width: 100%;
			height: 900px;
			background-color: pink;
		}
	</style>
</head>
<body>
	<div class="slide">
		<span>返回</span>
	</div>
	<div class="a"></div>
	<div class="b"></div>
	<script type="text/javascript">
		var slide = document.querySelector(".slide");
		var b = document.querySelector(".b");
		var bTop = b.offsetTop;  //或者a.clientHeight
		console.log(bTop)
		document.addEventListener('scroll',function(){
			if(window.pageYOffset >= bTop) {
				slide.style.display = 'block';
			}
		})
		
	</script>
</body>
</html>

33
mouseover:鼠标经过自身盒子会触发,经过子盒子还会触发,冒泡
mouseenter:只经过自身盒子触发,不会冒泡------mouseleave
34动画函数封装

盒子匀速向右移动

div {
	width: 100px;
	height: 100px;
	background-color: pink;
	position: absolute;
	left: 0;
	top: 0;
}
function animate(obj,targect) {
	clearInterval(obj.timer)
	obj.timer = setInterval(function() {
		if(obj.offsetLeft >= targect) {
			clearInterval(obj.timer)
		}
		obj.style.left = obj.offsetLeft + 1 + 'px'
	},30)
}
var div = document.querySelector('div');
animate(div,200)

盒子减速向右移动

<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title></title>
	<style type="text/css">
		div {
			width: 100px;
			height: 100px;
			background-color: pink;
			position: absolute;
			left: 0;
			top: 30;
		}
	</style>
</head>
<body>
    <button class="btn8" type="button">目标800</button>
	<button class="btn4" type="button">目标400</button>
	<div></div>
	<script type="text/javascript">
		function animate(obj,target) {
			clearInterval(obj.timer)
			obj.timer = setInterval(function() {
				var step = (target - obj.offsetLeft) / 10; //公式:(目标值-目前位置)/10
				step = step > 0 ? Math.ceil(step) : Math.floor(step)
				if(obj.offsetLeft == target) {
					clearInterval(obj.timer)
				}
				obj.style.left = obj.offsetLeft + step + 'px'
			},30)
		}
		var div = document.querySelector('div');
		var btn8 = document.querySelector('.btn8');
		var btn4 = document.querySelector('.btn4');
		
	    btn8.addEventListener('click',function(){
			animate(div,800)
		})
		btn4.addEventListener('click',function(){
			animate(div,400)
		})
	</script>
</body>
</html>

动画函数添加回调函数:
回调函数原理:函数可以作为一个参数,将这个函数作为参数传到另一个函数里,当那个函数执行完后,再执行传进去的这个函数,这个过程叫回调。
如:盒子停到800位置后变红

function animate(obj,target,callback) {
	clearInterval(obj.timer)
	obj.timer = setInterval(function() {
		var step = (target - obj.offsetLeft) / 10; 
		step = step > 0 ? Math.ceil(step) : Math.floor(step)
		if(obj.offsetLeft == target) {
			clearInterval(obj.timer);
			if(callback) {
				callback()
			}
		}
		obj.style.left = obj.offsetLeft + step + 'px'
	},30)
}
var div = document.querySelector('div');
var btn8 = document.querySelector('.btn8');
var btn4 = document.querySelector('.btn4');

   btn8.addEventListener('click',function(){
	animate(div,800)
})
btn4.addEventListener('click',function(){
	animate(div,400,function() {
		div.style.backgroundColor = 'red';
	})
})

34 轮播图 6 47
35 移动端常见特效 63
(1)touchstart手指触摸DOM元素事件:
touches对象:正在触摸屏幕的所有手指的列表
targetTouches:正在触摸当前Dom元素的手指列表,e.targetTouches[0]得到第一个手指相关信息
changedTouches:手指状态发生了改变的列表,从无到有/从有到无
(2)touchmove手指在DOM元素上移动事件:
(3)touchstart手指离开DOM元素事件:
changedTouches
拖动元素:

<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title></title>
	<style type="text/css">
		div {
			width: 100px;
			height: 100px;
			background-color: red;
			position: absolute;
			left: 0;
			top: 0;
		}
	</style>
</head>
<body>
	<div></div>
	<script type="text/javascript">
		//手指移动距离=手指当前距离-手指初始距离
		//盒子移动后位置=盒子初始位置+手指移动距离
		var div = document.querySelector("div");
		var startX = 0;  //手指初始距离
		var startY = 0;
		var x = 0;  //盒子初始位置
		var y = 0;
		div.addEventListener('touchstart',function(e){
			x = this.offsetLeft;
			y = this.offsetTop;
			startX = e.targetTouches[0].pageX;
			startY = e.targetTouches[0].pageY;
		})
		div.addEventListener('touchmove',function(e){
			var moveX = e.targetTouches[0].pageX - startX;
			var moveY = e.targetTouches[0].pageY - startY;
			this.style.left = x + moveX + 'px';
			this.style.top = y + moveY + 'px';
			e.preventDefault(); //阻止屏幕滚动的默认行为 
		})
	</script>
</body>
</html>	 

在这里插入图片描述
轮播图滑动 8
移动端click事件会有300ms延时,原因是移动端双击会缩放页面,解决:
(1)禁止缩放

<meta name="viewport" content="user-scalable=no">

(2)利用touch事件自己封装这个事件解决300ms延迟
(3)用fastclick插件76
36 常用插件:
Swiper轮播图
Superslide各种组件,TouchSlide移动端
iscroll移动端滚动
zy-media.js移动视频插件

37 本地存储 85
本地存储特性:
(1)数据存储在浏览器中
(2)设置读取方便
(3)容量大,sessionStorage约5M,localStorage约20M
(4)只能存储字符串,可以将对象JSON.stringify()编码后存储

window.sessionStorage
(1)生命周期为关闭浏览器窗口
(2)在同一个页面下数据可以共享
(3)以键值对的形式存储
存储数据:sessionStorage.setItem(‘key’,value) (存储命名,存储的值)
获取数据:sessionStorage.setItem(‘key’)
删除数据:sessionStorage.removeItem(‘key’)
清楚所有数据:sessionStorage.clear()

window.localStorage
(1)生命周期永久生效
(2)同一个浏览器中多个页面可以共享
(3)以键值对的形式存储
案例:记住用户名
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值