JS编程语法和基础核心知识:ECMAScript
DOM(Document Object Model)文档对象模型:W3C组织推荐的处理可扩展标记语言的标准编程接口。
通过DOM提供的接口可以对页面上的各种元素进行操作(大小、位置、颜色等)。
BOM(Browser Object Model)浏览器对象模型:提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。
通过BOM可以操作浏览器窗口,比如弹出框、控制浏览器跳转、获取分辨率等。
(一个HTML文件中既可以有行内式js、又可以有内嵌式js、还可以有外部js)
行内式
内嵌式
Document
外部js双标签
Document
alert(msg):浏览器弹出警示框
console.log(msg):浏览器控制台打印输出信息
console.dir(obj):打印元素对象,更好的查看里面的属性和方法
prompt(info):浏览器弹出输入框,用户可以输入,info是提示信息
变量声明
变量命名规范
简单数据类型
Number:数字型,包括整形和浮点型,默认值0
String:字符串类型,必须用引号括起来,默认值‘’“
因为HTML标签里属性使用的是双引号,所以JS推荐使用单引号
JS可以用单引号嵌套双引号,也可以用双引号嵌套单引号(外双内单,外单内双)
字符串转义符:\n换行符,\\斜杠,\'单引号,\"双引号,\t缩进,\b空格
检测字符串长度:’字符串‘.length
字符串拼接:字符串和其他类型拼接结果是字符串类型
prompt采集到的数据是string类型的
Boolean:布尔型,true、false等价于1、0,默认值false
Undefined:声明了变量但是没有给值,则此时变量值为undefined
Null:空值,属于object类型
复杂数据类型(引用类型):对象,如Object、Array、Date等
转换为字符串
toString():转成字符串
var num=1;
alert(num.toString());
String():强制转成字符串
var num=1;
alert(String(num));
加号拼接转成字符串:隐式转换,更推荐
var num=1;
alert(num+'');
转换为数字型
转换为布尔型
==默认有数据类型转换,===要求数据和数据类型都相等
短路运算现象:当有多个表达式(值),左边表达式值可以确定结果时,就不再继续运算右边的表达式的值
console.log(123 && 456);// 456
switch-case语句
switch(2) {
case 1:
console.log('这是1');
break;
case 2:
console.log('这是2');
break;
case 3:
console.log('这是3');
break;
default:
console.log('没有匹配结果');
}
//如果没有break,则不会退出switch,继续执行下面的case,直至遇到break
当分支较少时,if…else语句执行效率比switch语句高
当分支较多时,switch语句执行效率比if…else语句高,且结构更清晰
创建数组
获取数组元素
新增数组元素
函数
函数调用
函数返回值
arguments
立即执行函数
最大的作用是独立创建了一个作用域,里面所有的变量都是局部变量,不会有命名冲突的情况
写法一:
(function(a,b) { // 也可以加函数名
console.log(a + b);
})(1,2);
写法二:
(function(a,b) { // 也可以加函数名
console.log(a + b);
}(1,2));
预解析步骤
预解析作用范围
创建对象
利用对象字面量创建对象
var obj = {
uname: 'zsf',
age: 18,
sex: 'nan'
sayHi: function() {
console.log('Hi');
}
}
利用new Object创建对象
var obj = new Object();
obj.uname = 'zsf';
obj.age = 18;
obj.sex = 'nan';
obj.sayHi = function() {
console.log('Hi');
}
利用构造函数创建对象:构造函数中封装对象,就是把对象里面一些相同的属性和方法抽象出来封装到函数里
function Star(uname, age, sex) {
this.uname = uname;
this.age = age;
this.sex = sex;
this.sing = function(sang) {
console.log(song);
}
}
var obj = new Star('ldh', 18, 'nan');
new关键字的执行过程
调用属性
调用方法:对象名.函数名()
遍历对象
for (var k in obj) {
console.log(k); // 变量名
console.log(obj[k]); // 属性值
}
查阅MDN文档:https://developer.mozilla.org/zh-CN/
Math对象
Date() 构造函数new对象
Array() 构造函数new对象
var arr1 = new Array(); //创建了一个空数组
var arr2 = new Array(2); //创建了一个长度为2的里面有2个空元素的数组
var arr2 = new Array(2, 3); //创建了一个数组元素为2和3
Array.isArray(arr)方法:H5新增判断是否为数组的方法,与arr instanceof Array相同
push(num1, num2, …)方法:数组尾追加一个或多个新元素,返回新数组长度,原数组也会发生变化
unshift(num1, num2, …)方法:数组头追加一个或多个新元素,返回新数组长度,原数组也会发生变化
pop()方法:数组尾删除一个元素,返回删除的元素,原数组也会发生变化
shift()方法:数组头删除一个元素,返回删除的元素,原数组也会发生变化
reverse()方法:翻转数组
sort()方法:排序,只能个位数
多位数排序:
arr.sort(function(a, b) {
return b-a; //降序排序,升序是a-b
});
indexOf(num)方法:返回第一个num元素在数组中的位置,找不到返回-1
lastIndexOf(num)方法:返回第一个num元素在数组中的位置,找不到返回-1
toString()方法:将数组转换为字符串,以默认的逗号连接
join()方法:数组转换为字符串,以默认的逗号连接
join(‘-’)方法:数组转换为字符串,以指定的字符连接
concat(arr1[], arr2[], …)方法:连接两个或多个数组,不影响原数组
slice(begin, end)方法:返回被截取出来的新数组,不影响原数组
splice(begin, count)方法:从第几个开始删除几个,返回删除后得到的新数组,影响原数组
基本包装类型之String
(因为文档页面从上往下加载,所以script标签要写在要获取的网页元素的下面)
操作元素内容(如果操作的是当前元素,则element可以换成this)
操作元素属性(如果操作的是当前元素,则element可以换成this)
操作表单属性(如果操作的是当前元素,则element可以换成this)
操作元素样式属性
阻止链接跳转
document.write(‘
document.write('123');
element.innerHTML(‘
var inner = document.querySelector('.inner');
var arr = [];
for (var i = 0; i <= 100; i++) {
arr.push('123');
}
inner.innerHTML = arr.join(' ');
document.createElement(‘div’); 添加元素,不会导致页面重绘,效率低一点,结构清晰
var create = document.querySelector('.create');
for (var i = 0; i <= 100; i++) {
var d = document.createElement('div');
create.appendChild(d);
}
结点:一般结点至少拥有nodeType(结点类型)、nodeName(结点名称)和nodeValue(结点值)这三个基本属性
获取父节点:
子节点:
获取所有子节点,包括元素结点、文本节点等所有节点
获取所有子元素节点
添加子元素结点
删除子元素结点
获取兄弟结点
克隆结点
示例
//获取事件源
var btn = document.getElementById('btn');
//注册事件,添加事件处理程序
btn.onclick = function() {
alert('点秋香')
}
注册事件
传统注册方式(注册事件唯一性)
方法监听注册方式(同一元素同一事件可以注册多个监听器)
注册事件兼容性解决方案
function addEventListener(element, eventName, fn) {
//判断当前浏览器是否支持addEventListener方法
if (element.addEventListener) {
element.addEventListener(eventName, fn);
}else if (element.attachEvent) {
element.attachEvent('on' + eventName, fn);
}else {
element['on' + eventName] = fn;
}
}
删除事件
传统方式:eventTarget.onclick = null;
方法监听注册方式
element.removeEventListener(‘click’, fn); // fn不能采用匿名函数是方式
var btn = document.getElementById('btn');
btn.addEventListener('click', fn);
function fn() {
alert(22);
btn.removeEventListener('click', fn);
}
element.detachEvent(‘onclick’, fn); // fn不能采用匿名函数是方式
var btn = document.getElementById('btn');
btn.attachEvent('click', fn);
function fn() {
alert(33);
btn.detachEvent('click', fn);
}
删除事件兼容性解决方案
function removeEventListener(element, eventName, fn) {
//判断当前浏览器是否支持removeEventListener方法
if (element.removeEventListener) {
element.removeEventListener(eventName, fn);
}else if (element.detachEvent) {
element.detachEvent('on' + eventName, fn);
}else {
element['on' + eventName] = full;
}
}
常见鼠标事件
onclick:鼠标点击左键触发
onmouseover:鼠标经过自身盒子触发,经过它的子盒子也会因为冒泡现象触发
onmouseseenter:鼠标只有经过自身盒子才触发,不会冒泡
onmouseout:鼠标离开自身盒子触发,离开它的子盒子也会因为冒泡现象触发
onmouseleave:鼠标只有离开自身盒子才触发,不会冒泡
onfocus:获取鼠标焦点触发
onblur:失去鼠标焦点触发
onmousemove:鼠标移动触发
onmouseup:鼠标弹起触发
onmousedown:鼠标按下触发
禁止鼠标右键菜单
document.addEventListener('contextmenu', function(e)) {
e.preventDefault();
}
禁止鼠标选中
document.addEventListener('selectstart', function(e)) {
e.preventDefault();
}
常用键盘事件
onkeydown:按下时触发,一直按着一直触发,能识别功能键,执行顺序先
(与文本框结合使用时,触发时文字还没有落入文本框中)
onkeypress:按下时触发,一直按着一直触发,不能识别功能键,执行顺序中
(与文本框结合使用时,触发时文字还没有落入文本框中)
onkeyup:弹起时触发,每次弹起触发一次,执行顺序后
(与文本框结合使用时,触发时文字已落入文本框中,推荐)
使用示例1
var div = document.querySelector('div');
div.onclick = function(e) {
e = e || window.event; //兼容IE6~8
var target = e.target || e.srcElement; //兼容IE6~8
console.log(target); //点击哪个元素就返回哪个元素,与this的区别主要体现在冒泡场景中
console.log(this); //哪个元素绑定执行了这个事件就返回哪个元素,与e.target的区别主要体现在冒泡场景中
console.log(e.currentTarget); //跟this非常相似,IE6~8不认识
console.log(e.type); //返回事件类型,不带on
e.cancelBubble = true; //阻止冒泡,非标准,IE6~8使用
e.stopPropagation(); //阻止冒泡,标准,推荐
e.returnValue = false; //阻止默认行为,比如不让链接跳转,非标准,IE6~8使用
e.preventDefault(); //阻止默认行为,比如不让链接跳转,标准
return false; //阻止默认行为,比如不让链接跳转,没有兼容性问题,return后面的代码将不被执行,仅限于传统注册方式
}
使用示例2
var div = document.querySelector('div');
div.addEventListener('click', function(e) {
e = e || window.event; //兼容IE6~8
var target = e.target || e.srcElement; //兼容IE6~8
console.log(target); //点击哪个元素就返回哪个元素,与this的区别主要体现在冒泡场景中
console.log(this); //哪个元素绑定执行了这个事件就返回哪个元素,与e.target的区别主要体现在冒泡场景中
console.log(e.currentTarget); //跟this非常相似,IE6~8不认识
console.log(e.type); //返回事件类型,不带on
e.cancelBubble = true; //阻止冒泡,非标准,IE6~8使用
e.stopPropagation(); //阻止冒泡,标准,推荐
e.returnValue = false; //阻止默认行为,比如不让链接跳转,非标准,IE6~8使用
e.preventDefault(); //阻止默认行为,比如不让链接跳转,标准
})
鼠标事件对象属性
键盘事件对象属性
e.keyCode:返回按下按键的ASCII码值,keydown和keyup事件不区分大小写,a和A得到的都是65,keypress事件区分大小写,a得到97,A得到65,实际开发中,更多使用keydown和keyup
var search = document.querySelector('input');
document.addEventListener('keyup', function(e) {
if(e.keyCode === 83) {
search.focus(); //搜索框获取焦点
}
})
事件流三阶段(JS代码中只能执行捕获或冒泡其中的一个阶段)
事件委托、代理:将事件监听器设置在父节点上,利用冒泡原理和事件对象(下一节介绍)影响子节点,只操作一次DOM,提高程序性能
var ul = document.querySelector('ul');
ul.addEventListener('click', function(e) {
e.target.style.backgroundColor = 'pink';
}
BOM(Browser Object Model):浏览器对象模型,由一系列相关对象构成,每个对象有很多方法和属性,其核心顶级对象是window对象
window对象:一个全局对象,全局作用域中的变量和函数都会变成window对象的属性和方法,调用时可以省略,其包含的常见属性和方法有
name:window对象的一个特殊属性,控制台打印出来是空的,定义全局变量时不要取名为name
devicePixelRatio属性:物理像素比
document:window对象的一个属性,是一个对象,document文档对象
location:window对象的一个属性,是一个对象,获取或设置窗体的URL,解析URL
navigator:包含有关浏览器的信息的对象,它有很多属性,常用userAgent,该属性可以返回由客户机发送服务器的user-agent头部的值
// 判断用户哪个终端打开页面,实现跳转
if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|WOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
window.location.href = ""; // 手机端
} else {
window.location.href = ""; // PC端
}
history:与浏览器历史记录进行交互的对象,该对象包含用户在浏览器窗口访问过的URL,在实际开发中应用较少,一般在一些OA办公系统中见到
window常见事件
onload:窗口(页面)加载事件,当文档内容完全加载完成(包括图像、脚本文件、CSS文件等)会触发该事件,调用处理函数,因此可以将JS代码写到页面元素的上方
window.onload = function() {
var btn = document.querySelector('button');
btn.addEventListener('click', function() {
alert('点击我');
})
}
window.addEventListener('load', function() {
var btn = document.querySelector('button');
btn.addEventListener('click', function() {
alert('点击我');
})
});
onpageshow:这个事件在页面显示时触发,无论页面是否来自缓存。重新加载的页面onpageshow会在onload事件之后触发,根据事件对象中的persisted来判断是否是缓存中的页面触发事件
onDOMContentLoaded:窗口(页面)加载事件,仅当DOM加载完成时触发事件,不包括样式表、图片、flash等,增用户体验
window.onDOMContentLoaded = function() {
var btn = document.querySelector('button');
btn.addEventListener('click', function() {
alert('点击我');
})
}
window.addEventListener('DOMContentLoaded', function() {
var btn = document.querySelector('button');
btn.addEventListener('click', function() {
alert('点击我');
})
});
onresize:调整窗口大小事件,只要窗口大小发生像素变化,就触发该事件,经常利用这个事件结合window.innerWidth当前屏幕宽度属性完成响应式布局
window对象常用方法
执行一次的定时器
重复执行的定时器
清除定时器
JS是单线程的
HTML5允许JavaScript脚本创建多个线程,于是JS中出现了同步和异步
JS执行机制
offset系列:经常用于获取元素位置,使用offsetLeft、offsetTop属性
(获得元素距离带有定位父元素的位置,元素自身的大小等)
(offset系列可以得到任意样式表中的样式值,包含padding+border+width,返回数值不带单位)
(style只能获取行内样式值,不包含padding和border,返回数值是带单位的字符串)
(offset系列是只读属性,一般用来获取元素位置大小)
(style是可读可写属性,可以获取也可以赋值,一般用来改变元素位置大小)
client系列:经常用于获取元素大小,使用clientWidth、clientHeight属性
(获得元素边框大小,元素大小等)
(返回数值不带单位)
scroll系列:经常用于获取滚动距离,使用scrollTop、scrollLeft属性
(获得元素的大小,滚动距离等)
(返回数值不带单位)
onscroll事件:如果浏览器的度或宽度不足以显示整个页面时,会自动出现滚动条,当滚动条滚动时,页面被隐藏的高度或宽度称为页面被卷去的宽度或高度,滚动条在滚动时会触发onscroll事件,页面滚动事件要给document添加onscroll事件
页面滚动
声明了DTD(),使用document.documentElement.scrollTop
未声明DTD,使用document.body.scrollTop
IE9新方法:页面被卷去的头部用window.pageYOffset获得,页面被卷去的左侧用window.pageXOffset获得
兼容性写法:使用时写getScroll().left
function getScroll() {
return {
left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
};
}
(移动端浏览器兼容性较好,不需要考虑以前JS兼容性问题,可以放心使用原生JS书写效果)
(移动端也有自己独特的地方,比如触屏事件touch,Android和IOS都有,我试了试要用addEventListener方式添加监听)
移动端动画常用事件
移动端动画常用事件对象TouchEvent
(touchstart、touchmove、touchend三个事件都各自有自己的触摸事件对象,其中常用的属性有)
移动端动画常用元素属性
移动端click事件延时解决方案
禁用缩放
利用touch事件自己封装这个事件解决300ms延时
// 定义
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) {
if (!isMove && (Date.now() - startTime) < 150) {
callback && callback();
}
isMove = false;
startTime = 0;
});
}
// 调用
tap(div, function() {
alert(111);
});
使用fastclick插件:下载地址
将fastclick.js引入html页面
将下面的代码复制到自己的js文件中
if ('addEventListener' in document) {
document.addEventListener('DOMContentLoaded', function() {
FastClick.attach(document.body);
},false);
}
就可以直接使用click事件了,如
var div = document.querySelector('div');
div.addEventListener('click',function() {
alert(111);
})
移动端常用插件
Swiper动画插件:下载地址
superslide动画插件:下载地址
iscroll动画插件:下载地址
Bootstrap JS动画插件:中文官网
引入相关样式文件
复制HTML结构
按照需求修改相应样式及参数
zy.media.js视频插件:实现外观样式、暂停、播放、全屏等功能在各浏览器上的一致性( // 浏览器默认外观,各浏览器不一致)
(容量较大,sessionStorage约5M、localStorage约20M)
(只能存储字符串,可以将对象JSON.stringify()编码后存储)
对象与字符串相互转换
window.sessionStorage
(生命周期为关闭浏览器页面)
(在同一个页面下数据可以共享)
(以键值对的形式存储使用)
存储数据:sessionStorage.setItem(key, value);
获取数据:sessionStorage.getItem(key);
删除数据:sessionStorage.removeItem(key);
删除所有数据:sessionStorage.clear();
window.localStorage
(生命周期永久有效的,除非手动删除,否则页面关闭也会存在)
(同一浏览器的不同页面间可以共享)
(以键值对的形式存储使用)
存储数据:localStorage.setItem(key, value);
获取数据:localStorage.getItem(key);
删除数据:localStorage.removeItem(key);
删除所有数据:localStorage.clear();
(常见的JavaScript库:jQuery、Prototype、YUI、Dojo、Ext J、移动端的zepto)
$是jQuery的别称,即 $(function() {…}); 等价于 jQuery(function() {…});
$是jQuery的顶级对象,相当于原生JavaScript中的window
利用$把元素包装成jQuery对象,就可以调用jQuery的方法了
1)jQuery对象与DOM对象的转换
(显示隐藏、滑动、淡入淡出相关函数speed、easing、fn三个参数均可省略,一般都不加参数)
(speed参数用来指定切换速度,有"slow"、“normal”、“fast”、自定义毫秒值等取值)
(easing参数用来指定切换效果,有"swing"(默认)、"linear"等取值)
(fn回调函数是动画完成时执行的函数,每个元素执行一次)
显示隐藏
滑动
淡入淡出
自定义动画
animate(param, speed, easing, fn):param为想要改变元素的样式和属性,以对象形式传递,必须写,属性名可以不带引号,属性值如果不是数字必须加引号,如果是复合属性需要采取驼峰命名法
// 例:有动画的返回顶部
$("button").click(function() {
// 不能是文档而是html和body元素做动画
$("body, html").stop().animate(function() {
scrollTop: 0;
});
});
动画队列
each()函数:遍历元素,对一组元素做不同的操作
$("div").each(function(index, domEle){
console.log(index);
console.log(domEle);
});
$each()函数:遍历任何对象,主要处理数组对象等数据
$.each({name: "andy", age: 18}, function(i, ele){
console.log(i);
console.log(ele);
});
$.each(["red", "green", "blue"], function(i, ele){
console.log(i);
console.log(ele);
});
创建元素:$(“
添加元素
删除元素
获取或设置元素尺寸操作
(参数为空则是获取相应值,返回数字型)
(如果参数为数字,则是修改相应值)
(参数可以不写单位)
offset()函数获取或设置元素偏移
(相对于文档的偏移坐标,跟父级没有关系)
position()函数获取元素偏移
(相对于带有定位的父元素的偏移坐标,如果父级都没有定位,则以文档为准)
(只能获取,不能设置)
scrollTop()、scrollLeft()设置或获取元素被卷去的头部和左侧
单个事件注册
click鼠标点击事件:如$(“button”).click(function() {…});
change事件:如$(“.j-checkbox”).change(function() {…});
scroll事件:如$(window).scroll(function() {…});
mouseover、mouseout鼠标经过、离开事件(有冒泡):如$(“.nav>li”).mouseover(function() {…});
mouseenter、mouseleave鼠标经过、离开事件(无冒泡):$(“.nav>li”).mouseenter(function() {…});
hover:就是鼠标经过和离开的复合写法
如果只写一个函数,则鼠标经过和离开都会触发这个函数:如$(“div”).hover(function() {…});
如果写两个函数,则第一个鼠标经过触发(相当于mouseenter),第二个鼠标离开触发(相当于mouseleave):如$(“div”).hover(function() {…}, function() {…});
其他的还有keydown、keyup、blur、focus、resize事件等等,与原生JS基本一致
on()方法一个或多个事件注册:在匹配元素上绑定一个或多个事件
one()方法:给元素注册触发一次的事件
off()方法:移除通过on()方法绑定的事件
自动触发事件
简写形式:$(“div”).click();
trigger()方法:$(“div”).trigger(“click”); // 会触发元素的默认行为
triggerHandler()方法:$(“div”).triggerHandler(“click”); // 不会触发元素的默认行为
jQuery事件对象
$("div").on("click", function(event) {
console.log(event);
});
$.extend():将一个对象合并给另外一个对象
第一个参数:如果是true为深拷贝(将被拷贝对象中复杂数据类型的地址拷贝给目标对象,如果复杂数据类型中的数据有冲突则相当于覆盖了目标对象原来的数据),false为浅拷贝(完全克隆,拷贝的是对象不是地址,如果复杂数据类型中的数据有冲突,则会合并到一起),可以省略,默认false
第二个参数:目标对象
第二个参数:被拷贝的第一个对象
第N个参数:被拷贝的第N个对象
jQuery常用插件及网站
jQuery插件使用步骤
Bootstrap框架:最受欢迎的HTML、CSS、JS框架,用于开发响应式布局、移动设备优先的WEB项目
Bootstrap框架中jQuery插件使用步骤