alert(msg)
:浏览器弹出警示框。
console.log(msg)
:浏览器控制台打印输出信息。
prompt(info)
:浏览器弹出输入框,用户可以输入。
变量是内存里的一块空间,用来存储数据。
Number:数字型,包含整型值和浮点型值。默认值为0。
Number.MAX_VALUE
:数值的最大值(1.7976931348623157e+308)。Number.MIN_VALUE
:数值的最大值(5e-324)。Infinity
:代表无穷大,大于任何数值。-Infinity
:代表无穷小,小于任何数值。NaN
:Not a number,代表一个非数值。isNaN
:判断非数字。如果是数字为false,否则为true。String:字符串类型,字符串都带引号。默认值为""。
转义符 | 解释说明 |
---|---|
\n | 换行符 |
\ | 斜杠 |
’ | 单引号 |
" | 双引号 |
\t | tab缩进 |
\b | 空格 |
str.length
:获取整个字符串的长度。Boolean:布尔值类型,如true、false,等价于1和0。默认值为false。
undefined:没有赋值。默认值为undefined。
null:空值。默认值为null。
typeof
:可用来获取检测变量的数据类型。num.toString()
转成字符串。String()
强制转换成字符串。parseInt(String)
将string类型转成整数数值型。parseFloat(string)
将string类型转成浮点数数值型。Number()
强制将string类型转成数值型。使用Boolean()
强制将其他类型转成布尔值
代表空、否定的值会被转换为false,如’’、0、NaN、null、undefined。
其余值都会被转换为true。
运算符也被称为操作符,是用于实现复制、比较和执行算数运算等功能的符号。
常用的运算符有:算数运算符、递增和递减运算符、比较运算符、逻辑运算符、赋值运算符。
运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余数(取模) |
递增(++)和递减(–)既可以放在变量前面,也可以放在变量后面。放在变量前面时,称为前置递增(递减)运算符,放在变量后面时,称为后置递增(递减)运算符。
比较运算符是两个数据进行比较时所使用的运算符,比较运算后,会返回一个布尔值作为比较运算的结果。
运算符名称 | 说明 |
---|---|
< | 小于号 |
> | 大于号 |
>= | 大于等于号 |
<= | 小于等于号 |
== | 判等号(会转型) |
!= | 不等号 |
=== !== | 全等 要求值和数据类型都一致 |
逻辑运算符是用来进行布尔值运算的运算符,其返回值也是布尔值。
逻辑运算符 | 说明 |
---|---|
&& | 逻辑与,简称与(and),两边都是true才为true |
|| | 逻辑或,简称或(or),两边都是false才为false |
! | 逻辑非,简称非(not),取反 |
赋值运算符是用来把数据赋值给变量的运算符。
赋值运算符 | 说明 |
---|---|
= | 直接赋值 |
+=、-= | 加、减一个数后在赋值 |
*=、/=、%= | 乘、除、取模后在赋值 |
运算符 | 顺序 |
---|---|
小括号 | () |
一元运算符 | ++ – ! |
算数运算符 | 先* / %后+ - |
关系运算符 | > >= < <= |
相等运算符 | == != === !== |
逻辑运算符 | 先&&后|| |
赋值运算符 | = |
逗号运算符 | , |
函数就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。
函数在使用时分为两步:声明函数和调用函数。
//声明函数
function 函数名() {
//函数体代码
}
var fun = function() {
//函数体
}
//调用函数
函数名(); //通过调用函数名来执行函数体代码
函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口。
function 函数名(形参) {
//函数体
}
函数名(实参);
参数个数 | 说明 |
---|---|
实参个数等于形参个数 | 输出正确结果 |
实参个数多于形参个数 | 只取到形参的个数 |
实参个数小于形参个数多的形参定义为undefined,结果为NaN |
根据作用域的不同,变量可以分为全局变量和局部变量。
在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)。
在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)。
var obj = {
name: 'Freedom',
age: 18,
sex: '男',
say: function() {
console.log('hello');
}
}
对象.属性名
。对象['属性名']
,注意方括号里面的属性必须加引号。对象.方法名()
,注意这个方法名字后面一定加括号。new Array()
原理一致。var obj = new Object();
obj.name = 'Freedom',
obj.age = 18,
obj.sex = '男',
obj.say = function() {
console.log('hello');
}
function 构造函数名() {
this.属性 = 值;
this.方法 = function() {}
}
new 构造函数名();
函数名()
的方式就可以调用。对象.方法名()
的方式就可以调用,方法用来描述该对象的行为和功能。var obj = {
name: 'Freedom',
age: 18,
sex: '男',
say: function() {
console.log('hello');
}
}
for (var key in obj) {
console.log(key); //输出属性名
console.log(obj[key]); //输出属性值
}
Math.PI
:圆周率。Math.floor()
:向下取整。Math.ceil()
:向上取整。Math.round()
:四舍五入,就近取整。Math.abs()
:绝对值。Math.max()/Math.min()
:求最大和最小值。Math.random()
:随机数。var now = new Date(); //获取当前的时间
var dateTime = new Date('2019-5-1'); //获取参数里的时间
方法名 | 说明 |
---|---|
getFullYear() | 获取当年 |
getMonth() | 获取当月(0-11) |
getDate() | 获取当天日期 |
getDay() | 获取星期几(周日0到周六6) |
getHours() | 获取当前小时 |
getMinutes() | 获取当前分钟 |
getSeconds() | 获取当前秒钟 |
getTime()/valueOf()/+new Date()/Date.now() | 获取总的毫秒 |
var arr = []; //空数组
var arr = new Array(); //空数组
var arr = new Array(2); //长度为2的数组
var arr = new Array(2,3); //长度为2,值为2,3的数组
参数 instanceof Array
Array.isArray(参数) //只支持IE9以上版本
方法名 | 说明 |
---|---|
push(parm) | 末尾添加一个或多个元素,注意修改原数组 |
pop() | 删除数组最后一个元素,把数组长度减1无参数、修改原数组 |
unshift(parm) | 向数组的开头添加一个或更多元素,注意修改原数组 |
shift() | 删除数组的第一个元素,数组长度减1无参数、修改原数组 |
方法名 | 说明 |
---|---|
reverse() | 颠倒数组中元素的顺序,无参数 |
sort() | 对数组的元素进行排序 |
方法名 | 说明 |
---|---|
indexOf() | 数组中查找给定元素的第一个索引 |
lastIndexOf() | 在数组中的最后一个的索引 |
方法名 | 说明 |
---|---|
toString() | 把数组转换成字符串,逗号分隔每一项 |
join(‘分隔符’) | 方法用于把数组中的所有元素转换为一个字符串 |
方法名 | 说明 |
---|---|
concat() | 连接两个或多个数组,不影响原数组 |
skice() | 数组截取slice(begin,end) |
splice() | 数组删除splice(第几个开始,要删除个数) |
基本包装类型就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。
字符串的不可变指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中开辟了一个内存空间。
方法名 | 说明 |
---|---|
indexOf(str,strPos) | 返回指定内容在字符串中的位置,如果找不到就返回-1,开始的位置就是index索引号 |
lastIndexOf() | 从后往前找,只找第一个匹配 |
方法名 | 说明 |
---|---|
charAt(index) | 返回指定位置的字符(index字符串的索引号) |
charCodeAt(index) | 获取指定位置处字符的ASCII码(index索引号) |
str[index] | 获取指定位置处字符,只支持IE8以上 |
方法名 | 说明 |
---|---|
concat(str1,str2,str3…) | concat()方法用于连接两个或多个字符串。拼接字符串,等效于+ |
substr(start,length) | 从start位置开始(索引号),length取的个数 |
slice(start,end) | 从start位置开始,截取到end位置,end取不到 |
substring(start,end) | 从start位置开始,截取到end位置,end取不到,基本和slice相同,但是不接受负值 |
replace(‘替换前的字符’,‘替换后的字符’) | 字符的替换 |
split(‘分隔符’) | 字符转换为数组 |
API是给程序员提供的一种工具,以便能更轻松的实现想要完成的功能。
Web API是浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM)。
document.getElementById('id')
:通过id获取,返回一个元素对象。document.getElementsByTagName('tag')
:根据标签名获取,返回带有指定标签名的对象的集合。document.getElementsByClassName('类名')
:根据类名返回元素对象集合。document.querySelector('选择器')
:根据指定选择器返回第一个元素对象。document.querySelectorAll('选择器')
:根据指定选择器返回。document.body
:返回body元素对象。document.documentElement
:返回html元素对象。利用DOM操作元素里面的内容、属性等,可以该表网页内容、结构和样式。
element.innerText
:从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会去掉。element.innerHTML
:起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行。src
、href
、alt
、title
等。type
、value
、checked
、selected
、disabled
等。element.style
:改变行内样式操作。element.className
:改变类名样式操作。element.attr
:获取元素本身自带的属性。element.getAttribute(attr)
:主要获得程序员自定义的属性。element.attr=value
:设置内置属性值。element.setAttribute(attr)
:主要设置自定义的属性。element.removeAttribute(attr)
:移除属性。一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。
node.parentNode
:返回父节点。parentNode.childNodes
:返回包含指定节点的子节点的集合,该集合为即时更新的集合。parentNode.children
:获取所有的子元素节点。parentNode.firstChild
:返回第一个子节点,找不到则返回null。parentNode.lastChild
:返回最后一个子节点,找不到则返回null。parentNode.firstElementChild
:返回第一个子元素节点,找不到则返回null。只支持IE9以上。parentNode.lastElementChild
:返回最后一个子元素节点,找不到则返回null。只支持IE9以上。parentNode.children[index]
:返回子元素节点中的某个元素节点。node.nextSibling
:返回当前元素的下一个兄弟节点,找不到则返回null。包含所有的节点。node.previousSibling
:返回当前元素的上一个兄弟节点,找不到则返回null。包含所有的节点。node.nextElementSibling
:返回当前元素的下一个兄弟元素节点,找不到则返回null。只支持IE9以上。node.previousElementSibling
:返回当前元素的上一个兄弟元素节点,找不到则返回null。包含所有的节点。只支持IE9以上。document.createElement('tagName')
:动态创建元素节点。node.appendChild(child)
:将一个节点添加到指定父节点的子节点列表末尾。node.insertBefore(child,指定元素)
:将一个节点添加到父节点的指定子节点前面。element.insertAdjacentHTML(position, text)
:将指定的文本解析为HTML,并将结果节点插入到DOM树中。
beforebegin
: 元素自身的前面。afterbegin
: 插入元素内部的第一个子节点之前。beforeend
: 插入元素内部的最后一个子节点之后。afterend
: 元素自身的后面。node.removeChild(child)
:返回删除的节点。补充:阻止链接跳转需要添加javascript:void(0)
或者javascript:;
。
node.cloneNode()
:返回调用该方法的节点的一个副本。注意:如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点;括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点。
document.write()
是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘。element.innerHTML()
是将内容写入某个DOM节点,不会导致页面全部重绘。element.innerHTML()
创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂。document.creatElement()
创建多个元素效率稍微低一点点,但是结构更清晰总结:不同浏览器下,innerHTML效率要比createElement高。
事件是由三部分组成:事件源、事件类型和事件处理程序。
鼠标事件 | 触发条件 |
---|---|
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发(不仅自身,子盒也会) |
onmouseenter | 鼠标经过触发(自身) |
onmouseout | 鼠标离开触发 |
onfocus | 获得鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
给元素添加事件,称为注册事件或者绑定事件。
注册事件有两种方式:传统方式和方法监听注册方式。
。btn.onclick=function(){}
。addEventListener()
它是一个方法。attachEvent()
代替。eventTarget.addEventListener(type, lstener[, useCapture]);
eventTarget.addEventListener()
方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数。
eventTarget.attachEvent(eventNameWithOn, callback);
eventTarget.attachEvent()
方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,指定的回调函数就会被执行。
function addEventListener(element, eventName, fn) {
//判断当前浏览器是否支持addEventListener方法
if (element.addEventListener) {
element.addEventListener(eventName, fn); //第三个参数 默认是false
} else if (element.attachEvent) {
element.attachEvent('on' + eventName, fn);
} else {
//相当于element.onclick = fn;
element['on' + eventName] = fm;
}
}
eventTarget.onclick = null;
eventTarget.removeEventListener(type, listener[, useCapture]);
eventTarget.detachEvent(eventNameWithOn, callback);
function removeEventListener(element, eventName, fn) {
//判断当前浏览器是否支持removeEventListener方法
if (element.removeEventListener) {
element.removeEventListener(eventName, fn); //第三个参数 默认是false
} else if (element.detachEvent) {
element.detachEvent('on' + eventName, fn);
} else {
element['on' + eventName] = null;
}
}
事件流描述的是从页面中接收事件的顺序。
DOM事件流:事件发生时会在元素节点之间按照特定的顺序传播。
DOM事件流分为三个阶段:捕获阶段、当前目标阶段和冒泡阶段。
onclick
和attachEvent
只能得到冒泡阶段。addEventListener(type, listener[, useCapture])
第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;如果是false(不写默认就是false),表示在事件冒泡阶段调用事件处理程序。事件对象:事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面。它有很多属性和方法。
eventTarget.onclick = function(event) {
//这个event就是事件对象,可以写成e或者evt
}
eventTarget.addEventListener('click', function(event) {
//这个event就是事件对象,可以写成e或者evt
})
e = e || window.event();
。事件对象属性方法 | 说明 |
---|---|
e.target | 返回触发事件的对象(标准) |
e.srcElement | 返回触发事件的对象(非标准IE6~8使用) |
e.type | 返回事件的类型,比如click不带on |
e.cancelBubble | 该属性阻止冒泡(非标准IE6~8使用) |
e.returnValue | 该属性阻止默认事件(非标准IE6~8使用),比如不让链接跳转 |
e.preventDefault() | 该方法阻止默认事件(标准),比如不让链接跳转 |
e.stopPropagation() | 阻止冒泡(标准) |
//阻止事件冒泡的兼容性解决方案
if (e && e.stopPropagation) {
e.stopPropagation();
} else {
window.event.cancelBubble = true;
}
var ul = document.querySelector('ul');
ul.addEventListener('click', function(e) {
e.target.style.backgroundColor = 'pink';
})
contextmenu
主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单。document.addEventListener('contextmenu', function(e) {
e.preventDefault();
})
selectstart
开始选中。document.addEventListener('selectstart', function(e) {
e.preventDefault();
})
鼠标事件对象 | 说明 |
---|---|
e.clientX | 返回鼠标相对于浏览器窗口可视区的X坐标 |
e.clientY | 返回鼠标相对于浏览器窗口可视区的Y坐标 |
e.pageX | 返回鼠标相对于文档页面的X坐标IE9+支持 |
e.pageY | 返回鼠标相对于文档页面的Y坐标IE9+支持 |
e.screenX | 返回鼠标相对于电脑屏幕的X坐标 |
e.screenY | 返回鼠标相对于电脑屏幕的Y坐标 |
e.stopPropagation() | 阻止冒泡(标准) |
键盘事件 | 触发条件 |
---|---|
onkeyup | 某个键盘按键被松开时触发 |
onkeydown | 某个键盘按键被按下时触发 |
onkeypress | 某个键盘按键被按下时触发,但它不识别功能键(比如shift、ctrl) |
键盘事件对象属性 | 说明 |
---|---|
keyCode | 返回该键的ASCII值 |
BOM即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其对象是window。
DOM | BOM |
---|---|
文档对象模型 | 浏览器对象模型 |
DOM就是把文档当做一个对象来看待 | 把浏览器当做一个对象来看待 |
DOM的顶级对象是document | BOM的顶级对象是window |
DOM主要是操作页面元素 | BOM主要是浏览器窗口交互的一些对象 |
DOM是W3C标准规范 | BOM是浏览器厂商在各自浏览器上定义的,兼容性较差 |
window.onload = function(){}
或者
window.addEventListener("load",function(){});
window.onload
是窗口(页面)加载事件,当文档内容完全加载完成会触发改时间(包括图像、脚本文件、css文件等),就调用的处理函数。
window.onload
就可以把js代码写到页面元素的上方,因为onload是等页面内容全部加载完毕,再去执行处理函数。window.onload
传统注册事件方式只能写一次,如果有多个,会以最后一个window.onload
为准。document.addEventListener('DOMContentLoaded',function(){});
DOMContentLoaded事件触发时,仅当DOM加载完成,不包括样式表,图片,flash等等。IE9以上才支持。
如果页面的图片很多的话,从用户访问到onload触发可能需要较长的时间,交互效果就不能实现,必然影响用户的体验,此时用DOMContentLoaded事件比较合适。
window.onresize = function(){} window.addEventListener("resize",function(){});
window.onresize
是调整窗口大小加载事件,当触发时就调用的处理函数。
window.innerWidth
当前屏幕的宽度。window.setTimeout(调用函数, [延迟的毫秒数]);
setTimeout()
方法用于设置一个定时器,该定时器在定时器到期后执行调用函数。
window.clearTimeout(timeoutID)
clearTimeout()
方法取消了先前通过调用setTimeout()建立的定时器。
window.setInterval(回调函数, [间隔的毫秒数]);
setInterval()
方法重复调用一个函数,每隔这个事件,就去调用一次回调函数。
window.clearInterval(tintervalID)
clearInterval()
方法取消了先前通过调用setInterval()建立的定时器。
this的指向在函数定义的时候是确定了的,只有函数执行的时候才能确定this到底指向谁,一般情况下this的最终指向的是那个调用它的对象。
JavaScaript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这是因为JavaScript这门脚本语言诞生的使命所致——JavaScript是为处理页面中用户的交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行。应该先进行添加,之后再删除。
单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。这样所导致的问题是:如果js执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。
同步:前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。
异步:你在做一件事情时,因为这件事情会花费很长时间,在做这件事的同时,你还可以去处理其他事情。
同步任务都在主线程上执行,形成一个执行栈。
js的异步是通过回调函数实现的。一般而言,异步有三种类型:普通事件,资源加载和定时器。异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列)。
先执行执行栈中的同步任务。
异步任务(回调函数)放入任务队列中。
一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。
由于主线程不断的重复获得任务、执行任务、再获取任务、再执行,所以这种机制被称为事件循环。
**统一资源定位符(URL)**是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL的一般语法格式为:protocol://host[:port]/path/[?query]#fragment。
组成 | 说明 |
---|---|
protocol | 通信协议常用的http,ftp,maito等 |
host | 主机(域名) |
port | 端口号 |
path | 路径,由零或多个"/"符号隔开的字符串,一般用来表示主机上的一个目录或文件地址 |
query | 参数,以键值对的形式,通过&符号分割开来 |
fragment | 片段,#后面内容,常见于链接 |
location对象属性 | 返回值 |
---|---|
location.href | 获取或者设置整个URL |
location.host | 返回主机(域名) |
location.port | 返回端口号 |
location.pathname | 返回路径 |
location.search | 返回参数 |
location.hash | 返回片段 |
location对象方法 | 返回值 |
---|---|
location.assign() | 跟href一样,可以跳转页面(也称为重定向页面) |
location.replace() | 替换当前页面,因为不记录历史,所以不能后退页面 |
location.reload() | 重新加载页面,相当于刷新按钮或者f5 |
navigator.useAgent
返回由客户机发送服务器的user-agent头部的值。history对象方法 | 作用 |
---|---|
history.back() | 可以后退功能 |
history.forward() | 前进功能 |
history.go(参数) | 前进后退功能,参数如果是1,前进1个页面;如果是-1,后退1个页面 |
offset属性可以动态的得到该元素的位置(偏移)、大小等。
offset系列属性 | 作用 |
---|---|
element.offsetParent | 返回作为该元素带有定位的父级元素,如果父级都没有定位,则返回body |
element.offsetTop | 返回元素相对带有定位父元素上方的偏移 |
element.offsetLeft | 返回元素相对带有定位元素左边框的偏移 |
element.offsetWidth | 返回自身包括padding、边框、内容区的宽度,返回数值不带单位 |
element.offsetHeight | 返回自身包括padding、边框、内容区的高度,返回数值不带单位 |
client属性可以动态的得到该元素的边框大小,元素大小等。
client系列属性 | 作用 |
---|---|
element.clientTop | 返回元素上边框的大小 |
element.clientLeft | 返回元素左边框的大小 |
element.clientWidth | 返回自身包括padding、内容区的宽度,不含边框,返回数值不带单位 |
element.clientHeight | 返回自身包括padding、内容区的高度,不含边框,返回数值不带单位 |
scroll属性可以动态的得到该元素的大小、滚动距离等。
scroll系列属性 | 作用 |
---|---|
element.scrollTop | 返回被卷去的上侧距离,返回数值不带单位 |
element.scrollLeft | 返回被卷去的左侧距离,返回数值不带单位 |
element.scrollWidth | 返回自身实际的宽度,不含边框,返回数值不带单位 |
element.scrollHeight | 返回自身实际的的高度,不含边框,返回数值不带单位 |
document.documentElement.scrollTop
。document.body.scrollTop
。window.pageYOffset
和window.pageXOffset
,IE9开始支持。function getScroll() {
return {
left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0,
top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
};
}
//使用的时候 getScroll().left
//轮播图
function animate(obj, tatget, 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';
}, 15);
}
//滚动条
function animate(obj, tatget, callback) {
//清除之前的定时器
clearInterval(obj.timer);
//设置定时器
obj.timer = setInterval(function{
//缓慢原理
var step = (target - window.pageYOffset) / 10;
//将步长值改为整数
step = step > 0 ? Math.ceil(step) : Math.floor(step);
if (window.pageYOffset == target) {
//停止动画
clearInterval(obj.timer);
//回调函数写到定时器结束里面
callback && callback()
}
window.scroll(0, window.pageYOffset + step)
}, 15);
}
触摸事件 | 作用 |
---|---|
touchstart | 手指触摸DOM元素事件 |
touchumove | 手指在DOM元素身上移动事件 |
touchend | 手指离开DOM元素事件 |
触摸事件是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件。这类事件用于描述一个或多个触电,使开发者可以检测触电的移动,触电的增加和减少,等等。
touchstart、touchmove、touchend三个事件都会各自有事件对象。
触摸列表 | 说明 |
---|---|
touches | 正在触摸屏幕的所有手指的一个列表 |
targetTouches | 正在触摸当前DOM元素上的手指的一个列表 |
changeTouches | 手指状态发生了改变的列表,从无到有,从有到无变化 |
classList属性是HTML5新增的一个属性,返回元素的类名。但是IE10以上版本支持。该属性用于在元素中添加,移除及切换CSS类。
element.classList.add(className);
:添加类。
element.classList.remove(className);
:移除类。
element.classList.toggle(className);
:切换类。
移动端click事件会有300ms的延时,原因是移动端屏幕双击会缩放页面。
禁用缩放。浏览器禁用默认的双击缩放行为并且去掉300ms的点击延迟。``
利用touch事件封装事件解决300ms延迟。
//封装tap,解决click300ms延迟
function tap (obj, callback) {
var isMove = false;
var startTime = 0; //记录触摸时候的时间变量
obj.addEventListener('touchstart', function(e) {
startTime.Date.now(); //记录触摸时间
});
obj.addEventListener('touchmove', function(e) {
isMove = true; //看看是否有滑动,有滑动算拖拽,不算点击
});
obj.addEventListener('touchend', function(e) {
//如果手指触摸和离开时间小于150ms算点击
if (!isMove && (Date.now() - startTime) < 150) {
callback && callback(); //执行回调函数
}
isMove = false; //取反 重置
startTime = 0;
});
}
//调用
tap(div, function() {
//执行代码
});
sessionStorage.setItem(key,value);
:存储数据。
sessionStorage.getItem(key);
:获取数据。
sessionStorage.removeItem(key);
:删除数据。
sessionStorage.clear();
:删除所有数据。
localStorage.setItem(key,value);
:存储数据。
localStorage.getItem(key);
:获取数据。
localStorage.removeItem(key);
:删除数据。
localStorage.clear();
:删除所有数据。