javascript学习
程序运行
硬盘----内存条----cpu
- 打开某个程序,先把硬盘中的程序代码加载到内存中,
- cpu运行程序代码
一、初识JavaScript
JavaScript是脚本语言,既可以做前台也可以做后台, 脚本语言:不需要编译,运行过程由JS解释器逐步来进行解释并执行。 JavaScript的作用
- 表单动态校验(js的最初目的)
- 网页特效
- 服务端开发(Node.js)
- 桌面程序(Electron)
- app(Cordova)
- 控制硬件–物联网(Ruff)
- 游戏开发(cocos2d-js)
浏览器执行JS简介 浏览器本身不会执行js代码,而是通过内置的JavaScript引擎来执行js代码,JS引擎执行代码时逐行进行解释每一句源码,
js的组成 javascript语法:ECMAScript 页面文档对象模型:DOM 浏览器对象模型:BOM
js初体验
- 注意单双引号的使用:在HTML中推荐用双引号,js中推荐用单引号
注释:
- 单行注释:ctrl+/
- 多行注释;shift+alt+a
<script>
prompt('请输入您的年纪');
alert('计算');
console.log('这是控制台打印');
</script>
二、变量
什么是变量 通俗:变量是用于存放数据的容器,我们通过变量获取数据, 本质:变量是程序在内存中申请的一块用来存放数据的空间
使用变量 变量使用分两步;
-
申明变量
var age;
-
赋值 ?
age=18;
变量初始化
var age=18;
例子:产生输入值,存入变量,然后弹出内容。
<script>
var myname = prompt('请输入弹出内容:');
alert(typeof myname);
</script>
- 只申明不赋值,结果undefined
三、数据类型
var num=10;
var a='是的';
简单数据类型
简单数据类型 | 说明 | 默认值 |
---|
Number | 数字型 | 0 | Boolean | 布尔类型 | false | String | 字符串类型 | ‘’ | Undefined | var a;声明了变量a但没有给值,此时a=undefined | undefined | Null | var a =null; 声明 了变量a 为空值 | object |
数字型
![image-20210802141432411]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210802141432411.png)
![image-20210802141525369]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210802141525369.png)
console.log(isNaN(12));
String
-
字符串引号嵌套,(外双内单,外单内双) var str='我是一个"高富帅"的程序员';
-
字符串转义字符 都是用\开头 但这些转义字符写到引号里面, 例子: var str1="我是一个'高富帅'\n程序员";
console.log(str1);
-
通过字符串的length属性检测字符串的长度。 -
字符串的拼接 +;(字符串+任何类型=拼接后的新字符串) console.log('沙漠'+'骆驼');
console.log('12'+12);
var age=18;
console.log('我'+age+'岁');
口诀:数值相加,字符相连 布尔型 true参与加法运算当1来看; false参与加法运算当0来看; undefined
![image-20210802150101166]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210802150101166.png)
对数据类型的操作
检测变量的数据类型 typeof
var num=10;
console.log(typeof num);
var str='pink';
console.log(typeof str);
字符类型转换
- 转字符型
var num = 10;
var str = num.toString();
console.log(str);
console.log(typeof str);
console.log(typeof String(num));
console.log(typeof(num + ''));
- 转数字型
console.log(parseInt('3.14'));
console.log(parseInt('120px'));
console.log(parseFloat('3.14'));
var str='123';
console.log(Number(str));
console.log('12'-0);
案例:
var year =promt('请输入出生年份:');
var age=2021-year;
alert('今年'+age+'岁了');
-
转布尔类型 console.log(Boolean(''));
代表空、否定的值会被转换为false,如’’、0、NaN、null、undefined.
课后拓展
解释型语言和编译型语言
编译语言----翻译器—机器语言
翻译器有两种翻译方式:一个是编译,一个是解释。
区别:编译器是代码开始之前进行编译,生成中间代码文件;解释器是在运行时进行及时解释,并立即执行。
四、javascript的运算符
![image-20210808204238132]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210808204238132.png)
注意:=== 和 ==的区别, == 表示先转换类型(自动)再比较。
=== 先判断数据类型,(类型不同时,不会自动转换类型)如果不是同一类型直接为false。如果类型相同,再判断其值,如果值也相同则返回true,否则返回false。表示的是绝对的相等。
运算符优先级练习
console.log(4>=6||'人'!='阿凡达'&&!(12*2==144)&& ture)
var num=10;
console.log(5==num/2&&(2+2*num).toString()==='2');
五、javascript的流程控制分支结构及循环
if else if 分支语句
if (表达式1){}
else if(表达式2){}
else if(表达式3){}
else{}
switch的注意事项
var num = 1;
switch(num){
case 1:
console.log(1);
case 2:
console.log(2);
case 3:
console.log(3);
break;
}
- 开发里面表达式不能写成变量
- num的值和case里面的值相匹配的时候是全等,必须是值和数据类型一致才可以 num===1;
- break 如果当前的case里面没有break,则不会退出switch,继续执行case;
循环
for循环
案例:
var num=prompt('请输入班级总人数:');
var sum=0;
var average=0;
for(var i=1;i<=num;i++){
var score=prompt('请输入第' + i + '个学生成绩');
sum =sum +praseFloat(score);
}
average =sum/num;
alert('班级总的成绩是' +sum);
alert('班级的平均分是:' +average);
while循环 先执行,再判断
do while 循环 先判断,再执行
区别 :while与do while相对for 可以做更复杂的判断
断点调试
- 浏览器中按F12–>sources–>找到要调试的文件
- 点击行号,设置断点,
- 刷新浏览器,完成断点设置
- Watch:监视,可以监听变量值的变化
- F11:程序单步执行,一行一行的让程序执行。
js命名规范及语法格式
? ![image-20210811092818601]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210811092818601.png)
![image-20210811092928460]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210811092928460.png)
![image-20210811093033609]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210811093033609.png)
![image-20210811093129810]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210811093129810.png)
七、数组
创建数组
-
利用new创建数组\ var arr = new Array();`` -
利用数组字面量来创建数组[] ? var arr = [1,2,3];
求数组中最大值
var arr = [2, 6, 4, 7, 8, 8];
var max = arr[0];
for (var i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
console.log('该数组里面的最大值是:' + max);
筛选数组的方法
var arr=[2,45,8,4,3,7,6];
var newArr = [];
for (var i=0; i < arr.length;i++){
if(arr[i] >= 10){
neweArr[newArr.length] = arr[i];
}
}
console.log(newArr);
数组排序(冒泡排序)
冒泡排序:是一种算法,把一系列的数据按照一定的顺序排列进行显示(一次比较两个元素,如果顺序错误就把他们交换过来)
案例
![image-20210811145156319]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210811145156319.png)
八、函数
函数的概念、使用及参数
函数:就是封装了一段可被重复调用执行的代码块,通过此代码块可以实现大量的代码的重复使用。
函数使用
1.声明函数
- function声明函数的关键字 全部小写
- 函数是做某件事 ,函数名一般是动词
- 函数不调用自己不执行
-
调用函数 函数名();
-
函数的封装
![image-20210811152231538]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210811152231538.png)
-
函数的参数
- 声明函数的时候,函数名括号里的是形参,形参默认值undefined
- 调用函数的时候,函数名括号里面的是实参。
参数的作用:在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去。
函数的返回值
return 终止函数,即return语句之后的代码不会被执行。
return、continue、break区别
![image-20210811154531331]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210811154531331.png)
arguments的使用
作用:当我们不确定有多少个参数传递,可以用arguments来获取。
在js中arguments实际上是当前函数的内置对象,所有函数都内置了这个对象,arguments 对象里面存储了所有传递过来的实参。
function fn() {
console.log(arguments);
console.log(arguments[2]);
for (var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
fn(1, 2, 3, 4, 5);
函数的两种声明方式
- 利用函数关键字自定义函数(命名函数)
function fn(){
}
fn();
- 函数表达式(匿名函数)
var fun = function(aru){
console.log('我是函数表达式');
console.log(aru);
}
fun('pink老师');
作用域
- js作用域:就是代码名字(变量) 在某个范围内起作用和效果,目的是为了提高程序的可靠性更重要的是减少命名冲突
- js的作用域(es6)之前:全局作用域 局部作用域
- 全局作用域:整个script标签或者是一个单独的js文件
var num =10;
console.log(num);
- 局部作用域(函数作用域) 在函数内部就是局部作用域,这个代码的名字只在函数内部器效果和作用
function fn(){
var num = 20;
console.log(num);
}
fn();
因此变量有局部变量和全局变量
从执行效率来看全局变量和局部变量
- 全局变量只有浏览器关闭时才会销毁,比较占内存资源
- 局部变量 当我们程序执行完毕就会销毁,比较节约内存资源
- 没有var 声明的变量当全局变量
注:js 现阶段没有块级作用域,我们js也是在es6的时候新增的块级作用域
if(xx){
int num = 10;
}
if(3 < 5){
var num = 10;
}
console.log(num);
作用域链
function f1(){
var num = 123;
function f2(){
console.log(num);
}
f2();
}
var num = 456;
fn();
![image-20210811213854841]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210811213854841.png)
预解析
- 我们js引擎运行分为两步: 预解析 代码执行
- 预解析js引擎会把js 里面所有的 var 还有 function 提升到当前作用域的最前面
- 代码执行 按照代码书写的顺序从上往下执行
-
预解析分为变量解析(变量提升)和函数预解析(函数提升)
- 变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
- 函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
console.log(num);
var num = 10;
fn();
function fn(){
console.log(11);
}
fun();
var fun = function(){
console.log(22);
}
案例:
var num =10;
function fn(){
console.log(num);
var num = 20;
console.log(num);
}
fn();
特例:
var a = b = c = 9;
九、对象
对象的概念及创建对象的方法
对象的概念:对象是一组无序的相关属性和方法的集合。 一个具体的事物
-
属性:事物的特征 (常用名词) -
方法:事物的行为 (常用动词)
利用对象字面量创建对象{}
var obj = {
uname:'叶问',
age:18,
sex:'男',
sayHi:function(){
console.log('hi~');
}
}
使用对象
console.log(obj.uname);
console.log(obj['age']);
obj.sayHi();
变量、属性、函数、方法的区别
-
变量和属性的相同,他们都是用来存储数据的 var num = 10;
var ogj = {
age:18
}
console.log(obj.age);
-
函数和方法的相同点: 都是实现某种功能 做某件事 不同: 函数是单独声明 并且调用的 函数名() 单独存在的, ? 方法 在对象里面 调用的时候 对象.方法()
利用new Object 创建对象
var obj = new Object();
obj.uname = '叶问';
obj.age = 18;
obj.sayHi = function(){
console.log('hi~');
}
console.log(obj.uname);
console.log(obj['age']);
obj.sayHi();
构造函数
构造函数的作用:一次创建一个对象,里面很多的属性和方法是大量相同的 ,为了避免重复写代码,我们通过构造函数来利用这些重复代码。
利用构造函数创建对象
![image-20210812221759314]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210812221759314.png)
function Star(uname,age,sex){
this.name=uname;
this.age=age;
this.sex=sex;
this.sing = function(sang){
console.log(sang);
}
}
varldh = new Star('刘德华','18','男');
ldh.sing('冰雨');
new关键字执行过程
- new构造函数可以在内存中创建一个空 的对象
- this 就会指向这个新的对象
- 执行构造函数里面的代码,给这个新对象添加属性和方法
- 返回这个新对象
遍历对象属性
for…in语句用于对数组或对象的属性进行循环操作
var obj = {
name:'fjal',
age:18,
fn:function(){}
}
for(var k in obj){
console.log(k);
console.log(obj[k]);
}
小结:
![image-20210813154759965]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813154759965.png)
内置对象
对象类别:
- 自定义对象
- 内置对象
- 浏览器对象
作用:提供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)
内置对象值js 语言自带的一些对象,其中常用的有:
Math对象
日期对象
数组对象
字符串对象
查文档
通过MDN/W3C 来查询
![image-20210813160805357]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813160805357.png)
MDN:htttp://developer.mozilla.org/zh-CN/
![image-20210813155815126]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813155815126.png)
常用的对象
Math数学对象,不是一个构造函数,不需要new,可以直接使用里面的属性和方法
console.log(Math.PI);
console.log(Math.max(1,99,3));
![image-20210813162350286]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813162350286.png)
随机数案例:
function getRandom(min,max){
return Math.floor(Math.random()*(max - min + 1)) +min;
}
var random = getRandom(1,10);
while(true){
var num = prompt('你来猜 输入1~10之间的一个数字');
if(num > random){
alert('你猜大了');
}else if(num < random){
alert('你猜小了');
}else {
alert('你好帅哦,猜对了');
break;
}
}
日期对象
var arr = new Array();
var obj = new Object();
var date = new Date();
console.log( date);
var date1 = new Date(2019,10,1);
console.log(date1);
var date2 = new Date('2019-10-1 8:8:8');
console.log(date2)
![image-20210813172126393]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813172126393.png)
日期格式化
![image-20210813180021640]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813180021640.png)
案例:
function getTime(){
var time = new Date();
var h = time.getHours();
h = h < 10 ? '0' + h : h;
var m = time.getMinutes();
m = m < 10 ? '0' + m : m;
var s = time.getSeconds();
s = s < 10 ? '0' + s : s;
return h + ':' + m + ':' + s;
}
console.log(getTime());
获得Date总的毫秒数
var date = new Date();
console.log(date.valueOf());
console.log(date.getTime());
var date1 = +new Date();
console.log(date1);
console.log(Date.now());
倒计时效果
![image-20210813195014158]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813195014158.png)
function countDown(time) {
var nowTime = +new Date();
var inputTime = +new Date(time);
var times = (inputTime - nowTime) / 1000;
var d = parseInt(times / 60 / 60 / 24);
d = d <10 ? '0' + d : d;
var h = parseInt(times / 60 / 60 % 24);
h = h <10 ? '0' + h : h;
var m = parseInt(times / 60 % 60);
m = m <10 ? '0' + m : m;
var s = parseInt(times % 60);
s = s <10 ? '0' + s : s;
return d + '天' + h + '时' + m + '分' + s + '秒';
}
console.log(countDown('2021-8-13 20:10:00'));
数组对象
检测是否为数组
- instanceof 运算符 可以用来检测
var arr = [];
console.log(arr instanceof Array);
-
Array.isArray(参数); H5新增的方法 ie9以上的版本支持 console.log(Array.isArray(arr));
添加删除数组元素的方法
![image-20210813204708680]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813204708680.png)
- push()在我们数组的末尾 添加一个或者多个数组的元素 push 推
var arr = [1,2,3]; arr.push(4,'pink');
console.log(arr);
-
unshift() 在数组开头 添加一个或者多个数组元素 -
pop() 可以删除数组最后一个元素 console.log(arr.pop());
console.log(arr);
- pop() 没有参数
- pop完毕之后,返回的结果是删除的那个元素
-
shift() 可以删除数组的第一个元素
数组排序
![image-20210813205149017]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813205149017.png)
var arr = ['pink', 'red', 'blue'];
arr.reverse();
console.log(arr);
var arr1 = [12, 3, 77, 1, 7];
arr1.sort(function(a, b) {
return a - b;
})
console.log(arr1);
数组索引
![image-20210813210302332]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813210302332.png)
-
返回数组元素索引号方法 indexOf(数组元素) 作用是返回该数组元素的索引号从前面开始查找
- 它只返回第一个满足条件的索引号
- 它如果在该数组里面找不到元素,则返回-1
var arr = ['red','green','blue','pink','blue'];
console.log(arr.indexOf('blue'));
- lastIndexOf(数组元素) 作用就是返回该数组元素的索引号 从后面开始查找
数组去重案例:
![image-20210813213701020]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813213701020.png)
function unique(arr){
var newArr = [];
for (var i =0;i < arr.length; i++){
if(newArr.indexOf(arr[i]) === -1){
newArr.push(arr[i]);
}
}
return newArr;
}
var demo = unique(['c','a','z','a','x','a','c']);
console.log(demo);
数组转换为字符串
![image-20210813213737425]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813213737425.png)
var arr = [1,2,3];
console.log(arr.toString());
console.log(arr.join('-'));
数组连接、截取、删除(第几个开始,要删除的个数);
![image-20210813214420121]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813214420121.png)
字符串对象
基本包装类型: 就是把简单数据类型 包装成为了复杂数据类型
var temp = new String('andy');
str = temp;
temp = null;
字符串的不可变性:
![image-20210813215839203]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813215839203.png)
根据字符查找
var str = '改革春风吹满地';
console.log(str.indexOf('春'));
![image-20210813220346582]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813220346582.png)
经典案例:
![image-20210813220646016]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813220646016.png)
var str = 'avcoefoxyfjoalef';
var num = 0;
var index = str.indexOf('o');
while (index !== -1) {
console.log(index);
num++;
index = str.indexOf('o', index + 1);
}
console.log('o出现的次数是:' + num);
根据位置返回字符
![image-20210813221836631]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210813221836631.png)
var str = 'andy';
console.log(str.charAt(3));
for (var i = 0;i < str.length;i++){
console.log(str.charAt(i));
}
console.log(str.charCodeAt(0));
console.log(str[0]);
统计出现最多的字符及其次数案例:
![image-20210814100150940]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210814100150940.png)
var str = 'fasefaewfsasdfjewo';
var a = {};
for (var i = 0;i < str.length;i++){
var chars = str.charAt(i);
if (a[chars]){
a[chars]++;
}else {
a[chars] = 1;
}
}
console.log(a);
var max = 0 ;
var ch = '';
for(var k in a){
if (a[k] > max){
max = a[k];
ch = k;
}
}
console.log(max);
console.log('最多的字符是:' + ch);
字符串操作方法
![image-20210814103125849]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210814103125849.png)
var str = 'andy';
console.log(str.concat('red'));
var str1 = '尬死了干净啊是垃圾';
console.log(str1.substr(2,2));
![image-20210814103653082]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210814103653082.png)
数据类型
一个特殊的简单数据类型
// 简单数据类型 null 返回的是一个空对象 object
var timer = null;
console.log(typeof timer);
堆和栈
- 栈:简单数据类型放到栈里面,
- 堆:复杂数据类型放到堆里面,
简单数据类型饭放在栈里面,直接开辟一个空间
复杂数据类型
![image-20210814110321822]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210814110321822.png)
复杂数据类型的传参
函数的形参也可以看作一个变量,当我们把引用类型变量传给形参时,其实时把变量在栈空间保持的堆地址复制给了形参,形参和实参保存同一个堆地址,所以操作的是同一个对象。
十、web APIs
API和 web API
![image-20210814112929703]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210814112929703.png)
DOM
DOM: 文档对象模型,是W3C组织推荐的处理可扩展标记语言的标准编程接口
DOM树:
- 文档:一个页面就是一个文档,DOM中使用document表示
- 元素:页面中的的所有标签都是元素,DOM中使用element表示
- 节点:网页中的所有内容都是节点(标签, 属性, 文本, 注释等), DOM中使用node表示
![image-20210814154702981]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210814154702981.png)
DOM把以上内容都可以看作是对象
获取元素
- 根据ID获取
- 根据标签名获取
- 通过HTML5新增的方法获取
- 特殊元素获取
- getElementById()方法获取id
<div id="time">2021-8-14</div>
<script>
var timer = document.getElementById('time');
console.log(timer);
console.log(typeof timer);
console.dir(timer);
timer.innerHTML = '2014';
</script>
- 根据标签名获取
使用 getElementsByTagName() 获取标签名
<ul id="ul">
<li>生僻字</li>
<li>生僻字</li>
<li>生僻字</li>
<li>生僻字</li>
<li>生僻字</li>
</ul>
<script>
var lis = document.getElementsByTagName('li');
console.log(lis);
console.log(lis[0]);
for (var i = 0; i < lis.length; i++) {
console.log(lis[i]);
}
var ul = document.getElementById('ul');
console.log(ul.getElementsByTagName('li'));
</script>
![image-20210814165153679]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210814165153679.png)
-
通过HTML5新增的方法获取
- 根据类名
- 根据指定选择器返回第一个元素对象
- 根据指定选择器返回
![image-20210814174659057]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210814174659057.png)
<div class = 'box'>
盒子
</div>
<div class = 'box'>
盒子
</div>
<div id='nav'>
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
var firstBox = document.querySelector('.box');
console.log(firstBox);
var nav = document.querySelector('#nav');
</script>
获取特殊元素
var bodyEle = document.body;
console.log(bodyEle);
console.log(bodyEle);
var htmlEle = document.documentElement;
console.log(htmlEle);
事件
事件:由三部分组成,事件源 事件类型 事件处理程序 ,这是事件三要素
事件执行的步骤
- 获取事件源
- 注册事件(绑定事件)
- 添加事件处理程序(采取函数赋值的形式)
操作 元素
DOM操作可以改变网页的内容,结构,样式.
改变元素内容
案例:
<button>
显示当前系统时间
</button>
<div>
某个时间
</div>
<p>asfa</p>
<script>
var btn = document.querySelector('button');
var div = document.querySelector('div');
btn.onclick = function() {
div.innerText = getTime();
}
function getTime() {
var time = new Date();
var h = time.getHours();
h = h < 10 ? '0' + h : h;
var m = time.getMinutes();
m = m < 10 ? '0' + m : m;
var s = time.getSeconds();
s = s < 10 ? '0' + s : s;
return h + ':' + m + ':' + s;
}
var p = document.querySelector('p');
p.innerText = getTime();
</script>
innerText 和 innerHTML的区别
<div></div>
<p>
我是文字
<span>sljf</span>
</p>
<script>
var div = document.querySelector('div');
var p = document.querySelector('p');
console.log(p.innerText);
console.log(p.innerHTML);
</script>
常用元素的属性操作
- innerText、innerHTML改变元素内容
- src、href
- id、alt、title
案例:
分时显示不同在图片,显示不同问候语
思路
![image-20210814212940198]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210814212940198.png)
<img src="img/s中午好.gif" alt="">
<div>
中午好
</div>
<script>
var img = document.querySelector('img');
var div = document.querySelector('div');
var date = new Date();
var h = date.getHours();
if (h > 12) {
img.src = 'img/s中午好.gif';
div.innerHTML = '中午好';
} else {
img.src = 'img/上午好.gif';
div.innerHTML = '亲,上午好'
}
</script>
表单元素的属性操作
![image-20210815095033695]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815095033695.png)
<button>
按钮
</button>
<input type="text" value="输入内容">
<script>
var btn = document.querySelector('button');
var input = document.querySelector('input');
btn.onclick = function() {
input.value = '被点击了';
this.disabled = true;
}
</script>
仿京东密码显示隐藏案例:
![image-20210815101938437]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815101938437.png)
<div class="box">
<label for="">
<img src="img/yan.jpg" alt="" id="eye">
</label>
<input type="password" name="" id="pwd">
</div>
<script>
var eye = document.getElementById('eye');
var pwd = document.getElementById('pwd');
var flag = 0;
eye.onclick = function() {
if (flag == 0) {
pwd.type = 'text';
eye.src = 'img/s中午好.gif';
flag = 1;
} else {
pwd.type = 'password';
eye.src = 'img/yan.jpg';
flag = 0;
}
}
</script>
样式属性操作
![image-20210815110132608]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815110132608.png)
<style>
div{
width: 200px;
height:200px;
background-color:pink;
}
</style>
<div>
</div>
<script>
var div = document.querySelector('div');
div.onclick = function(){
this.style.backgroundColor = 'purple';
this.style.width = '250px';
}
</script>
循环精灵图案例:
<style>
.box {
width: 250px;
margin: 100 auto;
}
.box li {
background-color: firebrick;
width: 24px;
height: 24px;
margin: 15px auto;
background: url(img/精灵图.png) no-repeat;
}
</style>
<div class="box">
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
<script>
var lis = document.querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
var index = i * 44;
lis[i].style.backgroundPosition = '0 -' + index + 'px';
}
</script>
显示隐藏文本框内容
<input type="text" value="手机">
<script>
var text = document.querySelector('input');
text.onfocus = function() {
if (this.value === '手机') {
this.value = '';
}
this.style.color = '#333';
}
text.onblur = function() {
if (this.value === '') {
this.value = '手机';
}
this.style.color = '#999';
}
</script>
className更元素样式
![image-20210815153929491]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815153929491.png)
总结
操作元素
- 操作元素内容
- 操作常见元素属性
- 操作表单元素属性
- 操作元素样式属性
排他算法
![image-20210815160129844]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815160129844.png)
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<script>
var btns = document.getElementsByTagName('button');
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function() {
for (var i = 0; i < btns.length; i++) {
btns[i].style.backgroundColor = '';
}
this.style.background = 'pink';
}
}
</script>
百度换肤案例:
![image-20210815162122203]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815162122203.png)
表格经过变色案例
![image-20210815162722571]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815162722571.png)
![image-20210815170217878]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815170217878.png) thead是不参与操作的
![image-20210815162829937]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815162829937.png)
表单全选取消全选案例:
<div class="wrap">
<table>
<thead>
<tr>
<th>
<input type="checkbox" id="j_cbAll">
</th>
<th>商品</th>
<th>价钱</th>
</tr>
</thead>
<tbody id="j_tb">
<tr>
<td>
<input type="checkbox">
</td>
<td>sadf</td>
<td>sdaf</td>
</tr>
<tr>
<td>
<input type="checkbox">
</td>
<td>dsf</td>
<td>sfsa</td>
</tr>
<tr>
<td>
<input type="checkbox">
</td>
<td>dfs</td>
<td>sdfasd</td>
</tr>
</tbody>
</table>
</div>
<script>
var j_cbAll = document.getElementById('j_cbAll');
var j_tbs = document.getElementById('j_tb').getElementsByTagName('input');
j_cbAll.onclick = function() {
for (var i = 0; i < j_tbs.length; i++) {
j_tbs[i].checked = this.checked;
}
}
for (var i = 0; i < j_tbs.length; i++) {
j_tbs[i].onclick = function() {
var flag = true;
for (var i = 0; i < j_tbs.length; i++) {
if (!j_tbs[i].checked) {
flag = false;
break;
}
}
j_cbAll.checked = flag;
}
}
</script>
自定义属性操作
![image-20210815210645037]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815210645037.png)
区别:
- element.属性 获取的是内置属性值(元素本身自带的属性)
- element.getAttribute(‘属性’); 主要获得自定义的属性(标准) 我们程序员自定义的属性
![image-20210815211527543]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815211527543.png)
<div id="demo" index="1" class="nav"></div>
<script>
var div = document.querySelector('div');
console.log(div.id);
console.log(div.getAttribute('id'));
console.log(div.getAttribute('index'));
div.id = 'test';
div.className = 'navs';
div.setAttribute('index', 2);
div.setAttribute('class', 'footer');
div.removeAttribute('index');
</script>
重点案例:
tab栏切换
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style-type: none;
}
.tab {
width: 978px;
margin: 100px auto;
}
.tab_list {
height: 39px;
border: 1px solid #ccc;
background-color: #f1f1f1;
}
.tab_list li {
float: left;
height: 39px;
line-height: 39px;
padding: 0 20px;
text-align: center;
cursor: pointer;
}
.tab_list .current {
background-color: #c81623;
color: #fff;
}
.item_info {
padding: 20px 0 0 20px;
}
.item {
display: none;
}
</style>
//-----------------------------
<div class="tab">
<div class="tab_list">
<ul>
<li class="current">商品介绍</li>
<li>规格与包装</li>
<li>售后保障</li>
<li>商品评价(50000)</li>
<li>手机社区</li>
</ul>
</div>
<div class="tab_con">
<div class="item" style="display: block;">
商品介绍模块内容
</div>
<div class="item">
规格与包装模块内容
</div>
<div class="item">
售后保障模块内容
</div>
<div class="item">
商品评价(50000)模块内容
</div>
<div class="item">
手机社区模块内容
</div>
</div>
</div>
<script>
var tab_list = document.querySelector('.tab_list');
var lis = tab_list.querySelectorAll('li');
var items = document.querySelectorAll('.item');
for (var i = 0; i < lis.length; i++) {
lis[i].setAttribute('index', i);
lis[i].onclick = function() {
for (var i = 0; i < lis.length; i++) {
lis[i].className = '';
}
this.className = 'current';
var index = this.getAttribute('index');
console.log(index);
for (var i = 0; i < items.length; i++) {
items[i].style.display = 'none';
}
items[index].style.display = 'block';
}
}
</script>
-
设置H5自定义属性 H5规定自定义属性data-开头作为属性名并且赋值。 比如 <div data-index = "1"></div>
//或者js设置
element.setAttribute('data-time',20);
![image-20210815215450936]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210815215450936.png)
节点操作
- 利用DOM提供的方法获取元素
- document.getElementById()
- document.getElementsByTagName()
- document.querySelector等
- 逻辑性不强
- 利用节点层级关系获取元素
节点概述
- 元素节点nodeType为1;
- 属性节点nodeType为2
- 文本节点nodeType为3
<div>我是div</div>
<span>我是span</span>
<ul>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
</ul>
<div class="demo">
<div class="box">
<span class="erweima">×</span>
</div>
</div>
<script>
var erweima = document.querySelector('.erweima');
console.log(erweima.parentNode);
var ul = document.querySelector('ul');
var lis = ul.querySelectorAll('li');
console.log(ul.childNodes);
console.log(ul.childNodes[0].nodeType);
console.log(ul.childNodes[1].nodeType);
console.log(ul.children);
</script>
新浪下拉菜单案例:
![image-20210816111855929]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816111855929.png)
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style-type: none;
}
a {
text-decoration: none;
font-size: 14px;
}
.nav {
margin: 100px;
}
.nav>li {
position: relative;
float: left;
width: 80px;
height: 41px;
text-align: center;
}
.nav li a {
display: block;
width: 100%;
height: 100%;
line-height: 41px;
color: #333;
}
.nav>li>a:hover {
background-color: #eee;
}
.nav ul {
display: none;
position: absolute;
top: 41px;
left: 0;
width: 100%;
border-left: 1px solid #FECC5B;
border-right: 1px solid #FECC5B;
}
.nav ul li {
border-bottom: 1px solid #FECC5B;
}
.nav ul li a:hover {
background-color: #FFF5DA;
}
</style>
<ul class="nav">
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
</ul>
<script>
var nav = document.querySelector('.nav');
var lis = nav.children;
for(var i = 0;i < lis.length;i++){
lis[i].onmouseover = function(){
this.children[1].style.display = 'block';
}
lis[i].onmouseout = function(){
this.children[1].style.display = 'none'
}
}
</script>
兄弟节点
<div>我是div</div>
<span>我是span</span>
<script>
var div = document.querySelector('div');
console.log(div.nextSibling);
console.log(div.previousSibling);
console.log(div.nextElementSibling);
console.log(div.previousElementSibling);
</script>
element.nextElementSibling有兼容性问题
创建节点和添加节点
<ul>
<li>123</li>
</ul>
<script>
var li = document.createElement('li');
var ul = document.querySelector('ul');
ul.appendChild(li);
var lili = document.createElement('li');
ul.insertBefore(lili, ul.children[0]);
</script>
简易版发布留言案例:
<textarea name="" id=""></textarea>
<button>
发布
</button>
<ul>
</ul>
<script>
var btn = document.querySelector('button');
var text = document.querySelector('textarea');
var ul = document.querySelector('ul');
btn.onclick = function() {
if (text.value == '') {
alert('您没有输入');
return false;
} else {
var li = document.createElement('li');
li.innerHTML = text.value + "<a href='javascript:;'>删除</a>"
ul.insertBefore(li, ul.children[0]);
var as = document.querySelectorAll('a');
for(var i = 0;i < as.length;i++){
as[i].onclick = function(){
ul.removeChild(this.parsetNode);
}
}
}
}
</script>
删除节点
node.removeChild(children),从DOM中删除一个子节点,返回删除的节点
删除留言案例,在上面
复制节点
node.cloneNode();
步骤:复制----添加
<ul>
<li>1111</li>
<li>2</li>
<li>3</li>
</ul>
<script>
var ul = document.querySelector('ul');
var lili = ul.children[0].cloneNode(true);
ul.appendChild(lili);
</script>
动态生成表格
- 准备好模拟的数据,用对象形式存储
- 往tbody里面创建行:(通过数组的长度)
- 创建有删除2个字的单元格
<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 = 0; i < datas.length; i++) {
var tr = document.createElement('tr');
tbody.appendChild(tr);
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 href="javascript:;">删除 </a>';
tr.appendChild(td);
}
var as = document.querySelectorAll('a');
for (var i = 0; i < as.length; i++) {
as[i].onclick = function() {
tbody.removeChild(this.parentNode.parentNode)
}
}
</script>
三种动态创建元素的区别:
- document.write是直接将内容写入页面的内容流,但文档流执行完毕,则它会导致页面全部重绘
- innerHTML是将内容写入某个DOM节点,不会导致页面重绘
- innerHTML创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
- createElement() 创建多个元素效率稍低一点点,但结构更清晰
总结:不同浏览器下,innerHTML比createElement的效率高
DOM核心
![image-20210816171925094]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816171925094.png)
![image-20210816172006387]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816172006387.png)
![image-20210816172028551]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816172028551.png)
![image-20210816172048800]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816172048800.png)
![image-20210816172145343]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816172145343.png)
![image-20210816172443322]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816172443322.png)
![image-20210816172517769]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816172517769.png)
事件高级
注册事件
- 传统的注册事件
- 唯一性
- 同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖之前注册的函数
- addEventListener事件监听方式注册事件
- IE9之前的浏览器不支持此方法,可使用attachEvent()代替
- 特点:同一个元素同一个事件可以注册多个监听器
- 按照顺序依次执行
- addEventListener它是一个方法
![image-20210816173819712]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816173819712.png)
<button>
传统的注册事件
</button>
<button>
方法监听注册事件
</button>
<script>
var btns = document.querySelectorAll('button');
btns[0].onclick = function() {
alert('hi');
}
btns[0].onclick = function() {
alert('hao a u');
}
btns[1].addEventListener('click', function() {
alert(22);
})
btns[1].addEventListener('click', function() {
alert(33);
})
</script>
![image-20210816175104102]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816175104102.png)
删除事件
<div>1</div>
<div>2</div>
<div>3</div>
<script>
var divs = document.querySelectorAll('div');
divs[0].onclick = function() {
alert(11);
// 1. 传统方式删除事件
divs[0].onclick = null;
}
// 2. removeEventListener 删除事件
divs[1].addEventListener('click', fn) // 里面的fn 不需要调用加小括号
function fn() {
alert(22);
divs[1].removeEventListener('click', fn);
}
// 3. detachEvent
divs[2].attachEvent('onclick', fn1);
function fn1() {
alert(33);
divs[2].detachEvent('onclick', fn1);
}
DOM事件流
DOM事件流分为3个阶段:
- 捕获阶段
- 当前目标阶段
- 冒泡阶段
概念:事件发生时会在元素节点之间按照特定的顺序传播这个传播过程及DOM事件流。
注意:
![image-20210816195739724]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816195739724.png)
<div class="father">
<div class="son">son盒子</div>
</div>
<script>
var son = document.querySelector('.son');
son.addEventListener('click', function() {
alert('son');
}, false);
var father = document.querySelector('.father');
father.addEventListener('click', function() {
alert('father');
}, false);
document.addEventListener('click', function() {
alert('document');
})
</script>
事件对象
<div>123</div>
<script>
var div = document.querySelector('div');
div.onclick = function(e) {
console.log(e);
}
</script>
常见事件对象的属性和方法
![image-20210816202218283]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816202218283.png)
区别:e.target指向我们点击的那个对象,我们点击li e.target指向的就是li
this返回的是绑定事件的对象(元素)
阻止默认行为
<div>
132
</div>
<a href = "http://www.baidu.com">百度</a>
<form action="http://www.biadu.com">
<input type="submit" value="提交" name = "sub">
</form>
<script>
var div = document.querySelector('div');
div.addEventListener('click',fn);
div.addEventListener('mouseout',fn);
div.addEventListener('mouseover',fn);
function fn(e){
console.log(e.type);
}
var a = document.querySelectot('a');
a.addEventListener('click',function(e){
e.prevertD
})
</script>
阻止事件冒泡
![image-20210816205606698]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816205606698.png)
事件委托
也称事件代理,(常在面试问到)
原理:不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。
<ul>
<li>知否知否,点我应有弹框在手!</li>
<li>知否知否,点我应有弹框在手!</li>
<li>知否知否,点我应有弹框在手!</li>
<li>知否知否,点我应有弹框在手!</li>
<li>知否知否,点我应有弹框在手!</li>
</ul>
<script>
var ul = document.querySelector('ul');
ul.addEventListener('click', function(e) {
e.target.style.backgroundColor = 'pink';
})
</script>
常见鼠标事件
![image-20210816211103674]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816211103674.png)
鼠标事件对象
![image-20210816211850750]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816211850750.png)
案例:跟随鼠标的天使
![image-20210816212157207]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816212157207.png)
<style>
img {
position: absolute;
top: 2px;
}
</style>
<img src="img/s中午好.gif" alt="">
<script>
var pic = document.querySelector('img');
document.addEventListener('mousemove',function(e){
var x = e.pageX;
var y = e.pageY;
pic.style.left = x + 'px';
pic.style.top = y + 'px';
})
</script>
常见键盘事件
![image-20210816213825428]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816213825428.png)
键盘事件对象
![image-20210816214318684]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816214318684.png)
<script>
document.addEventListener('keyup', function(e) {
console.log('up:' + e.keyCode);
if (e.keyCode === 65) {
alert('您按下的a键');
} else {
alert('您没有按下a键')
}
})
document.addEventListener('keypress', function(e) {
console.log('press:' + e.keyCode);
})
</script>
案例:模拟京东按键输入案例
![image-20210816214637066]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816214637066.png)
<input type = "text">
<script>
var search = document.querySelector('input');
document.addEventListener('keyup',function(e){
if(e.keyCode == 83){
search.focus();
}
})
</script>
模拟京东快递查询单号:
![image-20210816215315604]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210816215315604.png)
<div class="search">
<div class="con">123</div>
<input type="text" placeholder="请输入您的快递单号" class="jd">
</div>
<script>
var con = document.querySelector('.con');
var jd_input = document.querySelector('.jd');
jd_input.addEventListener('keyup', function() {
if (this.value == '') {
con.style.display = 'none';
} else {
con.style.display = 'block';
con.innerText = this.value;
}
})
jd_input.addEventListener('blur', function() {
con.style.display = 'none';
})
jd_input.addEventListener('focus', function() {
if (this.value !== '') {
con.style.display = 'block';
}
})
</script>
BOM
BOM概念
BOM是浏览器对象模型,它提供了独立于内容而与浏览器 ,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心是window.
BOM的构成
![image-20210817102302286]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817102302286.png)
window对象是浏览器的顶级对象,它具有双重角色
-
它是js访问浏览器窗口的一个接口; -
它是一个全局对象,定义在作用域中的变量、函数都会变成window对象的属性和方法。 -
调用时可以省略window,前面学习的对话框都属于window对象方法,如alert()、prompt(); 注意:window下的一个特殊属性window.name。
window对象的常见事件
- 窗口加载事件
<script>
window.addEventListener('load', function() {
var btn = document.querySelector('button');
btn.addEventListener('click', function() {
alert('点击我');
})
})
window.addEventListener('load', function() {
alert(22);
})
document.addEventListener('DOMContentLoaded', function() {
alert(33);
})
</script>
调整窗口大小事件
![image-20210817135810294]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817135810294.png)
定时器
- setTimeout
- setin
<script>
function callback() {
console.log('爆炸了');
}
var timer1 = setTimeout(callback, 3000);
var timer2 = setTimeout(callback, 5000);
</script>
回调函数
![image-20210817141113901]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817141113901.png)
停止定时器
![image-20210817141904984]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817141904984.png)
<button>点击停止定时器</button>
<script>
var btn = document.querySelector('button');
var timer = setTimeout(function() {
console.log('爆炸了');
}, 5000);
btn.addEventListener('click', function() {
clearTimeout(timer);
})
</script>
- window.setInterval(调用函数,延时时间);
区别:setTimeout 延时时间到了, 就去调用这个回调函数,只调用依次
setInterval 每隔这个延时时间, 就去调用这个回调函数,会调用很多次,重复调用这个函数。
案例:
定时器
<div>
<span class="hour"></span>
<span class="minute"></span>
<span class="second"></span>
</div>
<script>
var hour = document.querySelector('.hour');
var minute = document.querySelector('.minute');
var second = document.querySelector('.second');
var inputTime = +new Date('2021-8-17 18:00:00');
countDown();
setInterval(countDown, 1000);
function countDown() {
var nowTime = +new Date();
var times = (inputTime - nowTime) / 1000;
var h = parseInt(times / 60 / 60 % 24);
h = h < 10 ? '0' + h : h;
hour.innerHTML = h;
var m = parseInt(times / 60 % 60);
m = m < 10 ? '0' + m : m;
minute.innerHTML = m;
var s = parseInt(times % 60);
s = s < 10 ? '0' + s : s;
second.innerHTML = s;
}
</script>
停止定时器clearInterval
![image-20210817144752927]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817144752927.png)
发送短信案例:
![image-20210817145014112]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817145014112.png)
手机号码: <input type="number"> <button>发送</button>
<script>
// 按钮点击之后,会禁用 disabled 为true
// 同时按钮里面的内容会变化, 注意 button 里面的内容通过 innerHTML修改
// 里面秒数是有变化的,因此需要用到定时器
// 定义一个变量,在定时器里面,不断递减
// 如果变量为0 说明到了时间,我们需要停止定时器,并且复原按钮初始状态
var btn = document.querySelector('button');
var time = 3; // 定义剩下的秒数
btn.addEventListener('click', function() {
btn.disabled = true;
var timer = setInterval(function() {
if (time == 0) {
// 清除定时器和复原按钮
clearInterval(timer);
btn.disabled = false;
btn.innerHTML = '发送';
} else {
btn.innerHTML = '还剩下' + time + '秒';
time--;
}
}, 1000);
})
</script>
this指向问题
this 指向问题 一般情况下this的最终指向的时调用它的对象
- 全局作用域或者普通函数中this指向全局对象window( 特殊:定时器里面的this指向window)
- 方法调用中谁调用this指向谁
- 构造函数中this指向构造函数的实例
<button>
点击
</button>
<script>
console.log(this);
function fn() {
console.log(this);
}
window.fn();
window.setTimeout(function() {
console.log(this);
}, 1000);
var o = {
sayHi: function() {
console.log(this);
}
}
o.sayHi();
var btn = document.querySelector('button');
btn.addEventListener('click', function() {
console.log(this);
})
function Fun() {
console.log(this);
}
var fun = new Fun();
</script>
js执行机制
同步和异步
![image-20210817152156195]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817152156195.png)
同步任务:在主线程里面执行,形成一个执行栈
异步任务:js的异步任务通过回调函数实现
异步类型:
1. 普通事件,如click 、resize等
2. 资源加载,如load、error等
3. 定时器,包括setInterval、setTimeout等
异步任务相关回调函数添加 到任务队列中。
![image-20210817153039549]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817153039549.png)
![image-20210817155520279]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817155520279.png)
location对象
什么是location对象
![image-20210817160104217]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817160104217.png)
url概念:
![image-20210817155955845]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817155955845.png)
location对象的属性
![image-20210817160605446]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817160605446.png)
获取URL参数
//1.log.html
<form action = "index.html">
用户名:<input type = "text" name="uname">
<input type="submit" value="登录">
</form>
//2.index.html
<div>
</div>
<script>
console.log('location.search');
var params = location.search.substr(1);
var arr = params.split('=');
var div= document.querySelector('div');
div.innerHTML=arr[1] +'欢迎你'
</script>
location常见的方法
![image-20210817164824543]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817164824543.png)
<button>点击</button>
<script>
var btn = document.querySelector('button');
btn.addEventListener('click', function() {
location.reload(true);
})
</script>
navigator对象
![image-20210817165524126]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817165524126.png)
history对象
![image-20210817165611003]https://gitee.com/ye-hengxin/picture-warehouse/raw/master/image-20210817165611003.png)
//index.html
<a href="list.html">点击我去往列表页</a>
<button>前进</button>
<script>
var btn = document.querySelector('button');
btn.addEventListener('click', function() {
history.go(1);
})
</script>
//list.html
<a href="index.html">点击我去往首页</a>
<button>后退</button>
<script>
var btn = document.querySelector('button');
btn.addEventListener('click', function() {
history.go(-1);
})
</script>
|