python全栈-js
JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”,指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序的“脚本”。
JavaScript 是一种嵌入式(embedded)语言。它本身提供的核心语法不算很多,只能用来做一些数学和逻辑运算。
html是设计结构,css是美化结构,js是让结构动起来。nodejs是写服务器的,语言是js
JavaScript与ECMAScript的关系
关于JavaScript版本
在学习这门语言的初期,使用的是ES5版本。新版本后期讲。
JavaScript 程序的单位是行(line),也就是一行一行地执行。一般情况下,每一行就是一个语句
写js语言,可以在html里面的body使用script标签,里面写js语言,就像css在style里面一样。
var num=10;
var是关键字,是声明语句的,num是名字/变量,=是赋值。10是值。
语句以分号结尾,一个分号就表示一个语句结束
标识符(identifier)指的是用来识别各种值的合法名称。最常见的标识符就是变量名
标识符是由:字母、美元符号($)、下划线(_)和数字组成,其中数字不能开头
中文是合法的标识符,可以用作变量名(不推荐)
以下关键字不需要强行记忆!
arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。
js里面有大小写的区别。
变量,常量,变量提升
console.log(变量) 可以在浏览器的终端输出变量的值
变量提升
JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
说白了,就是不管你在什么位置创建的变量,在代码执行的时候,所有的声明变量语句都会被放到代码开头。
但是只有声明放在开头var num;但是num没有赋值。赋值还是在原来的位置,所以在声明变量之前可以访问,但是只有空值。
使用const定义常量后,常量无法改变(扩展知识,ES6新特性)
嵌入html中,引入本地js,引入网络js
<body>
<script>
var age = 20
script>
body>
script标签一定要放在body的最下面,所有容器的底部
<body>
<script src="js路径"> script>
body>
<body>
<script src="http://code.jquery.com/jquery1.2.1.min.js"> script>
body>
为什么要使用网络js呢?因为很多设计用的人多了,就有人去整理js文件。比如轮播图效果,直接在网上搜,,然后把人家提供的网络js文件导入进去。因为人家是写好的js,不会出什么大错误,我们可以直接放在head里面
引入过来的代码按照人家说的方式用就可以Swiper CDN - Swiper中文网
cdn是人家的网络js数据包
使用教程Swiper使用方法 - Swiper中文网
JavaScript注释
JavaScript输出方式
数值,字符串,布尔,null,undefined,对象,symbol
// 数值
var num= 10;
// 字符串
var str1= '你好'
var str2= "hi"
// 布尔
var flat=true;
var flat1=false;
// null
// undefined
var a1;
console.log(num); // 输出的就是undefined。null也是一样的,null是旧版本的输出
// 对象 里面都是键值对
var teacher1={
age:19,
name:'lily'
}
// symbol
上面是所有的数据类型。这些数据类型有不同的分类方式
数值,字符串,布尔
对象:因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器
至于undefined和null,一般将它们看成两个特殊值
JavaScript 有三种方法,可以确定一个值到底是什么类型。而我们现在需要接触到的就是typeof
跟python的type一样
数值返回number
字符串返回string
布尔值返回boolean
对象返回object
unll和undefined的区别
使用方式:typeof 变量
输出:console.log(typeof num);
数值相加,非数值相加,与字符串相加
任何类型和字符串相加,都是字符串类型
有:=,+=,-=,*=,/=,%=
=是赋值,不是等于
有:<,>,<=,>=,==,!=,!==,===
小于,大于,小于等于,大于等于,等于,不等于,严格不等于,严格等于
严格等于是有类型的限制。不能是类型不同。两个等于只需要值相等,三个等于是有类型和值同时相等。
把表达式变成布尔值,真假值。
取反!,且&&,或||
空格也是字符,空格不算假
位运算符直接处理每一个比特位(bit),是非常底层的运算,好处是速度极快,缺点是很不直观,许多场合不能使用它们,否则会使代码难以理解和查错
查文档就行了
如果多个运算符混写在一起,常常会导致令人困惑的代码,所以一般我们可以通过多条语句完成,记住所有运算符的优先级,是非常难的,也是没有必要的
自动转换,强制转换
if (布尔值){ 语句; } if (布尔值) 不加大括号,只能跟一条语句 语句;
和c语言一样
if (m === 3) { // 满足条件时,执行的语句 } else if(m===2){ // 不满足条件时,执行的语句 }else{ }
switch (fruit) {
case "banana":
// ...
break;
case "apple":
// ...
break;
default:
// ...
}
和c语言一模一样
for (初始化表达式; 条件; 迭代因子) {
语句
}
for (var i=0;i<10;i++){
console.log(i);
}
//c++
for (int i=0;i<10;i++){
printf(i);
}
//python
for i in range(10)
print(i)
while (条件) {
语句;
}
字符串就是零个或多个排在一起的字符,放在单引号或双引号之中
单引号字符串的内部,可以使用双引号。双引号字符串的内部,可以使用单引号
如果要在单引号字符串的内部,使用单引号,就必须在内部的单引号前面加上反斜杠,用来转义。双引号字符串内部使用双引号,也是如此
字符串默认只能写在一行内,分成多行将会报错。如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠
如果真的有多行文本的需求,可以使用字符串拼接的方式实现。使用加号连接。
反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符
\0 :null(\u0000)
\b :后退键(\u0008)
\f :换页符(\u000C)
\n :换行符(\u000A)
\r :回车键(\u000D)
\t :制表符(\u0009)
\v :垂直制表符(\u000B)
’ :单引号(\u0027)
" :双引号(\u0022)
\ :反斜杠(\u005C)
length属性返回字符串的长度,该属性也是无法改变的
str1.length
所谓 Base64 就是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+和/这64个字符组成的可打印字符。使用它的主要目的,不是为了加密,而是为了不出现特殊字符,简化程序的处理.JavaScript 原生提供两个 Base64 相关的方法
btoa():任意值转为 Base64 编码
atob():Base64 编码转为原来的值
var string = 'Hello World!'; btoa(string) // "SGVsbG8gV29ybGQh" atob('SGVsbG8gV29ybGQh') // "Hello World!"
中文是不可以进行处理的.如果非要处理中文,需要在增加两个方法encodeURIComponent(), decodeURIComponent()
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}
function b64Decode(str) {
return decodeURIComponent(atob(str));
}
b64Encode('你好') //"JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
charAt 方法返回指定位置的字符,参数是从 0 开始编号的
人话:把字符串看成一个字符串数组,按照下标取数组的元素。
var s = new String('itbaizhan');
s.charAt(1) // "t" 取下标为1的元素
s.charAt(s.length - 1) // "n" 取最后一个元素
如果参数为负数,或大于等于字符串的长度, charAt 返回空字符串
concat 方法用于连接两个字符串,返回一个新字符串,不改变原字符串,s1.concat(s2)
该方法可以接受多个参数,console.log(‘’.concat(one, two, three) )
如果参数不是字符串, concat 方法会将其先转为字符串,然后再连接
和使用加号拼接字符串的效果是一样的
slice 方法用于从原字符串取出子字符串并返回,不改变原字符串。它的第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置)
就是从字符串里面取子串
'itbaizhan'.slice(0, 4) // "it"
如果省略第二个参数,则表示子字符串一直到原字符串结束
如果参数是负值,表示从结尾开始倒数计算的位置,即该负值加上字符串长度
'itbaizhan'.slice(-7) // "baizhan"
和slice一样,但是slice不支持,第二个参数比第一个参数靠前。
substring在发现第二个参数比第一个参数靠前的时候,会自动交换两个参数的位置,属于是slice的修复版
如果参数是负数, substring 方法会自动将负数转为0
由于这些规则违反直觉,因此不建议使用 substring 方法,应该优先使用 slice
和slice,substring的作用是一样的
但是参数的意义不一样了,第一个参数是子串截取的下标,第二个参数是子串要截取的长度
如果第一个参数是负数,表示倒数计算的字符位置。如果第二个参数是负数,将被自动转为0,因此会返回空字符串
第二个参数为0,就是空字符串拉
就是找子串的起始位置。可以有第二个参数,第二个参数是从字符串第几位元素开始寻找子串。
indexof是正着找子串,lastindexof是反着找子串。
indexOf 方法用于确定一个字符串在另一个字符串中第一次出现的位置,返回结果是匹配开始的位置。如果返回 -1 ,就表示不匹配
indexOf 方法还可以接受第二个参数,表示从该位置开始向后匹配
lastIndexOf 方法的用法跟 indexOf 方法一致,主要的区别是 lastIndexOf 从尾部开始匹配, indexOf 则是从头部开始匹配
trim 方法用于去除字符串两端的空格,返回一个新字符串,不改变原字符串
该方法去除的不仅是空格,还包括制表符( \t 、 \v )、换行符( \n )和回车符( \r )
toLowerCase 方法用于将一个字符串全部转为小写, toUpperCase 则是全部转为大写。它们都返回一个新字符串,不改变原字符串
itbaizhan'.charAt(0).toUpperCase() +'itbaizhan'.substr(1);
search 方法确定原字符串是否匹配某个子字符串,返回值为匹配的第一个位置。如果没有找到匹配,则返回 -1 。
search和indexof作用类型。都是找子串的。目前他们的效果作用都是一样的,在学了正则表达式之后就不一样了。
replace 方法用于替换匹配的子字符串'sxtbaizhan'.replace('sxt', 'it')
replace多处用在删除子串。就是根据我们提供的子串1,和一个空字符串的子串2,就能完成字符串删除子串的操作
split 方法按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组
如果分割规则为空字符串,则返回数组的成员是原字符串的每一个字符。
如果省略参数,则返回数组的唯一成员就是原字符串
split 方法还可以接受第二个参数,限定返回数组的最大成员数。
返回的是子串数组。
数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。
var arr = ['it',10,true,{}];
数组也可以先定义后赋值。
任何类型的数据,都可以放入数组
数组可以嵌套数组arr[1][2]
数组的本质上,数组属于一种特殊的对象。typeof运算符会返回数组的类型是object
length属性是可写的。如果人为设置一个小于当前成员个数的值,该数组的成员会自动减少到length设置的值.数据丢失
var arr = ['sxt', 'baizhan', 'it']; arr.length = 2; // ['sxt', 'baizhan']
如果访问数组的时候,指定下标,下标超过数组的最大长度,就会返回undefined
for(var i = 0; i < a.length; i++) { console.log(a[i]); }
for (var i in arr) { console.log(arr[i]); }
当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位.空位的打印结果是undefined
var a = ['sxt', , 'it']; a.length // 3
如果参数是一个正整数,返回数组的成员都是空位。虽然读取的时候返回 undefined ,但实际上该位置没有任何值。虽然可以取到 length 属性,但是取不到键名
new就是构造方法
Array 是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组
var arr = new Array(2); arr.length // 2
如果没有使用 new ,运行结果也是一样的。var arr = Array(2);
不建议使用它生成新数组,直接使用数组字面量是最简约的做法.字面量:var arr=[];
这个方法就是Array.isArray(),参数写检测的变量c
Array.isArray 方法返回一个布尔值,表示参数是否为数组。它可以弥补typeof 运算符的不足.
字符串不是数组
使用typeof对一个数组进行检测,只会得到一个object的对象类型
push 方法用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度。注意,该方法会改变原数组
pop 方法用于删除数组的最后一个元素,并返回该元素。注意,该方法会改变原数组
对空数组使用 pop 方法,不会报错,而是返回 undefined
push 和 pop 结合使用,就构成了“后进先出”
shift 方法可以遍历并清空一个数组
while (item = list.shift()) { console.log(item); }
unshift 方法可以接受多个参数,这些参数都会添加到目标数组头部
join 方法以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔
如果数组成员是 undefined 或 null 或空位,会被转成空字符串
数组的 join 配合字符串的 split 可以实现数组与字符串的互换
concat 方法用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变
除了数组作为参数, concat 也接受其他类型的值作为参数,添加到目标数组尾部。
[1, 2, 3].concat(4, 5, 6,[7,8,9])
本来是只接收数组对象的,但是数值也可以转换成数组类型使用,如果是数组,就会直接合并到原数组
reverse 方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组
因为字符串没法直接翻转,可以使用split把字符串切割成单字符数组,再使用reverse翻转,再使用join拼接
str1.split(“”).reverse().join()
和字符串的截取方式一样
slice 方法用于提取目标数组的一部分,返回一个新数组,原数组不变
它的第一个参数为起始位置(从0开始),第二个参数为终止位置(但该位置的元素本身不包括在内)。如果省略第二个参数,则一
直返回到原数组的最后一个成员
如果 slice 方法的参数是负数,则表示倒数计算的位置
如果第一个参数大于等于数组长度,或者第二个参数小于第一个参数,则返回空数组
如果无参,就把数组全都打印出来
splice 方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组
splice 的第一个参数是删除的起始位置(从0开始),第二个参数是被删除的元素个数。如果后面还有更多的参数,则表示这些就是要被插入数组的新元素
起始位置如果是负数,就表示从倒数位置开始删除
如果只是单纯地插入元素, splice 方法的第二个参数可以设为 0
如果只提供第一个参数,等同于将原数组在指定位置拆分成两个数组
sort 方法对数组成员进行排序,默认是按照字典顺序排序。排序后,原数组将被改变
sort 方法不是按照大小排序,而是按照字典顺序。也就是说,数值会被先转成字符串,再按照字典顺序进行比较,所以101排在11的前面
indexOf 方法返回给定元素在数组中第一次出现的位置,如果没有出现则返回 -1
indexOf 方法还可以接受第二个参数,表示搜索的开始位置
lastIndexOf 方法返回给定元素在数组中最后一次出现的位置,如果没有出现则返回 -1
这两个方法不能用来搜索 NaN 的位置,即它们无法确定数组成员是否包含 NaN
这是因为这两个方法内部,使用严格相等运算符( === )进行比较,而 NaN 是唯一一个不等于自身的值
JavaScript 有三种声明函数的方法
function print(s) { console.log(s);}
var print = function(s) { console.log(s);};
如果同一个函数被多次声明,后面的声明就会覆盖前面的声明
JavaScript 引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量声明一样,被提升到代码头部。
但是,如果采用赋值语句定义函数,JavaScript 就会报错.赋值语句没有变量提升
// 会报错,因为赋值定义的函数,不能提升
test():
var test(a,b){
console.log(a,b);
}
不能在条件语句中声明函数
根据 ES5 的规范,不得在非函数的代码块中声明函数,最常见的情况就是if语句
Javascript 有两种作用域:一种是全局作用域,变量在整个程序中一直存在;另一种是函数作用域,变量只在函数内部存在
函数外部声明的变量就是全局变量
在函数内部定义的变量,外部无法读取,称为“局部变量”
函数内部定义的变量,会在该作用域内覆盖同名全局变量
局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量
函数内部的变量提升
只要不在函数体内声明的变量,都是全局变量,比如for,if语句里面的都是全局变量
如果全局变量是以参数传入函数,或者是重新使用var声明的变量。在函数内部修改变量,在函数体外部不受影响。
如果全局变量是在函数体内部直接使用,就会被修改。
由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数。这就是arguments对象的由来
var list = function (one) {
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
}
list(1, 2, 3)
JavaScript函数提供两个接口实现与外界的交互,其中参数作为入口,接收外界信息;返回值作为出口,把运算结果反馈给外界
在函数体内,使用 return 语句可以设置函数的返回值。
如果return语句后不跟任何值就相当于返回一个undefined
如果函数中不写return,则也会返回undefined
在函数中return后的语句都不会执行
在 Javascript 中,圆括号()是一种运算符,跟在函数名之后,表示调用该函数。比如,print()就表示调用print函数。那如何让函数自己执行呢
(function(){
/* code */ }());
// 或者
(function(){
/* code */ })();
var a = 10;
var b = 20;
(function (x,y){
console.log(x+y);})(a,b);
将字符串当作语句执行,一般用作代码加密。
eval('var a = 1;');
JavaScript 语言中,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合
var user = {
name: 'itbaizhan',
age: '13'
};
对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用
如果属性的值还是一个对象,就形成了链式引用user.container.frontEnd
读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符
user.hello
user[‘hello’]
如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理
点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值
JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性
查看一个对象本身的所有属性,可以使用 Object.keys(对象名) 方法
delete 命令用于删除对象的属性,删除成功后返回 true。。。。delete user.name
删除一个不存在的属性, delete 不报错,而且返回 true
只有一种情况, delete 命令会返回 false ,那就是该属性存在,且不得删除(使用率极低)
for (var i in user) {
console.log(user[i]);
}
Object 对象的方法分成两类: Object 本身的方法与 Object 的实例方法
跟python的类一样。有类方法,和类的实例方法两种。
Object 对象本身的方法,就是直接定义在 Object 对象的方法
Object 的实例方法,就是定义在 Object 原型对象 Object.prototype 上的方法。它可以被 Object 实例直接使用
Object.prototype.print = function (name) {
console.log(name);
};
var user = {
name:'itbaizhan'
}
user.print(user.name);
就行数组的方法一样,Array.isArray(num1)和num1.pop() 这两种形式。第一种是对象方法,第二种是实例方法。
Math是 JavaScript 的原生对象,提供各种数学功能。
该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用
Math.E:常数e。
Math.LN2:2 的自然对数。
Math.LN10:10 的自然对数。
Math.LOG2E:以 2 为底的e的对数。
Math.LOG10E:以 10 为底的e的对数。
Math.PI:常数 PI。
Math.SQRT1_2:0.5 的平方根。
Math.SQRT2:2 的平方根。Math.E // 2.718281828459045
Math.LN2 // 0.6931471805599453
Math.LN10 // 2.302585092994046
Math.LOG2E // 1.4426950408889634
Math.LOG10E // 0.4342944819032518
Math.PI // 3.141592653589793
Math.SQRT1_2 // 0.7071067811865476
Math.SQRT2 // 1.4142135623730951
这些属性都是只读的,不能修改
因为Math的方法在某些场合下比较适用,我们想要直接适用Math的一些方法,比如求最大值的max
但是,Math.max不接受一个数组作为参数。所以需要使用其他方法使用这个方法。
Math.max.apply(null,arr); apply方法,可以借用math里面的方法,第一个参数为null,第二个参数是数组。然后就可以求出数组的最大值了。
Math.sin():返回参数的正弦(参数为弧度值)
Math.cos():返回参数的余弦(参数为弧度值)
Math.tan():返回参数的正切(参数为弧度值)
Math.asin():返回参数的反正弦(返回值为弧度值)
Math.acos():返回参数的反余弦(返回值为弧度值)
Math.atan():返回参数的反正切(返回值为弧度值)
利用random生成随机数,然后我们自定义一个字符串,也就是十六进制的所有位0123456789abcdef。
利用随机数乘以16,然后取整,再从字符串提取字符。最后把字符拼接。得到随机颜色。
要向下取整,防止超过最大值。
Date()
'Tue Oct 26 2022 10:31:34 GMT+0800 (中国标准时间)'
即使带有参数, Date 作为普通函数使用时,返回的还是当前时间
Date(2000, 1, 1)
// 'Tue Oct 26 2022 10:31:34 GMT+0800 (中国标准时间)'
var today = new Date();
作为构造函数时, Date 对象可以接受多种格式的参数,返回一个该参数对应的时间实例
// 参数为时间零点开始计算的毫秒数
new Date(1635215676627)
// Tue Oct 26 2021 10:34:36 GMT+0800 (中国标准时间)
// 参数为日期字符串
new Date('January 6, 2020');
// Mon Jan 06 2020 00:00:00 GMT+0800 (中国标准时间)
// 参数为多个整数,
// 代表年、月、日、小时、分钟、秒、毫秒
new Date(2020, 0, 1, 0, 0, 0, 0)
// Wed Jan 01 2020 00:00:00 GMT+0800 (中国标准时间)
new Date('2022-2-15')
new Date('2022/2/15')
new Date('02/15/2022')
new Date('2022-FEB-15')
new Date('FEB, 15, 2022')
new Date('FEB 15, 2022')
new Date('Feberuary, 15, 2022')
new Date('Feberuary 15, 2022')
new Date('15 Feb 2022')
new Date('15, Feberuary, 2022')
传两个日期,做差,得到毫秒
var d1 = new Date(2000, 2, 1);
var d2 = new Date(2000, 3, 1);
d2 - d1 // 2678400000 毫秒
Date.now 方法返回当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数,相当于 Unix 时间戳乘以1000
Date.parse 方法用来解析日期字符串,返回该时间距离时间零点(1970年1月1日 00:00:00)的毫秒数
Date.parse(‘Aug 9, 2022’)
Date.parse(‘January 26, 2022 13:51:50’)
Date.parse(‘Mon, 25 Dec 2022 13:30:00 GMT’)
Date.parse(‘Mon, 25 Dec 2022 13:30:00 +0430’)
Date.parse(‘2022-10-10’)
Date.parse(‘2022-10-10T14:48:00’)
Date 的实例对象,有几十个自己的方法,分为三类
to 类:从 Date 对象返回一个字符串,表示指定的时间。
get 类:获取 Date 对象的日期和时间。
set 类:设置 Date 对象的日期和时间。
toUTCString 方法返回对应的 UTC 时间,也就是比北京时间晚8个小时
toDateString 方法返回日期字符串(不含小时、分和秒)
toTimeString 方法返回时间字符串(不含年月日)
toLocaleDateString 方法返回一个字符串,代表日期的当地写法(不含小时、分和秒)
toLocaleTimeString 方法返回一个字符串,代表时间的当地写法(不含年月日)
Date 对象提供了一系列 get* 方法,用来获取实例对象某个方面的值
getTime():返回实例距离1970年1月1日00:00:00的毫秒数
getDate():返回实例对象对应每个月的几号(从1开始)
getDay():返回星期几,星期日为0,星期一为1,以此类推
getYear():返回距离1900的年数
getFullYear():返回四位的年份
getMonth():返回月份(0表示1月,11表示12月)
getHours():返回小时(0-23)
getMilliseconds():返回毫秒(0-999)
getMinutes():返回分钟(0-59)
getSeconds():返回秒(0-59)
Date 对象提供了一系列 set* 方法,用来设置实例对象的各个方面
setDate(date) :设置实例对象对应的每个月的几号(1-31)
setYear(year) : 设置距离1900年的年
setFullYear(year [, month, date]) :设置四位年份
setHours(hour [, min, sec, ms]) :设置小时(0-23)
setMilliseconds() :设置毫秒(0-999)
setMinutes(min [, sec, ms]) :设置分钟(0-59)
setMonth(month [, date]) :设置月份(0-11)
setSeconds(sec [, ms]) :设置秒(0-59)
setTime(milliseconds) :设置毫秒时间戳
因为时间戳是不可重复的,所以,一般使用随机数拼接时间戳。创建唯一的id。只要时间戳不一样,id就永远不一样。所以id越长越安全。
三十六进制:0123456789abcdefghijklmnopqrstuvwxyz
使用tostring(36) 可以把时间戳变成三十六进制的字符串。这样就是随机数+时间戳的三十六进制的超级防伪了。
是js与页面交互的桥梁
js通过DOM操作浏览器
DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个JavaScript 对象,从而可以用脚本进行各种操作(比如对元素增删内容)
浏览器会根据 DOM 模型,将结构化文档HTML解析成一系列的节点,再由这些节点组成一个树状结构(DOM Tree)。所有的节点和最终的树状结构,都有规范的对外接口
DOM 只是一个接口规范,可以用各种语言实现。所以严格地说,DOM 不是 JavaScript 语法的一部分,但是 DOM 操作是 JavaScript最常见的任务,离开了 DOM,JavaScript 就无法控制网页。另一方面,JavaScript 也是最常用于 DOM 操作的语言
节点
DOM 的最小组成单位叫做节点(node)。文档的树形结构(DOM树),就是由各种不同类型的节点组成。每个节点可以看作是文档树的一片叶子
节点的类型有七种
Document:整个文档树的顶层节点,就是html文件
DocumentType:doctype标签,html的声明
Element:网页的各种HTML标签,所有的元素
Attribute:网页元素的属性(比如class=“right”)
Text:标签之间或标签包含的文本
Comment:注释
DocumentFragment:文档的片段
一个文档的所有节点,按照所在的层级,可以抽象成一种树状结构。这种树状结构就是 DOM 树。它有一个顶层节点,下一层都是顶层节点的子节点,然后子节点又有自己的子节点,就这样层层衍生出一个金字塔结构,倒过来就像一棵树
除了根节点,其他节点都有三种层级关系
父节点关系(parentNode):直接的那个上级节点
子节点关系(childNodes):直接的下级节点
同级节点关系(sibling):拥有同一个父节点的节点
不同节点的nodeType属性值和对应的常量如下
文档节点(document):9,对应常量Node.DOCUMENT_NODE
元素节点(element):1,对应常量Node.ELEMENT_NODE
属性节点(attr):2,对应常量Node.ATTRIBUTE_NODE
文本节点(text):3,对应常量Node.TEXT_NODE
文档片断节点(DocumentFragment):11,对应常量Node.DOCUMENT_FRAGMENT_NODE
指向 DOCTYPE 节点,即文档类型(Document Type Declaration,简写DTD)节点。HTML 的文档类型节点,一般写成 !DOCTYPE html 。如果网页没有声明 DTD,该属性返回null
var doctype = document.doctype; // ""
document.documentElement 文档的根节点(root)html
document.body,document.head
document.forms 属性返回所有 form 表单节点
document.images 属性返回页面所有 img 图片节点
document.scripts 属性返回所有 script 节点
一般是判断页面有没有js文件
var scripts = document.scripts;
if (scripts.length !== 0 ) {
console.log('当前网页有脚本');
}
document.domain 属性返回当前文档的域名
document.getElementsByTagName 方法搜索 HTML 标签名,返回符合条件的元素。它的返回值是一个类似数组对象(HTMLCollection 实例),可以实时反映 HTML 文档的变化。如果没有任何匹配的元素,就返回一个空集
通过这种方法可以获取页面中的元素,也可以使用innerHTML修改元素里面的内容
document.getElementsByTagName(‘p’);
包括了所有 class 名字符合指定条件的元素,元素的变化实时反映在返回结果中
由于 class 是保留字,所以 JavaScript 一律使用 className 表示 CSS 的class
参数可以是多个 class ,它们之间使用空格分隔
document.getElementsByName() 通过name属性定位
document.getElementById() 通过id获取
document.querySelector() 通过css的选择器,就是.box等等,这个是只返回一个
document.querySelectorAll() 和上面的用法一样,这里是返回符合的所有元素
document.createElement 生成元素节点
document.createTextNode 生成文本
document.createAttribute 生成属性
添加元素,父元素.appendChild(子元素)
Element对象对应网页的 HTML 元素。每一个 HTML 元素,在DOM 树上都会转化成一个Element节点对象(以下简称元素节点)
div.classList.add('foo', 'bar');
clientHeight 获取元素高度包括 padding 部分,但是不包括 border 、 margin
clientWidth 获取元素宽度包括 padding 部分,但是不包括 border 、 margin
clientLeft 元素节点左边框(left border)的宽度
clientTop 元素节点上边框(top border)的高度
scrollHeight 元素总高度,它包括 padding ,但是不包括 border 、 margin 包括溢出的不可见内容
scrollWidth 元素总宽度,它包括 padding ,但是不包括 border 、 margin 包括溢出的不可见内容
scrollLeft 元素的水平滚动条向右滚动的像素数量
scrollTop 元素的垂直滚动条向下滚动的像素数量
offsetHeight 元素的 CSS 垂直高度(单位像素),包括元素本身的高度、padding 和 border
offsetWidth 元素的 CSS 水平宽度(单位像素),包括元素本身的高度、padding 和 border
offsetLeft 到定位父级左边界的间距
offsetTop 到定位父级上边界的间距
document.getElementById('my-span').focus();
类似百度网页,一打开百度,默认就点击了搜索框。
HTML 元素包括标签名和若干个键值对,这个键值对就称为“属性”(attribute)
元素节点提供四个方法,用来操作属性
Element.getAttribute 方法返回当前元素节点的指定属性。如果指定属性不存在,则返回 null
div.getAttribute('align')
是返回属性的值。
Element.setAttribute 方法用于为当前元素节点新增属性。如果同名属性已存在,则相当于编辑已存在的属性
d.setAttribute('align', 'center');
myImage.setAttribute('src','images/girl.png');
Element.hasAttribute 方法返回一个布尔值,表示当前元素节点是否包含指定属性
d.hasAttribute('align')
Element.removeAttribute 方法用于从当前元素节点移除属性
d.removeAttribute('class');
dataset 属性
比如data-itbaizhan
- var n = document.getElementById(‘box’);
- n.dataset.itbaizhan 定位了data-itbaizhan.对,就是可以省略前面的data前缀,当然,在设置属性的时候,要手动添加这个前缀
Text 节点
文本节点( Text )代表元素节点( Element )和属性节点( Attribute )的文本内容。
使用率很低
Text节点属性
- data 属性用来设置或读取文本节点的内容
// 读取文本内容
document.querySelector('p').firstChild.data
// 设置文本内容
document.querySelector('p').firstChild.data ='Hello World';
文本写在标签里面,这个文本是标签的子元素。文本和元素本身不是平级的。
- length 属性返回当前文本节点的文本长度
Text节点方法
就是对text节点进行增删查改
- appendData() 在 Text 节点尾部追加字符串
- deleteData(index,len) 删除 Text 节点内部的子字符串,第一个参数为子字符串开始位置,第二个参数为子字符串长度
- insertData() 在 Text 节点插入字符串,第一个参数为插入位置,第二个参数为插入的子字符串
- replaceData() 用于替换文本,第一个参数为替换开始位置,第二个参数为需要被替换掉的长度,第三个参数为新加入的字符串
- substringData() 用于获取子字符串,第一个参数为子字符串在 Text 节点中的开始位置,第二个参数为子字符串长度
- remove 方法用于移除当前 Text 节点
DocumentFragment 节点(了解)
本质是一个临时文件,存放我们想要创建的标签。然后一次性插入页面
DocumentFragment 节点本身不能被插入当前文档,插入文档中的是他里面的子元素
多次操作DOM,可以使用 DocumentFragment 变成一次操作,节省了内存的消耗
Node 节点属性
所有 DOM 节点都继承了 Node 接口,拥有一些共同的属性和方法。这是 DOM 操作的基础
节点的类型有七种
Document:整个文档树的顶层节点
DocumentType:doctype标签 (用不到)
Element:网页的各种HTML标签
Attribute:网页元素的属性(比如class=“right”)
Text:标签之间或标签包含的文本
Comment:注释
DocumentFragment:文档的片段
-
nodeName 属性返回节点的名称
-
不同节点的 nodeName 属性值如下
- 文档节点(document): #document
- 元素节点(element):大写的标签名
- 属性节点(attr):属性的名称
- 文本节点(text): #text
- 文档片断节点(DocumentFragment): #document-fragment
- 文档类型节点(DocumentType):文档的类型
- 注释节点(Comment): #comment
-
nodeValue 属性返回一个字符串,表示当前节点本身的文本值,该属性可读写
-
textContent 属性返回当前节点和它的所有后代节点的文本内容
-
nextSibling 属性返回紧跟在当前节点后面的第一个同级节点。如果当前节点后面没有同级节点,则返回 null
-
previousSibling 属性返回当前节点前面的,距离最近的一个同级节点。如果当前节点前面没有同级节点,则返回 null
-
parentNode 属性返回当前节点的父节点。对于一个节点来说,它的父节点只可能是三种类型:元素节点(element)、文档节点(document)和文档片段节点(documentfragment)
-
firstChild/lastChild
- firstChild 属性返回当前节点的第一个子节点,如果当前节点没有子节点,则返回 null
- lastChild 属性返回当前节点的最后一个子节点,如果当前节点没有子节点,则返回 null 。用法与 firstChild 属性相同
-
childNodes 属性返回一个类似数组的对象( NodeList 集合),成员包括当前节点的所有子节点
- 可以使用数组的方法去读取,但是不能使用数组的方式去修改
- 使用该属性,可以遍历某个节点的所有子节点
-
appendChild 方法接受一个节点对象作为参数,将其作为最后一个子节点,插入当前节点。该方法的返回值就是插入文档的子节点
- 动态增加内容
-
hasChildNodes 方法返回一个布尔值,表示当前节点是否有子节点
-
cloneNode 方法用于克隆一个节点。它接受一个布尔值作为参数,表示是否同时克隆子节点。它的返回值是一个克隆出来的新节点
-
insertBefore 方法用于将某个节点插入父节点内部的指定位置
- insertBefore 方法接受两个参数,第一个参数是所要插入的节点newNode ,第二个参数是父节点 parentNode 内部的一个子节点referenceNode 。 newNode 将插在 referenceNode 这个子节点的前面。返回值是插入的新节点 newNode 。
-
removeChild 方法接受一个子节点作为参数,用于从当前节点移除该子节点。返回值是移除的子节点
-
replaceChild 方法用于将一个新的节点,替换当前节点的某一个子节点
- replaceChild 方法接受两个参数,第一个参数 newChild 是用来替换的新节点,第二个参数 oldChild 是将要替换走的子节点。返回值是替换走的那个节点 oldChild
CSS操作
- HTML 元素的 style 属性
操作 CSS 样式最简单的方法,就是使用网页元素节点的 setAttribute 方法直接操作网页元素的 style 属性
div.setAttribute( 'style', 'background-color:red;' + 'border:1px solid black;' );
- 元素节点的 style 属性
var divStyle =
document.querySelector('div').style;
divStyle.backgroundColor = 'red';
divStyle.border = '1px solid black';
divStyle.width = '100px';
divStyle.height = '100px';
divStyle.fontSize = '10em';
- cssText 属性
var divStyle = document.querySelector('div').style;
divStyle.cssText = 'background-color: red;border: 1px solid black;height: 100px;width: 100px;';
事件处理
就是控件与槽函数之间的桥梁,事件
-
事件处理程序分为:
1 HTML事件处理
2 DOM0级事件处理
3 DOM2级事件处理
4 IE事件处理 (弃用)
-
HTML事件
- 优点:简单
- 缺点:html和js写在一个文件里面,不利于后期维护
- 移除事件,只能删掉槽函数或者覆盖槽函数(弃用)
DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>Js事件详解--事件处理title>
head>
<body>
<div id="div">
<button id="btn1" onclick="demo()">按钮button>
div>
<script>
function demo(){
alert("hello html事件处理");
}
script>
body>
html>
就是在元素里面增加onclick属性,后面写要执行的事件。
- DOM0级事件处理
- 优点:html和js分离
- 缺点:同名槽函数会覆盖,以最后一个为准。如果没有同名函数就没问题了
- 使用οnclick=null移除事件
<body>
<div id="div">
<button id="btn1">按钮button>
div>
<script>
var btn1=document.getElementById("btn1");
btn1.onclick=function(){
alert("HelloDOM0级事件处理程序1");}//被覆盖掉
btn1.onclick=function(){
alert("HelloDOM0级事件处理程序2");}
script>
body>
和html事件一样,就是不用特意添加onclick属性了。
- DOM2级事件处理
- 优点:html与js分离,事件不覆盖
- 缺点:复杂
- 移除事件removeEventListener(“click”,demo2);,第一个参数是事件,第二个是槽函数
<body>
<div id="div">
<button id="btn1">按钮button>
div>
<script>
var btn1=document.getElementById("btn1");
btn1.addEventListener("click",demo1);
btn1.addEventListener("click",demo2);
btn1.addEventListener("click",demo3);
function demo1(){
alert("DOM2级事件处理程序1")
}
function demo2(){
alert("DOM2级事件处理程序2")
}
function demo3(){
alert("DOM2级事件处理程序3")