JavaScript
是世界上最流行的语言之一,是一种运行在客户端的脚本语言.
脚本语言:
不需要编译,运行过程中由js解释器(js引擎)
逐行来进行解释并执行,现在也可以基于Node.js
技术进行服务器端编程.
浏览器分成两部分:
渲染引擎和JS引擎.
渲染引擎:
HTML
与CSS,
俗称内核,比如chrome
浏览器的blink,老版本的webkit.JS引擎:
JavaScript
代码,对其处理后运行,比如chrome
浏览器的V8.注意:
浏览器本身并不会执行JS代码,而是通过内置JavaScript
引擎(解释器)来执行JS代码.JS引擎执行代码时逐行解释每一句源码(转换为机器语言),然后由计算机去执行,所以JavaScript
语言归为脚本语言,会逐行解释执行.
graph TB
a1-->b1["ECMAScript 语法"]
a1["JavaScript"]-->b2["DOM页面文档对象模型"]
a1-->b3["BOM浏览器对象模型"]
ECMAScript是由ECMA国际(原欧洲计算机制造商协会)进行标准化的一门编程语言,这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实际上后两者是ECMAScript语言的实现和扩展.
注意:
ECMAScript规定了JS的编程语法和基础核心知识,是所有浏览器厂商共同遵守的一套JS语法工业标准.
文档对象模型( Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言的标准编程接口.通过DOM提供的接口可以对页面上的各种元素进行操作(大小、位置、颜色等).
BOM(Browser ObjectModel,简称BOM)是指浏览器对象模型,它提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。通过BOM可以操作浏览器窗口,比如弹出框、控制浏览器跳转、获取分辨率等.
代码演示:
javascript<input type="button" value="按钮" onclick="alert("信息!")">
代码演示:
javascript<script>
alert("信息!");
</script>
代码演示:
javascript//HTML
<script src="外部JS.js"></script>
//外部JS.js
alert("信息!")
javascript// 1.单行注释 ctrl + /
/*
2.多行注释 shift + alt + a
*/
语法:var age;
javascript中变量声明为自动变量,无需指定变量类型.
var age = 10,name = 'YS';
声明多个变量.
Number
数字型,包含整型值和浮点型值,如21,0.21Boolean
布尔值类型,如true
,false
,等价于1和0String
字符串类型,如"张三”注意咱们js里面,字符串都带引号Undefined
声明了变量a但是没有给值,var a;
此时:a = undefined
Null
声明了变量a为空值var = null;
代码演示:
javascriptvar num1 = 07; //八进制
var num2 = 7; //十进制
var num3 = 0x7;//十六进制
注意:
在JS中八进制前面加0,十六进制前面加0x
最大值:Number.MAX_VALUE
最小值:Number.MIN_VALUE
lnfinity
,代表无穷大,大于任何数值.
-Infinity
,代表无穷小,小于任何数值.
NaN
,Not a number,代表一个非数值.
isNaN()
这个方法用来判断非数字―并且返回一个值如果是数字返回的是 false
如果不是数字返回的是true
.
字符串型可以是引号中的任意文本,其语法为双引号" "和单引号' '.
因为HTML标签里面的属性使用的是双引号,Javascript更推荐使用单引号.
代码演示:
javascriptvar s = '这是一个"字符串"!!!'; //外单内双
var s = "这是一个'字符串'!!!"; //外双内单
转义符都是\开头的,常用的转义符及其说明如下:
转义符 | 解释说明 |
---|---|
\n | 换行符,n是newline的意思 |
\ \ | 斜杠\ |
\' | '单引号 |
\" | ”双引号 |
\t | tab缩进 |
\b | 空格,b是blank 的意思 |
length属性
可以获取整个字符串的长度.+
进行拼接,其拼接方式为字符串+任何类型=拼接之后的新字符串
字符串与变量相加:
javascriptvar num = 12;
console.log('字符串'+num+'字符串');
输出结果: 字符串12字符串
true
和false
,其中 true
表示真(对),而false
表示假(错).javascript//与字符串类型结合
//undefined
var variable = undefined;
var s1 = variable + '类型'; //s1 = undefined类型
var num1 = variable + 1; //num1 = NaN
console.log(s1);
console.log(num1);
//null
var space = null;
var s2 = space + '类型'; //s2 = null类型
var num2 = space + 1; //num2 = 1;
console.log(s2);
console.log(num2);
输出结果: undefined类型 NaN null类型 1
代码演示:
javascriptvar num = 10;
console.log(typeof num);
var str = '字符串';
console.log(typeof str);
var flag = true;
console.log(typeof flag);
var nul = null;
console.log(typeof nul);
var vari = undefined;
console.log(typeof vari);
输出结果: number string boolean object undefined
即常量.
常见的3种转换方式:
代码演示:
javascript//使用toString()
var num = 10;
console.log(typeof num);
console.log(typeof num.toString());
输出结果: number string
javascript//使用String()
var num = 10;
console.log(typeof num);
console.log(typeof String(num));
输出结果: number string
javascript//使用 + 空字符串转换成字符串型 隐式转换
var num = 10;
console.log(typeof num);
console.log(typeof (num+''));
输出结果: number string
使用parseInt()
转换为整数型, 对小数取整,对带单位数自动去单位
使用parseFloat()
转换为浮点型,对带单位数自动去单位
使用Number()
转换为数字型.
使用算数运算转换为数字型,即隐式转换.
Boolean()
转换false
:' '
, 0
, NaN
, null
, undefined
true
: '字符串'
, 123
+
,-
,*
,/
,%
代码演示:
javascriptconsole.log(2-1);
console.log(2*1);
console.log(2/1);
console.log(4%3);
输出结果: 1 2 2 1
代码演示:
javascriptconsole.log(0.1+0.2);
console.log(0.07*100);
输出结果: 0.30000000000000004 7.000000000000001
++
递增运算符--
递减运算符++a;
前置递增运算符,--a
前置递减运算符a++
后置递增运算符,a--
后置递减运算符>
,小于<
,大于等于>=
,小于等于<=
,等于==
,不等!=
,全(不)等(数据类型和值都相等)=== ,!==
&&
,逻辑或||
,逻辑非!
短路运算的原理:
语法:如果表达式1为真 则返回表达式2;如果表达式1为假 则返回表达式1
代码演示:
javascriptconsole.log(100 && 200);
console.log(0 && 100);
console.log(0 && 21*312 +92130); //运算中断
输出结果: 200 0 0
语法:如果表达式1为真 则返回表达式1;如果表达式1为假 则返回表达式2
javascriptconsole.log(100 || 200);
console.log(0 || 100);
console.log(0 || 21*312 +92130);
console.log(0 || 21*312 +92130 || 9*13); //逻辑中断
输出结果: 100 100 98682 98682
=
,加上+=
,减去-=
,乘上*=
,除去/=
,取模%=
.优先级 | 运算符 | 顺序 |
---|---|---|
1 | 小括号 | ( ) |
2 | 一元运算符 | ++-- ! |
3 | 算数运算符 | 先*/%后+- |
4 | 关系运算符 | >>= <<= |
5 | 相等运算符 | == !====!== |
6 | 逻辑运算符 | 先&&后ll |
7 | 赋值运算符 | = |
8 | 逗号运算符 | , |
流程控制主要有:
顺序结构
分支结构
循环结构
语法:
javascript//单分支结构
if(条件表达式) //条件表达式为真,执行代码块,为假,不执行
{
//代码块
}
//双分支结构
if(条件表达式) //条件表达式为真,执行代码块1,为假,执行代码块2
{
//代码块1
}
else
{
//代码块2
}
//多分支,不写了...
语法:
javascriptswitch(表达式)
{
case 值1:
执行语句1;
break;
case 值2:
执行语句2;
break;
...
default:
最后的语句;
}
注意:
case
内的值全等 (即**"==="**);语法:条件表达式 ? 表达式1 : 表达式2
语法:
javascriptfor(初始化变量;条件表达式;操作表达式)
{
//循环体
}
语法:
javascriptwhile(条件表达式)
{
//循环体
}
语法:
javascriptdo
{
//循环体
}while(条件表达式)
功能描述:
continue
关键字用于立即跳出本次循环,继续下一次循环.语法:
javascriptfor(var i=0;i<5;i++)
{
if(i == 3)
{
continue
}
console.log(i);
}
输出结果: 0 1 2 4
功能描述:
break
关键字用于立即跳出整个循环.语法:
javascriptfor(var i=0;i<5;i++)
{
if(i == 3)
{
break;
}
console.log(i);
}
输出结果: 0 1 2
语法:
javascriptvar arr = new Array(); //创建了一个空数组
语法:
javascriptvar arr1 = []; //创建了一个空数组
var arr2 = [1,'字符串',true] //创建并初始化数组
数组名.length
可以得到数组元素的数量.语法:
javascriptvar arr = [1,4,23,43,'字符串',321,true];
for(var i=0;i<arr.length;i++)
{
console.log(arr[i]);
}
输出结果: 1 4 23 43 字符串 321 true
length
增加数组长度代码演示:
javascriptvar arr = [1,4,23,43,'字符串',321,true];
for(var i=0;i<arr.length;i++)
{
console.log(arr[i]);
}
arr.length = 9;
arr[7] = 1;
arr[8] = false;
console.log('--------------修改后----------------')
for(var i=0;i<arr.length;i++)
{
console.log(arr[i]);
}
输出结果: 1 4 23 43 字符串 321 true --------------修改后---------------- 1 4 23 43 字符串 321 true 1 false
**函数:**就是封装了一段可被重复调用执行的代码块.通过此代码块可以实现大量代码的重复使用.
语法:
javascriptfunction 函数名(形参1,形参2,...)
{
/*
**代码块**
*/
}
语法:var func = function(){}
调用:函数名(参数1,参数2,...);
注意:
func
是变量名,不是函数名.
func
中储存了函数的代码
语法:
javascript函数名(参数1,参数2,...);
语法:(function(形参1,形参2,...){})(实参1,实参2,...);
语法:(function(形参1,形参2,...){}(实参1,实参2,...));
function 函数名(形参1,形参2,...){}
在声明函数的小括号里面是 形参.
函数名(实参1,实参2,...);
在函数调用的小括号里面是 实参.
arguments:
arguments
来获取.在JavaScript
中,arguments
实际上它是当前函数的一个内置对象.所有函数都内置了一个arguments
对象,arguments对象中存储了传递的所有实参.使用arguments:
javascriptfunction func()
{
console.log(arguments);
}
func(1,2,3);
输出结果: Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
注意:argument
为伪数组.具有数组的:
length
属性没有数组的一些方法如:pop()
,push()
等.
语法:
javascriptfunction 函数名()
{
return 返回值;
}
注意:
return
只能返回一个值.可以用数组传递多个值.return
,则返回undefined
.语法:
javascriptfunction func()
{
for(var i=0;i<=10;i++)
{
console.log(i);
if(i==4)return;
}
}
func();
输出结果: 0 1 2 3 4
javascript
中作用域分为:
概念:
script
标签,或者是一个单独的js
文件.概念:
概念:
概念:
块级作用域:{}
概念:
JavaScript
代码是由浏览器中的JavaScript
解析器来执行的.JavaScript
解析器在运行JavaScript
代码的时候分为两步:
预解析
代码执行
预解析:js
引擎会把js
里面所有的变量和函数提升到当前作用域的最前面.
**代码执行:**从上往下执行.
变量预解析(变量提升)就是把所有的变量声明提升到当前的作用域最前面而不进行赋值操作.
代码演示:
javascriptfunction func()
{
console.log(num);
}
var num = 11;
//在js引擎解析后相当于
var num;
function func()
{
console.log(num);
}
num = 11;
//所以输出值应该为undefined
func();
var func = function()
{
console.log(1);
}
//在js引擎解析后相当于
var func();
func();
func = function()
{
console.log(1);
}
//此时出现函数未定义的错误
函数预解析(函数提升)就是把所有的函数声明提升到当前作用域的最前面不调用函数
代码演示:
javascriptfunc();
function func()
{
console.log(1);
}
//在js引擎解析后相当于
function func()
{
console.log(1);
}
func();
概念:对象是由属性和方法组成的.
JavaScript
中的对象分为3种:
自定义对象
内置对象
浏览器对象
前面两种对象是JS基础内容,属于ECMAScript
;第三个浏览器对象属于JS
独有.
在JavaScript
中,现阶段我们可以采用三种方式创建对象(object):
**对象字面量:**在花括号{}
里面包含了表达这个对象的属性和方法.
键 属性名: 值 属性值
语法:
javascriptvar obj = {
name : '张三',
age : 18,
sex : '男',
func: function()
{
console.log(obj.name);
console.log(obj.age);
console.log(obj.sex);
}
}
//调用对象成员函数
obj.func();
输出结果: 张三 18 男
语法:
javascriptvar obj = new Object();
obj.name = '张三';
obj.age = 18;
obj.sex = '男';
obj.func = function()
{
console.log(obj.name);
console.log(obj.age);
console.log(obj.sex);
}
obj.func();
输出结果: 张三 18 男
语法:
javascriptfunction 构造函数名(值1,值2,...)
{
this.属性1 = 值1;
this.属性2 = 值2;
...
this.方法 = function()
{
}
}
var obj = new 构造函数名(值1,值2,...);
注意:
语法:
对象名.属性名
对象名['属性名']
,此方法不可调用对象成员函数使用for..in
语句遍历对象
语法:
javascriptfor(var k in obj)
{
console.log(k); //k 变量输出的是 属性名
console.log(obj[k]);//obj[k]得到的是属性名
}
for..in
变量习惯使用k
或者key
概念:内置对象就是指JS语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)
常见用法:
语法:
javascript//使用数组字面量创建
var arr = [1,2,3]
console.log(arr);
javascript//使用new Array()
var arr1 = new Array(2); //指定数组长度为2
var arr2 = new Array(1,2,3)//等价于[1,2,3]
方法名 | 说明 | 返回值 |
---|---|---|
push(参数1...) | 末尾添加一个或多个元素,注意修改原数组 | 并返回新的长度 |
pop() | 删除数组最后一个元素,把数组长度减1无参数、修改原数组 | 返回它删除的元素的值 |
unshift(参数1...) | 向数组的开头添加一个或更多元素,注意修改原数组 | 并返回新的长度 |
shift() | 删除数组的第一个元素,数组长度减1无参数、修改原数组 | 并返回第一个元素的值 |
方法名 | 说明 | 返回值 |
---|---|---|
indexOf() | 数组中查找给定元素的第一个索引 | 如果存在返回索引号如果不存在,则返回-1。 |
lastIndexOf() | 在数组中的最后一个的索引 | 如果存在返回索引号如果不存在,则返回-1。 |
方法名 | 说明 | 返回值 |
---|---|---|
toString() | 把数组转换成字符串,逗号分隔每一项 | 返回一个字符串 |
join('分隔符') | 方法用于把数组中的所有元素转换为一个字符串。 | 返回一个字符串 |
使用Math对象可以直接使用匿名对象
Math.abs(x)
函数返回一个数字的绝对值
Math.ceil()
函数总是四舍五入并返回大于等于给定数字的最小整数。
Math.floor()
函数总是返回小于等于一个给定数字的最大整数。
Math.round()
函数返回一个数字四舍五入后最接近的整数。
Math.trunc()
方法会将数字的小数部分去掉,只保留整数部分。
Math.max()
函数返回作为输入参数的最大数字,如果没有参数,则返回 -Infinity
。
Math.min()
函数返回作为输入参数的数字中最小的一个,如果没有参数,则返回 Infinity
。
Math.pow()
函数返回基数(base
)的指数(exponent
)次幂,即 base^exponent
。
Math.sqrt()
函数返回一个数的平方根
Math.random()
函数返回一个浮点数,伪随机数在范围从0 到小于1,也就是说,从 0(包括 0)往上,但是不包括 1(排除 1),然后您可以缩放到所需的范围。实现将初始种子选择到随机数生成算法;它不能被用户选择或重置。
jslet timer = new Date()
jstimer.getFullYear() //getFullYear() 方法根据本地时间返回指定日期的年份。
jstimer.getMonth() //根据本地时间,返回一个指定的日期对象的月份,为基于 0 的值(0 表示一年中的第一月)。
jstimer.getDate() //根据本地时间,返回一个指定的日期对象为一个月中的哪一日(从 1--31)。
jstimer.getDay() //getDay() 方法根据本地时间,返回一个具体日期中一周的第几天,0 表示星期天。
jstimer.getHours() //getHours() 方法根据本地时间,返回一个指定的日期对象的小时。返回一个 0 到 23 之间的整数值。
jstimer.getMinutes() //getMinutes() 方法根据本地时间,返回一个指定的日期对象的分钟数。返回一个 0 到 59 的整数值。
jstimer.getSeconds() //getSeconds() 方法根据本地时间,返回一个指定的日期对象的秒数。该方法返回一个 0 到 59 的整数值。
jstimer.getMiliseconds() //getMilliseconds() 方法,根据本地时间,返回一个指定的日期对象的毫秒数。 0 到 999 的整数。
常见方法:
语法:
javascriptvar str = 'test';//此处发生了基本数据类型的包装
indexof()
方法相同注意:
方法名 | 说明 |
---|---|
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('分隔符')
将字符串转化为数组
语法:toUpperCase()
转化为大写 ; toLowerCase()
转换为小写
概念:
过程:
javascript// 1. 创建一个临时string类型变量
var temp = new String('test');
// 2. 将临时变量赋值给str
str = temp;
// 3. 销毁这个临时变量
temp = null;
语法:
javavar arr = [];
console.log(arr instanceof Array)
输出结果: true
简单类型又叫做基本数据类型或者值类型
值类型:
string
, number
, boolean
, null
)null
是Object
类型,是一个空对象.复杂类型又叫做引用类型
引用类型:
new
关键字创建的对象(系统对象、自定义对象),如Object
、Array
、Date
等.栈:
堆:
注意:JavaScript
中没有堆栈的概念,操作系统在javascript
中的概念即浏览器的javascript解释器
API概念:
即对程序员提供的一些功能,使其能轻松的完成工作
Web API概念:
概念:
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言(HTML或者XML )的标准编程接口.
W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式.
文档:
document
表示元素:
element
表示节点:
node
表示.DOM把文档,元素,节点都看作对象.
获取元素的几种方法:
语法:
getElementByld()
方法可以获取带有ID
的元素对象。返回值:
语法:
getElementsByTagName()
方法可以返回指定标签名的对象的集合.返回值:
document.getElementsByClassName( '类名');
//根据类名返回元素对象集合返回值:
方法 | 描述 |
---|---|
document.querySelector('选择器'); | 根据指定选择器返回第一个元素对象 |
document.querySelector('.类名'); | 根据指定选择器返回第一个元素对象 |
document.querySelector('#id'); | 根据指定选择器返回第一个元素对象 |
document.querySelectorAll('选择器'); | 根据指定选择器返回所有元素对象. |
语法:
document.body
返回值:
body
元素语法:
document.documentElement
返回值:
html
元素JavaScript
使我们有能力创建动态页面,而事件是可以被JavaScript
侦测到的行为.触发响应的机制
概念:
也叫事件三要素.
代码演示:
javascript//1.事件源
var btn = document.getElementById('btn');
//2.事件类型
//点击,经过,按键按下.....
//3.事件处理程序
btn.onclick = function()
{
alert('信息');
}
鼠标事件 | 触发条件 |
---|---|
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfocus | 获得鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
JavaScript
的DOM
操作可以改变网页内容、结构和样式,我们可以利用DOM
操作元素来改变元素里面的内容、属性等.
element.innerText
element.innerHTML
innerText
和innerHTML
标签内容src
和href
文件源id
,alt
,tiltle
选择器,提示文本,标题使用DOM来操作下面元素的属性:
type、value、checked、selected、disabled
value
来修改的.disabled
.onfocus
获得焦点obbulr
失去焦点element.style
行内样式操作
element.className
类名样式操作
代码演示:
javascript//样式名采取驼峰命名法
element.style.backgrouudColor = red;
//行内样式,权重高
代码演示:
html<style>
.change
{
background-color = rgb(23,42,23);
border: 0;
}
</style>
<div>demo</div>
<script>
var p = document.querySelector('div');
p.onclick = function()
{
this.className = 'change';
// 此处修改div类名
}
</script>
注意:
使用className
会直接覆盖原先的元素类名, 要想保留原先类名可以使用多类名选择器.
代码演示:
html<div class="first">demo</div>
<script>
var p = document.querySelector('div');
p.className = 'first change';//此处为多类名选择器
</script>
使用遍历相同元素的方法,在jQuery
库中可以使用siblings
代码演示:
html<style>
button
{
background-color: aqua;
border: 0;
}
</style>
<div>
<button>按钮</button>
<button>按钮</button>
<button>按钮</button>
<button>按钮</button>
</div>
<script>
var btns = document.getElementsByTagName("button");
for(var i = 0;i<btns.length;i++){
btns[i].onclick = function(){
for(var j=0;j<btns.length;j++){
//将其他按钮背景颜色清空
btns[j].style.backgroundColor='';
}
//设置按钮背景颜色
this.style.backgroundColor='red';
}
}
</script>
语法:
element.属性
获取属性值
element.getAttribute('属性')
获取自定义属性值
区别:
element.属性
获取内置属性值(元素本身自带的属性)element.getAttribute('属性');
主要获得自定义的属性(标准)我们程序员自定义的属性.语法:
element.属性 = '值'
设置内置属性值
element.setAttribute('属性','值')
设置自定义属性值
element.removeAttribute('属性')
移除自定义属性值
代码演示:
html<style>
.tab
{
position: absolute;
top: 100px;
left: 100px;
height: 170px;
width: 500px;
padding: 20px;
border: 1px rgb(21, 31, 21) solid;
}
li
{
background-color: aqua;
list-style: none;
}
.current
{
background-color: red;
}
.item
{
display: none;
}
</style>
<body>
<div class="tab">
<div class="tab_list">
<ul>
<li class="current">商品介绍</li>
<li>规格和包装</li>
<li>售后与保障</li>
<li>商品评价</li>
<li>手机社区</li>
</ul>
</div>
<div class="tab_on">
<div class="item" style="display: block;">
商品介绍模块
</div>
<div class="item">
规格和包装模块
</div>
<div class="item">
售后与保障模块
</div>
<div class="item">
商品评价模块
</div>
<div class="item">
手机社区模块
</div>
</div>
</div>
<script>
var li = document.querySelectorAll('li');
var item = document.querySelectorAll('.item');
for(var i =0;i<li.length;i++)
{
li[i].setAttribute('index',i);
li[i].onclick = function()
{
for(var j=0;j<li.length;j++)
{
li[j].className = '';
}
this.className = 'current';
var index = this.getAttribute('index');
for(var x = 0;x<item.length;x++)
{
item[x].style.display = 'none';
}
item[index].style.display = 'block';
}
}
</script>
</body>
自定义属性:
getAttribute(属性)
获取.H5规定自定义属性data-
开头做为属性名并且赋值.
比如<div data-index= “1" ></div>
兼容性获取自定义属性方法:
element.getAttribute('data-index');
**H5新增(ie11以上支持)**获取自定义属性方法:
element.dataset.index
或者element.dataset[ 'index’]
代码演示:
html<div data-index="1">demo</div>
<script>
var d = document.querySelector('div');
console.log(d.getAttribute('data-index'));
console.log(d.dataset.index);
console.log(d.dataset['index']);
</script>
className
获取或设置指定元素的 class
属性的值。
jslet box = document.querySelector(".box");
console.log(box.className);
Element.classList
是一个只读属性,返回一个元素 class
属性的动态 DOMTokenList
集合。这可以用于操作 class 集合。
与className的区别:
element.className
作为以空格分隔的字符串来使用,classList
是一种更方便的访问元素的类列表的方法。成员方法:
方法 | 描述 |
---|---|
add(Token,...) | 将给定的标记添加到列表中。 |
remove(Token,....) | 从 DOMTokenList 中移除指定标记 |
replace(oldToken,newToken) | 可以将列表中一个已存在的 token 替换为一个新 token。如果第一个参数 token 在列表中不存在, replace() 立刻返回false ,而不会将新 token 字符串添加到列表中。 |
toggle(Token) | 从列表中删除一个给定的标记并返回 false 。如果标记不存在,则添加并且函数返回 true 。 |
contains(Token) | 传入的参数 token 包含在列表中时则返回true ,否则返回 false 。 |
概念:
node
来表示.HTML
DOM树中的所有节点均可通过JavaScript
进行访问,所有HTML
元素(节点)均可被修改,也可以创建或删除.nodeType
(节点类型)、nodeName
(节点名称)和nodeValue
(节点值)这三个基本属性.概念:
语法:
html<div class = "box">
<span class = "erweima"></span>
</div>
<script>
var erweima = document.querySelector('.erweima');
console.log(erweima.parentNode);//即document.querySelector('.box');
</script>
语法:
element.childNodes
(标准)返回值:
语法:
element.children
(非标准,广泛支持)返回值:
语法:
element.firstChild
element.firstElementChild
返回值:
语法:
element.lastChild
element.lastElementChild
返回值:
注意:
element.firstElementChild
和element.lastElementChild
在IE9以上才支持.语法:
element.nextSibling
返回当前元素的下一个兄弟节点,找不到则返回null
.同样,也是包含所有的节点.
element.previousSibling
返回当前元素的上一个兄弟节点,找不到则返回null
.同样,也是包含所有的节点.
element.nextElementSibling
返回当前元素的下一个兄弟节点,找不到则返回null
.
element.previousElementSibling
回当前元素的上一个兄弟节点,找不到则返回null
.
语法:
document.createElement('li');
创建元素节点语法:
node.appendChild(child)
添加元素节点,追加节点
node.insertBefore(child,指定元素)
在指定元素前插入元素
语法:
node.removeChild(node.children[0]);
删除元素节点代码演示:
html<style>
li{
list-style: none;
background-color: azure;
width: 170px;
border: 1px rgb(21, 32, 12) solid;
border-radius: 2px;
}
li a{
float: right;
}
</style>
<body>
<textarea name="" id="" cols="30" rows="10"></textarea>
<button class="post">发布</button>
<ul>
</ul>
<script>
var btn = document.querySelector('.post');
var text = document.querySelector('textarea');
var ul = document.querySelector('ul');
btn.onclick = function()
{
if(text.value == '');
else
{
var li = document.createElement('li');
li.innerHTML = text.value+"<a class='delete' href='javascript:;'>删除</a>";
ul.insertBefore(li,ul.children[0]);
var as = document.querySelectorAll('.delete');
for(var i =0;i<as.length;i++)
{
as[i].onclick = function()
{
this.parentNode.remove();
}
}
}
}
</script>
</body>
语法:
node.cloneNode()
方法返回调用该方法的节点的一个副本.也称为克隆节点/拷贝节点.注意:
false
,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点.代码演示:
html<style>
table {
width: 500px;
margin: 100px auto;
border-collapse: collapse;
text-align: center;
}
td,th {
border: 1px solid #333;
}
thead tr {
height: 40px;
background-color: #ccc;
}
</style>
<body>
<table cellspacing="0">
<thead>
<tr>
<th>姓名</th>
<th>科目</th>
<th>成绩</th>
<th>操作</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<script>
//准备数据
var datas = [{
name: '魏璎珞',
subject: 'JavaScript',
score: 100
}, {
name: '弘历',
subject: 'JavaScript',
score: 98
}, {
name: '傅恒',
subject: 'JavaScript',
score: 99
}, {
name: '明玉',
subject: 'JavaScript',
score: 88
}, {
name: '大猪蹄子',
subject: 'JavaScript',
score: 0
}];
//获取表体
var tbody = document.querySelector('tbody');
//双层嵌套循环添加表格
for(var i in datas)
{
//添加表行
var tr = document.createElement('tr');
tbody.appendChild(tr);
//添加表格(遍历datas变量)
for(var k in datas[i])
{
var td = document.createElement('td');
td.innerHTML = datas[i][k];
tr.appendChild(td);
}
//追加删除标签
var td = document.createElement('td');
td.innerHTML = "<a class='delete' href='javascript:;'>删除</a>";
tr.appendChild(td);
}
//获取所有删除标签
var as = document.querySelectorAll('.delete');
for(var i =0 ;i<as.length;i++)
{
as[i].onclick = function()
{
//此处获取删除标签的行表格(tr),即parentNode.parentNode.
tbody.removeChild(this.parentNode.parentNode);
}
}
</script>
</body>
document.write()
element .innerHTML
document.createElement()
面试问题:使用innerHTML
和createElement
谁的效率高?
innerHTML
采取数据拼接的方法,会比createElement
效率高代码演示:
javascriptvar array = [];
for(var i = 0;i<1000;i++)
{
array.push('<divstyle="width:100px; height:2px; border:1px solid blue;></div>');
}
//在页面中添加
document.body.innerHTML = array.join('');//join()分割数组
注册事件有两种方式:
传统注册方式:
利用on
开头的事件onclick
<button onclick= "alert('hi~')" ></button>
btn.onclick = function(){}
特点:注册事件的唯一性
同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数
方法监听注册方式:
addEventListener()
它是一个方法attachEvent()
代替语法:
eventTarget.addEventListener(type,listener[, useCapture])
使用:
eventTarget.addEventListener()
方法将指定的监听器注册到eventTarget
(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数.该方法接收三个参数:
click
、mouseover.
语法:
eventTarget.attachEvent(eventNameWithOn,callback)
用法:
eventTarget.attachEvent ()
方法将指定的监听器注册到eventTarget
(目标对象)上,当该对象触发指定的事件时,指定的回调函数就会被执行.该方法接收两个参数:
onclick
、onmouseover
,这里要带on.注意:
attachEvent
代码演示:
javascriptfunction 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] = fn;
}
}
兼容性处理的原则:
语法:
eventTarget.onclick = null;
代码演示:
html<div>1</div>
<script>
var div = document.querySelector('div');
div.onclick = function()
{
alert(1);
div.onclick = null;
}
</script>
语法:
eventTarget.removeEventListener(type,listener[,useCapture]);
代码演示:
html<div>1</div>
<script>
var div = document.querySelector('div');
div.addEventListener('click',fn);
function fn()
{
alert(1);
div.removeEventListener('click',fn);
}
</script>
语法:
eventTarget.detachEvent(eventNamewithon,callback);
代码演示:
javascriptfunction 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事件流分为3个阶段:
事件冒泡:
事件捕获:
注意:
Js 代码中只能执行捕获或者冒泡其中的一个阶段.
onclick
和attachEvent
只能得到冒泡阶段。
addEventListener(type,listener[,useCapture])
第三个参数如果是true
,表示在事件捕获阶段调用事件处理程序;如果是false (不写默认就是false
),表示在事件冒泡阶段调用事件处理程序.
实际开发中我们很少使用事件捕获,我们更关注事件冒泡.
有些事件是没有冒泡的,比如onblur
、onfocus
、onmouseenter
、onmouseleave
代码演示:
html
官方解释:
event
对象代表事件的状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态.简单理解:
event,
它有很多属性和方法.代码演示:
javascripteventTarget.onclick = function(event){}
eventTarget.addEventListener('click',function(event){})
//event是事件对象,在此作为形参
事件对象属性方法 | 说明 |
---|---|
e.target | 返回触发事件的对象,标准 |
e.srcElement | 返回触发事件的对象,非标准 ie6-8使用 |
e.type | 返回事件的类型比如click mouseover不带on |
e.cancelBubble | 该属性阻止冒泡非标准ie6-8使用 |
e.returnValue | 该属性阻止默认事件(默认行为)非标准 ie6-8使用比如不让链接跳转 |
e.preventDefault() | 该方法阻止默认事件(默认行为)标准比如不让链接跳转 |
e.stopPropagation() | 阻止冒泡标准 |
事件委托:
jQuery
里面称为事件委派.事件委托的原理:
事件委托的作用:
代码演示:
html<body>
<ul>
<li>demo1</li>
<li>demo2</li>
<li>demo3</li>
<li>demo4</li>
<li>demo5</li>
</ul>
<script>
//事件委托原理,给父节点添加侦听器,利用事件冒泡影响每一个子节点
var ul = document.querySelector('ul');
var i = 0;
ul.addEventListener('click',function(e)
{
console.log(i);
//排他思想
for(var x = 0;x<ul.children.length;x++)
{
this.children[x].style.backgroundColor = '';
}
//事件对象
e.target.style.backgroundColor = 'red';
i++;
})
</script>
</body>
鼠标事件 | 触发条件 |
---|---|
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfocus | 获得鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
contextmenu
主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单.
javascriptdocument.addEventListener('contextmenu',function(e)
{
e.preventDefault();
})
selectstart
开始选中.
javascriptdocument.addEventListener('selectstart',function (e)
{
e. preventDefault();
})
event
对象代表事件的状态,跟事件相关的一系列信息的集合.
主要有:
MouseEvent
KeyboardEvent
鼠标事件对象 | 说明 |
---|---|
e.clientX | 返回鼠标相对于浏览器窗口可视区的X坐标 |
e.clientY | 返回鼠标相对于浏览器窗口可视区的Y坐标 |
e.pageX | 返回鼠标相对于文档页面的X坐标IE9+支持 |
e.pageY | 返回鼠标相对于文档页面的Y坐标IE9+支持 |
e.screenX | 返回鼠标相对于电脑屏幕的×坐标 |
e.screenY | 返回鼠标相对于电脑屏幕的Y坐标 |
代码演示:
html<style>
div{
position: absolute;
top : 2px;
left: 2px;
width: 100px;
height: 100px;
background-color: aqua;
}
</style>
<body>
<div></div>
<script>
var div = document.querySelector('div');
document.addEventListener('mousemove',function(e)
{
// div.style.height 无效?
div.style.left = e.pageX - div.offsetWidth/2 + 'px';
div.style.top = e.pageY -div.offsetHeight/2 + 'px';
})
</script>
</body>
当鼠标移动到元素上时就会触发mouseenter
事件,类似mouseover
,它们两者之间的差别是:
mouseover
鼠标经过自身盒子会触发,经过子盒子还会触发.
mouseenter
只会经过自身盒子触发.
之所以这样,就是因为**mouseenter
不会冒泡**
跟mouseenter
搭配鼠标离开mouseleave
同样不会冒泡
键盘事件 | 触发条件 |
---|---|
onkeyup | 某个键盘按键被松开时触发 |
onkeydown | 某个键盘按键被按下时触发 |
onkeypress | 某个键盘按键被按下时触发 但是它不识别功能键比如ctrl shift箭头等 |
三个事件的执行顺序是:keydown
-> keypress
-> keyup
语法:
event.key
获取按下的键代码演示:
html<style>
.t
{
display:none;
position: absolute;
top: 40px;
width: 171px;
border: 1px solid rgba(0, 0, 0, .2);
box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
padding: 5px 0;
font-size: 18px;
line-height: 20px;
color: #333;
}
</style>
<body>
<div>
<div class="t">123</div>
<input type="text" placeholder="输入">
</div>
<script>
var inp = document.querySelector('input');
var fdiv = document.querySelector('.t');
inp.addEventListener('keyup',function()
{
if(this.value == ''){
fdiv.style.display = 'none';
}
else{
fdiv.style.display = 'block';
fdiv.innerHTML = this.value;
}
})
inp.addEventListener('blur',function()
{
fdiv.style.display = 'none';
})
inp.addEventListener('focus',function()
{
if(this.value!='')fdiv.style.display = 'block';
})
</script>
</body>
window
.JavaScript
语法的标准化组织是ECMA,DOM的标准化组织是W3C,BOM最初是Netscape浏览器标准的一部分.BOM比 DOM更大,它包含DOM.
graph TB
a["window"]
a---document
a---location
a---navigation
a---screen
a---history
window
对象是浏览器的顶级对象,它具有双重角色.
它是JS
访问浏览器窗口的一个接口.
它是一个全局对象.定义在全局作用域中的变量、函数都会变成window
对象的属性和方法.
在调用的时候可以省略window
,前面学习的对话框都属于window
对象方法,如alert()
、prompt()
等.
注意:
window
下的一个特殊属性window.name
.javascriptwindow.onload = function (){} //或者
window.addEventListener("load",function(){});
window.onload
是窗口(页面)加载事件,**当文档内容完全加载完成会触发该事件(包括图像、脚本文件、CSS文件等),**就调用的处理函数.
注意:
有了window.onload
就可以把JS代码写到页面元素的上方,因为onload
是等页面内容全部加载完毕,再去执行处理函数.
window.onload
传统注册事件方式只能写一次,如果有多个,会以最后一个window.onload
为准.
如果使用addEventListener
则没有限制.
javascriptdocument.addEventListener('DOMContentLoaded',function(){})
DOMContentLoaded
事件触发时,仅当DOM加载完成,不包括样式表,图片,flash等等.(ie9以上才支持)javascriptwindow.onresize = function (){}
window.addEventListener("resize",function(){});
window.onresize
是调整窗口大小加载事件,当触发时就调用的处理函数.
注意:
window.innerWidth
当前屏幕的宽度window
对象方法-定时器:
setTimeout()
setInterval()
setTimeout()
方法用于设置一个定时器,该定时器在定时器到期后执行调用函数.
语法:var timer = window.setTimeout(调用函数,延时时间);
清除定时器:
语法:window.clearTimeout(timer)
setlnterval()
方法重复调用一个函数,每隔这个时间,就去调用一次回调函数.
var timer = window .setInterval(回调函数,[间隔的毫秒数]);
清除定时器:
语法:window.clearInterval(timer)
this
的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this
到底指向谁,一般情况下this
的最终指向的是那个调用它的对象.
全局作用域或者普通函数中this
指向全局对象window
(注意定时器里面的this
指向window
)
JavaScript
语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.这是因为Javascript
这门脚本语言诞生的使命所致——JavaScript
是为处理页面中用户的交互,以及操作DOM而诞生的.
为了解决这个问题,利用多核CPU的计算能力,HTML5
提出 Web Worker
标准,允许JavaScript
脚本创建多个线程.于是,JS中出现了同步和异步.
同步(即单线程)
异步(即多线程)
同步任务
异步任务
JS
的异步是通过回调函数实现的.一般而言,异步任务有以下三种类型:
普通事件,如click
、resize
等
资源加载,如load
、error
等
定时器,包括setInterval
、setTimeout
等
异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列).
由于主线程不断的重复获得任务、执行任务、再获取任务、再执行,所以这种机制被称为事件循环(event loop).
window
对象给我们提供了一个**location
属性用于获取或设置窗体的URL
,并且可以用于解析URL
.因为这个属性返回的是一个对象,所限我们将这个属性也称为location
对象.**
**统一资源定位符(Uniform Resource Locator, URL)**是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它.
语法:
protocol://host[:port]/path/[?query]#fragment
组成 | 说明 |
---|---|
protocol | 通信协议常用的http,ftp,maito等 |
host | 主机(域名)www.badu.com |
port | 端口号可选,省略时使用方案的默认端口如http的默认端口为80 |
path | 路径由零或多个符号隔开的字符串,一般用来表示主机上的一个目录或文件地址 |
query | 参数以键值对的形式,通过&符号分隔开来 |
fragment | 片段#后面内容常见于链接锚点 |
location对象属性 | 返回值 |
---|---|
location.href | 获取或者设置整个URL |
location.host | 返回主机(域名)www.baidu.com |
location.port | 返回端口号如果未写返回空字符串 |
location.pathname | 返回路径 |
location.search | 返回参数 |
location.hash | 返回片段 #后面内容常见于链接锚点 |
代码演示:
html<!--1.html-->
<body>
<div>
//输入用户名表单
<form action="index.html">
用户名: <input type="text" name="uname">
<input type="submit" value="登陆">
</form>
</div>
</body>
<!--index.html-->
<body>
<div></div>
<script>
//获取用户名
var uname = location.search.substr(1).split('=');
var div = document.querySelector('div');
div.innerHTML = uname[1];
</script>
</body>
location对象方法 | 返回值 |
---|---|
location.assign() | 跟href一样,可以跳转页面(也称为重定向页面) |
location.replace() | 替换当前页面,因为不记录历史,所以不能后退页面 |
location.reload() | 重新加载页面,相当于刷新按钮或者f5如果参数为true强制刷新ctrl+f5 |
navigator
对象包含有关浏览器的信息,它有很多属性,我们最常用的是userAgent
,该属性可以返回由客户机发送服务器的user-agent
头部的值.
window
对象给我们提供了一个history
对象,与浏览器历史记录进行交互.该对象包含用户(在浏览器窗口中)访问过的URL.
history对象方法 | 作用 |
---|---|
back() | 可以后退功能 |
forward() | 前进功能 |
go(参数) | 前进后退功能参数如果是1前进1个页面如果是-1后退1个页面 |
offset
翻译过来就是偏移量,我们使用offset
系列相关属性可以动态的得到该元素的位置(偏移)、大小等.
获得元素距离带有定位父元素的位置
获得元素自身的大小(宽度高度)
注意:
offset
不可用于修改元素的属性offset
可以得到style
得不到的内嵌样式表属性offset常用属性:
offset系列属性 | 作用 |
---|---|
element.offsetParent | 返回作为该元素带有定位的父级元素如果父级都没有定位则返回body |
element.offsetTop | 返回元素相对带有定位父元素上方的偏移 |
element.offsetLeft | 返回元素相对带有定位父元素左边框的偏移 |
element.offsetWidth | 返回自身包括padding 、边框、内容区的宽度,返回数值不带单位 |
element.offsetHeight | 返回自身包括padding、边框、内容区的高度,返回数值不带单位 |
代码演示:
html<body>
<div class="w"></div>
<script>
var w = document.querySelector('.w');
w.addEventListener('click',function(e)
{
console.log('X轴:',e.pageX-w.offsetLeft,'Y轴:',e.pageY-w.offsetTop);
})
</script>
</body>
代码演示:
html<style>
.w
{
display: none;
position: absolute;
height: 200px;
width: 200px;
top: 50%;
left: 50%;
border: #ebebeb solid 1px;
box-shadow: 0px 0px 20px #ddd;
z-index: 9999;
background: #dddddd;
transform: translate(-50%, -50%);
cursor: move;
}
.mask
{
display: none;
background-color: rgba(0, 0, 0, 0.7);
width: 100%;
height: 100%;
position: fixed;
top: 0px;
left: 0px;
}
</style>
<body>
<div class="mask"></div>
<button type="submit">登陆</button>
<div class="w"></div>
<script>
//获取网页元素
var w = document.querySelector('.w');
var mask = document.querySelector('.mask');
var btn = document.querySelector('button');
//添加按钮点击事件,显示遮罩和模态框
btn.addEventListener('click',function()
{
w.style.display = 'block';
mask.style.display = 'block';
})
//添加模态框鼠标拖动事件
w.addEventListener('mousedown',function(e)
{
var x = e.pageX - w.offsetLeft;
var y = e.pageY - w.offsetTop;
document.addEventListener('mousemove',move);
document.addEventListener('mouseup',function()
{
document.removeEventListener('mousemove',move);
})
function move(e)
{
w.style.left = e.pageX - x +'px';
w.style.top = e.pageY - y + 'px';
}
})
</script>
</body>
使用client
系列的相关属性来获取元素可视区的相关信息.通过client
系列的相关属性可以动态的得到该元素的边框大小、元素大小等.
client系列属性 | 作用 |
---|---|
element.clientTop | 返回元素上边框的大小 |
element.clientLeft | 返回元素左边框的大小 |
element.clientWidth | 返回自身包括padding 、内容区的宽度,不含边框,返回数值不带单位 |
element.clientHeight | 返回自身包括padding、内容区的高度,不含边框,返回数值不带单位 |
使用scroll
系列的相关属性可以动态的得到该元素的大小、滚动距离等.
scroll系列属性 | 作用 |
---|---|
element.scrollTop | 返回被卷去的上侧距离,返回数值不带单位 |
element.scrollLeft | 返回被卷去的左侧距离,返回数值不带单位 |
element.scrollWidth | 返回自身实际的高度,不含边框,返回数值不带单位 |
element.scrollHeight | 返回自身实际的高度,不含边框,返回数值不带单位 |
jsvar body_scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
console.log(body_scrollTop);
jsdocument.body.scrollTop = document.documentElement.scrollTop = 0;
核心原理:
setInterval()
不断移动盒子位置.实现步骤:
element.style.left
注意:
语法:
javascriptfunction animate(obj,target,time,callback){
//先清除以前的定时器,保留当前定时器
clearInterval(obj.timer);
//封装obj目标对象,给不同的元素指定了不同的定时器
obj.timer = setInterval(function(){
if(停止条件){
clearInterval(obj.timer);
}
//元素动画部分
},time)
}
概念:
缓动动画:
javascriptfunction animate(obj,target,time,callback){
//先清除以前的定时器,保留当前定时器
clearInterval(obj.timer);
//封装obj目标对象,给不同的元素指定了不同的定时器
obj.timer = setInterval(function(){
//步长: 即每次定时器变化时增加的距离
//对步长值取整(步长大于零向上取整Math.ceil;步长小于零向下取整Math.floor)
var step = (target - obj.offsetLeft)/10;
step = step>0?Math.ceil(step):Math.floor(step);
//元素动画部分
obj.style.left = obj.offsetLeft+step+'px';
if(停止条件){
//清除定时器
clearInterval(obj.timer);
//执行回调函数
if(callback){
callback();
}
//使用短路运算调用回调函数
callback &7 callback();
}
},time)
}
回调函数原理:
节流阀目的:
当上一个函数动画内容执行完毕,再去执行下一个函数动画,让事件无法连续触发.
核心实现思路:
使用回调函数,添加一个变量来控制,锁住函数和解锁函数.
触屏touch事件 | 说明 |
---|---|
touchstart | 手指触摸到一个DOM元素时触发 |
touchmove | 手指在一个DOM元素上滑动时触发 |
touchend | 手指从一个DOM元素上移开时触发 |
TouchEvent
是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件.
这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少,等等.
touchstart
、touchmove
、touchend
三个事件都会各自有事件对象.
触摸列表 | 说明 |
---|---|
touches | 正在触摸屏幕的所有手指的一个列表 |
targetTouches | 正在触摸当前DOM元素上的手指的一个列表 |
changedTouches | 手指状态发生了改变的列表,从无到有,从有到无变化 |
classList
属性是HTML5
新增的一个属性,返回元素的类名.但是ie10
以上版本支持。
该属性用于在元素中添加,移除及切换CSS类.有以下方法:
添加类:
element.classList.add("类名");
是在后面追加类名不会覆盖以前的类名删除类名:
element.classList.remove("类名");
切换类名:
element.class.toggle("类名");
移动端click
事件会有300ms的延时,原因是移动端屏幕双击会缩放(double tap to zoom)
页面。
解决方案:
html<meta name="viewport" content="user-scalable=no">
原理:
当我们手指触摸屏幕,记录当前触摸时间
当我们手指离开屏幕,用离开的时间减去触摸的时间
如果时间小于150ms,并且没有滑动过屏幕,那么我们就定义为点击
使用插件.fastclick插件解决300ms延迟.
github:[https://github.com/ftlabs/fastclick]:
github: [https://github.com/ftlabs/fastclick]:
中文网站: [https://www.swiper.com.cn/]:
[http://www.superslide2.com/]:
[https://github.com/cubiq/iscroll]:
框架,顾名思义就是一套架构,它会基于自身的特点向用户提供一套较为完整的解决方案。框架的控制权在框架本身,使用者要按照框架所规定的某种规范进行开发.
前端常用的框架有Bootstrap
、Vue
、Angular
、React
等.既能开发PC端,也能开发移动端
前端常用的移动端插件有swiper
、superslide
、iscroll
等.
中文官网:[https://www.bootcss.com/]:
sessionStorage
约5M、localStorage
约20MJSON.stringify
编码后存储生命周期为关闭浏览器窗口
**在同一个窗口(页面)**下数据可以共享
以键值对的形式存储使用
语法:
sessionStorage.setItem('uname',val);
sessionStorage.getItem('uname');
sessionStorage.removeItem('uname');
sessionStorage.clear();
生命周期永久生效,除非手动删除否则关闭页面也会存在
可以多窗口(页面)共享(同一浏览器可以共享)
以键值对的形式存储使用
语法:
localStorage.setItem('uname',val);
localStorage.getItem('uname');
localStorage.removeItem('uname');
localStorage.clear();
目标屏幕宽度:1920px
github:[https://github.com/amfe/lib-flexible]:
flexible.js将屏幕分为24等份
javascriptsetBodyFontSize();
// set 1rem = viewWidth /24 //把屏幕划分成24份
function setRemUnit () {
var rem = docEl.clientWidth / 24
docEl.style.fontSize = rem + 'px'
}
VSCode插件:cssrem
约束屏幕宽度:
css@media screen and (max-width: 1024px) {
html {
font-size: 42.66px !important;
}
}
@media screen and (min-width: 1920px) {
html {
font-size: 80px !important;
}
}
在浏览器上不能获取用户本地的文件(所以也不能获取JSON文件,网站的JSON文件部署在服务器上),所以在本地开发时,可以使用另外一些方法获取JSON文件
jsvar url = 'data.json';
var requst = new XMLHttpRequest();
request.open("get",url);//设置方法和请求路径
request.send(null);//不发送数据到服务器
request.onload = function () {/*XHR对象获取到返回信息后执行*/
if (request.status == 200) {/*返回状态为200,即为数据获取成功*/
var json = JSON.parse(request.responseText);
console.log(json);
}
js<script>
function getBrowser() {
var UserAgent = navigator.userAgent.toLowerCase();
var browserInfo = {};
var browserArray = {
IE: window.ActiveXObject || "ActiveXObject" in window,
// IE
Chrome:
UserAgent.indexOf("chrome") > -1 && UserAgent.indexOf("safari") > -1,
// Chrome浏览器
Firefox: UserAgent.indexOf("firefox") > -1,
// 火狐浏览器
Opera: UserAgent.indexOf("opera") > -1,
// Opera浏览器
Safari:
UserAgent.indexOf("safari") > -1 && UserAgent.indexOf("chrome") == -1,
// safari浏览器
Edge: UserAgent.indexOf("edge") > -1,
// Edge浏览器
QQBrowser: /qqbrowser/.test(UserAgent),
// qq浏览器
WeixinBrowser: /MicroMessenger/i.test(UserAgent),
// 微信浏览器
};
// console.log(browserArray)
for (var i in browserArray) {
if (browserArray[i]) {
var versions = "";
if (i == "IE") {
versions = UserAgent.match(/(msie\s|trident.*rv:)([\w.]+)/)[2];
} else if (i == "Chrome") {
for (var mt in navigator.mimeTypes) {
//检测是否是360浏览器(测试只有pc端的360才起作用)
if (
navigator.mimeTypes[mt]["type"] == "application/360softmgrplugin"
) {
i = "360";
}
}
versions = UserAgent.match(/chrome\/([\d.]+)/)[1];
} else if (i == "Firefox") {
versions = UserAgent.match(/firefox\/([\d.]+)/)[1];
} else if (i == "Opera") {
versions = UserAgent.match(/opera\/([\d.]+)/)[1];
} else if (i == "Safari") {
versions = UserAgent.match(/version\/([\d.]+)/)[1];
} else if (i == "Edge") {
versions = UserAgent.match(/edge\/([\d.]+)/)[1];
} else if (i == "QQBrowser") {
versions = UserAgent.match(/qqbrowser\/([\d.]+)/)[1];
}
browserInfo.type = i;
browserInfo.versions = parseInt(versions);
}
}
console.log(browserInfo);
return browserInfo;
}
</script>
jQuery
是一个快速、简洁的JavaScript
库,其设计的宗旨是“write Less , Do More”,即倡导写更少的代码,做更多的事情.
j
就是JavaScript
;Query
查询;意思就是查询js
,把js
中的DOM
操作做了封装,我们可以快速的查询使用里奋的功能.
jQuery
封装了JavaScript
常用的功能代码,优化了DOM
操作、事件处理、动画设计和Ajax
交互.学习
jQuery
本质:就是学习调用这些函数(方法).
官网:[https://jquery.com/]:
$
是jQuery
的别称,在代码中可以使用jQuery
代替$
,但一般为了方便,通常都直接使用$
.$
是jQuery
的顶级对象,相当于原生JavaScript
中的window
.把元素利用$
包装成jQuery
对象,就可以调用jQuery
的方法.用原生JS
获取来的对象就是DOM
对象.
jQuery
方法获取的元素就是jQuery
对象.
jQuery
对象本质是:利用$
对DOM
对象包装后产生的对象(伪数组形式存储).
DOM对象和jQuery对象不可混用
获取jQuery对象:
$('target')
获取DOM对象:
document.querySelector('target');
$('target');
$('target')[index];
$('target')get(index)
语法:
javascript//此处代码在页面加载完毕后显示
$(function(){
//jQuery代码
})
语法:
$('target');
名称 | 用法 | 描述 |
---|---|---|
ID选择器 | $("#id") | 获取指定ID的元素 |
全选选择器 | $(*') | 匹配所有元素 |
类选择器 | $(".class") | 获取同一类class的元素 |
标签选择器 | $("div") | 获取同一类标签的所有元素 |
并集选择器 | $("div,p,li") | 选取多个元素 |
交集选择器 | $("li.current") | 交集元素 |
jQuery层级选择器:
名称 | 用法 | 描述 |
---|---|---|
子代选择器 | $("ul>li"); | 使用>号,获取亲儿子层级的元素;注意,并不会获取孙子层级的元素 |
后代选择器 | $("ul li"); | 使用空格,代表后代选择器,获取ul下的所有li元素,包括孙子等 |
html<div></div>
<div></div>
<div></div>
<div></div>
<script>
$('div').css('background','pink');//此时发生隐式迭代
</script>
语法 | 用法 | 描述 |
---|---|---|
:first | $('li:first') | 获取第一个li元素 |
:last | $(li:last') | 获取最后一个li元素 |
:eq(index) | $("Ii:eq(2)") | 获取到的li元素中,选择索引号为2的元素 |
:odd | $("Ii:odd") | 获取到的li元素中,选择索引号为奇数的元素 |
:even | $("li:even") | 获取到的li元素中,选择索引号为偶数的元素 |
$('div:first').css('background','pink');
$('div:last').css('background','pink');
$('div:eq(2)').css('background','pink');
$('div:even').css('background','pink');
$('div:odd').css('background','pink');
语法 | 用法 | 说明 |
---|---|---|
parent() | $("li").parent(); | 查找父级 |
children(selector) | $("ul" ).children("li") | 相当于$("ul>li"),最近一级(亲儿子) |
find(selector) | $("ul").find("li"); | 相当于$("ul li"),后代选择器 |
siblings(selector) | $(".first").siblings("li"); | 查找兄弟节点,不包括自己本身 |
nextAll( [expr]) | $(".first" ).nextAll() | 查找当前元素之后所有的同辈元素 |
prevtAll([expr] | $(".last" ).prevAll() | 查找当前元素之前所有的同辈元素 |
hasClass(class) | $("div").hasclass( "protected") | 检查当前的元素是否含有某个特定的类,如果有,则返回true |
eq(index) | $("li").eq(2); | 相当于$("li(2)" ) ,index从0开始 |
代码演示:
javascript//筛选子代
$(".container > .son").mouseover(function(){
$(this).hide("slow");
})
$(".container > .son").mouseout(function(){
$(this).show("slow");
})
javascript//排他siblings
$(".container > .son").mouseover(function(){
$(this).siblings(".son").hide("slow");
})
$(".container > .son").mouseout(function(){
$(this).siblings(".son").show("slow");
})
代码演示:
html<!DOCTYPE html>
<head>
<style>
.container{
position: absolute;
top: 40%;
left: 50%;
width: 500px;
height: 150px;
padding: 0;
border: 1px #000 solid;
transform: translate(-50%,-50%);
}
.son{
position:absolute;
display: none;
top: 10%;
width: 90%;
height: 80%;
margin-left: 5%;
float: left;
background-color: aqua;
}
.menu{
position: absolute;
top: 0;
width: 45px;
height: 15px;
margin-left: 5%;
float: left;
background-color: aqua;
}
.s1{
display:block;
background-color: rgb(218, 29, 29);
}
.s2{
background-color: rgb(32, 29, 218);
}
.s3{
background-color: rgb(21, 225, 42);
}
.s4{
background-color: rgb(218, 29, 180);
}
</style>
<script src="../jQuery/jQuery.min.js"></script>
<script>
$(function(){
for(var i = 0;i<$(".menu").length;i++)
{
$(".menu").eq(i).css("left",0+i*135+"px");
}
$(".menu").mousedown(function(){
var index = $(this).index();
$(".son").eq(index).show("slow");
$(".son").eq(index).siblings(".son").hide("slow");
})
})
</script>
<body>
<div class="container">
<div class="menu m1"></div>
<div class="menu m2"></div>
<div class="menu m3"></div>
<div class="menu m4"></div>
<div class="son s1"></div>
<div class="son s2"></div>
<div class="son s3"></div>
<div class="son s4"></div>
</div>
</body>
</html>
语法:
$(this).css('color','red').sibling().css('color','');
语法:
$("parent").children("son")
$("son").parents("parent")
jQuery
可以使用css
方法来修改简单元素样式;也可以操作类,修改多个样式.$(this).css("color");
$(this).css(""color", "red");
$(this).css({"color":"white"," font-size":" 20px"});
classList
,可以操作类样式,注意操作类里面的参数不要加点.语法:
$("div").addClass("current");
语法:
$(this).removeClass("current");
语法:
$(this).toggleClass ("current" );
原生JS中className
会覆盖元素原先里面的类名.
jQuery
里面类操作只是对指定类进行操作,不影响原先的类名.
语法:
show ([speed],[easing],[fn])
hide ([speed],[easing],[fn])
toggle ([speed],[easing],[fn])
显示参数:
(“slow”,"normal”,or “fast”)
或表示动画时长的毫秒数值(如:1000).(Optional)
用来指定切换效果,默认是“swing,
可用参数linear
.语法:
slideDown([speed],[easing],[fn])
slideUp([speed],[easing],[fn])
slideToggle([speed],[easing],[fn])
显示参数:
(“slow”,"normal”,or “fast”)
或表示动画时长的毫秒数值(如:1000).(Optional)
用来指定切换效果,默认是“swing,
可用参数linear
.语法:
fadeIn([speed],[easing],[fn])
fadeOut([speed],[easing],[fn])
fadeToggle([speed],[easing],[fn])
参数:
(“slow”,"normal”,or “fast”)
或表示动画时长的毫秒数值(如:1000).(Optional)
用来指定切换效果,默认是“swing,
可用参数linear
.语法:
fadeTo([speed],[opacity],[easing],[fn])
参数:
(“slow”,"normal”,or “fast”)
或表示动画时长的毫秒数值(如:1000).必须参数(Optional)
用来指定切换效果,默认是“swing,
可用参数linear
.语法:
hover([over],[out])
参数:
over
:鼠标移到元素上要触发的函数(相当于mouseenter
)
out
:鼠标移出元素要触发的函数(相当于mouseleave
)
代码演示:
javascript$(".nav>li").hover(function(){
//鼠标经过
},function(){
//鼠标离开
})
动画或者效果一旦触发就会执行,如果多次触发,就造成多个动画或者效果排队执行.
语法:
stop()
stop()
方法用于停止动画或效果.注意:
stop()
写到动画或者效果的前面,相当于停止结束上一次的动画.语法:
animate(params,[speed],[easing],[fn] )
参数:
**params:**想要更改的样式属性,以对象形式传递,必须写。属性名可以不用带引号,如果是复合属性则需要采取驼峰命名法borderLeft
.其余参数都可以省略.
**speed :**三种预定速度之一的字符串(“slow”,"normal”,or“fast”
)或表示动画时长的毫秒数值(如:1000).
easing:(Optional
)用来指定切换效果,默认是“swing”
,可用参数“linear”
.
**fn:**回调函数,在动画完成时执行的函数,每个元素执行一次.
获取属性值:
prop("属性")
设置属性值:
prop("属性","属性值")
语法:
attr("属性")
attr("属性","属性值")
data()
方法可以在指定的元素上存取数据,并不会修改DOM
元素结构.一旦页面刷新,之前存放的数据都将被移除.存储数据:
$("element").data("uname","str")
获取数据:
$("element").data("uname")
html()
(相当于原生inner HTML
)获取元素的内容:
html()
设置元素的内容:
html("内容")
text()
(相当于原生inner TEXT
)获取元素的内容:
text()
设置元素的内容:
text("内容")
jQuery
隐式迭代是对同一类元素做了同样的操作。如果想要给同一类元素做不同操作,就需要用到遍历.语法1:
$("div").each(function(index,domEle){ xxx;})
参数:
each()
方法遍历匹配的每一个元素,主要用DOM
处理.each
每一个
里面的回调函数有2个参数: index
是每个元素的索引号; domEle
是每个DOM
元素对象,不是jQuery
对象
所以要想使用jQuery
方法,需要给这个dom
元素转换为jQuery
对象$(domEle)
语法2:
$.each(object,function(index,element){ xxx;})
参数:
$.each()
方法可用于遍历任何对象.主要用于数据处理,比如数组,对象 index
是每个元素的索引号; element
遍历内容创建元素:
var element = $("<div>title</div>")
添加元素:
内部添加:
$("element").append(element);
把内容放入匹配元素内部最后面,类似原生appendChild
.$("element").prepend(element);
把内容放入匹配元素内部最前面外部添加:
$("element").after(element)
$("element").before(element)
注意:
内部添加元素,生成之后,它们是父子关系.
外部添加元素,生成之后,他们是兄弟关系.
删除元素:
$("element").remove()
删除匹配的元素(本身)$("element").empty()
删除匹配的元素集合中所有的子节点$("element").html("")
清空匹配的元素内容语法 | 用法 |
---|---|
width() / height() | 取得匹配元素宽度和高度值只算width / height |
innerWidth()/ innerHieght() | 取得匹配元素宽度和高度值包含padding |
outerWidth() / outerHeight() | 取得匹配元素宽度和高度值包含padding . border |
outerWidth(true)/ outerHeight(true) | 取得匹配元素宽度和高度值包含 padding . border、margin |
以上参数为空,则是获取相应值,返回的是数字型.
如果参数为数字,则是修改相应值.
参数可以不必写单位.
offset()
方法设置或返回被选元素相对于文档的偏移坐标类型为对象,跟父级没有关系.
该方法有2个属性left、top
.offset().top
用于获取距离文档顶部的距离,offset().left
用于获取距离文档左侧的距离。
可以设置元素的偏移:offset({ top: 10, left: 30 });
position()
方法用于返回被选元素相对于带有定位的父级偏移坐标,如果父级都没有定位,则以文档为准.position()
方法只能获取元素偏移而不能设置元素偏移scrollTop()
方法设置或返回被选元素被卷去的头部.
scrollLeft()
方法设置或返回被选元素被卷去的左侧.
html<!DOCTYPE html>
<head>
<script src="../jQuery/jQuery.min.js"></script>
<style>
body{
height: 2000px;
}
.block{
position: absolute;
top: 120%;
left: 50%;
width: 75%;
height: 35%;
background-color: aqua;
transform: translate(-50%,-50%);
}
.float{
display: none;
position: fixed;
top: 50%;
right: 4%;
width: 40px;
height: 40px;
background-color: burlywood;
cursor: pointer;
}
</style>
<script>
$(function(){
var boxtop = $(".block").offset().top;
$(window).scroll(function(){
if($(document).scrollTop()>=boxtop){
$(".float").fadeIn("slow");
}
else{
$(".float").fadeOut("slow");
}
})
$(".float").click(function(){
$("html, body").stop().animate({
scrollTop:0,
});
})
})
</script>
</head>
<body>
<div class="block"></div>
<div class="float"></div>
</body>
</html>
语法:
$("div").click(function(){事件处理程序})
on()
方法在匹配元素上绑定一个或多个事件的事件处理函数one()
方法只触发一次语法:
element.on (events,[selector],fn)
参数:
"click"或"keydown”
代码演示:
java//绑定多个事件
$("div").on({
mouseover:function(){
$(this).css("background","pink");
},
click:function(){
$(this).css("background","red");
},
mouseout:function(){
$(this).css("background","blue");
}
})
javascript//切换类
$("div").on("mouseenter mouseleave",function(){
$(this).toggleClass("current");
})
javascript//事件委派
$("ul").on("click","li",function(){
//点击事件代码块
})
javascript//on可以给后来创建的元素绑定事件
$("ol").on("click","li",function(){
//代码块
})
var li = $("<li>text</li>");
$("ol").append(li);
优点:
click()
没有办法绑定事件,on()
可以给动态生成的元素绑定事件语法:
element.trigger("type")
会触发元素的默认事件element.triggerHander("type")
不会触发元素的默认事件off()
方法可以移除通过on()
方法添加的事件处理程序.语法:
element.off()
解除element身上所有事件
element.off("event")
解除element上的event事件
element.off("event","child")
解除element上子元素的事件
语法:
element.on(events,[selector],function(event){})
$.extend()
方法语法:
$.extend([deep],target,object1,[objectN ])
**deep:**如果设为true为深拷贝,默认为false浅拷贝.
**target:**要拷贝的目标对象.
object1:待拷贝到第一个对象的对象.
**objectN:**待拷贝到第N个对象的对象.
浅拷贝:
深拷贝:
解决方案:
把里面的$
符号统一改为jQuery
.比如jQuery("div")
var 自定义符号 = $.noConflict()
jQuery插件常用的网站:
jQuery插件库[http://www.jq22.com/]:
jQuery之家[http://www.htmleaf.com/]:
图片懒加载(图片使用延迟加载在可提高网页下载速度.它也能帮助减轻服务器负载)
当我们页面滑动到可视区域,再显示图片.
插件:
github:[https://github.com/channg/EasyLazyload.js]:
插件:
github:[https://github.com/alvarotrigo/fullPage.js]:
中文翻译网站:[www.dowebok.com/77.html]:
jsvar Ajax = function ()
{
$.getJSON ("demo.json", function (data)
{
$.each (data, function (i, item)
{
console.log(item.name);
});
});
}();
ECharts
是一个使用JavaScript
实现的开源可视化库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,chrome,Firefox,Safari
等),底层依赖矢量图形库ZRender
,提供直观,交互丰富,可高度个性化定制的数据可视化图表.
官网:[https://echarts.apache.org/]:
echarts.js
文件DOM
容器echarts
实例对象(option)
echarts
实例对象语法:
var myChart = echarts.init(document.querySelector('.main'));
javascript// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data: ['销量']
},
xAxis: {
data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
},
yAxis: {},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
};
myChart.setOption(option);
**title:**标题组件.
**tooltip:**提示框组件.
**legend:**图例组件.
**toolbox:**工具栏.
**grid:**直角坐标系内绘图网格.
**xAxis:**直角坐标系grid
中的x轴.
**yAxis:**直角坐标系grid
中的y轴.
**series:**系列列表.每个系列通过type
决定自己的图表类型.
**color:**调色盘颜色列表.
更多配置项:
本文作者:peepdd864
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!