1.0 键盘事件
1.1键盘事件
| 键盘事件 | 触发条件 |
|---|---|
| onkeyup | 某个键盘按键被松开时触发 |
| onkeydown | 某个键盘按键被按下时触发 |
| onkeypress | 某个键盘按键被松开时触发 不识别功能键 |
注意:
- 如果使用addEventListener 不需要加 on
- onkeypress 和前面2个的区别是,它不识别功能键,比如左右箭头,shift 等。
- 三个事件的执行顺序是: keydown — keypress —- keyup (按下—按住—抬起)
案例:
(1)keyup按键弹起事件 可以识别功能键 不区分大小写document.addEventListener('keyup',function(){console.log('我弹起了')})(2)keydown按键按下事件 可以识别功能键 不区分大小写document.addEventListener('keydown',function(){console.log('我按下了')})(3)keypress按键按下的时候触发 它不识别功能键 但是能识别大小写 比如ctrl shiftdocument.addEventListener('keypress',function(){console.log('我按下了')})三个事件的执行顺序:keydown--keypress --keyup
1.2键盘事件对象
| 键盘事件 | 说明 |
|---|---|
| keyCode | 返回 ASCII码 |
- 注意:
- onkeydown 和 onkeyup 不区分字母大小写,通过keyCode属性获取到的a 和 A 得到的都是65
- onkeypress 区分字母大小写 ,通过keyCode属性获取到的 a 是 97 和 A 得到的是65
判断是否按下
<script>// 键盘事件对象中的keyCode属性可以得到相应键的ASCII码值document.addEventListener('keyup', function(e) {console.log('up:' + e.keyCode);// 我们可以利用keycode返回的ASCII码值来判断用户按下了那个键if (e.keyCode === 65) {alert('您按下的a键');} else {alert('您没有按下a键')}})document.addEventListener('keypress', function(e) {// console.log(e);console.log('press:' + e.keyCode);})</script>
模拟京东快递单号
<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');// 给输入框注册keyup事件jd_input.addEventListener('keyup', function() { //**如果想监听文本框中输入的内容,只能使用keyup**// 判断输入框内容是否为空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>
2.0 BOM
- bom顶级对象时window
- bom包含dom
2.1 页面加载事件(两种)
第一种:
(1)window.onload =function(){}页面加载事件注意:只用这个对象可以把js放在页面的任何一个位置 但是传统的注册方式只能注册一个 如果有多个 就以最后一个为准window.onload = function(){}或者window.addEventListener("load",function(){});
第二种:
(2)addEventListener('DOMContentLoaded',function(){})load等页面内容全部加载完毕以后 ,包含页面dom元素 图片 falsh css等等DOMContentLoaded 是DOM加载完毕以后 不包含图片 falsh css等就可以执行 加载速度比load更快一些
2.2 整窗口大小事件
语法:
Window.addEventListener('resize',function(){});Window.innerWidth 获得当前屏幕的宽度 窗口大小发生变化就会触发
案例:
<script>// 注册页面加载事件window.addEventListener('load', function() {var div = document.querySelector('div');// 注册调整窗口大小事件window.addEventListener('resize', function() {// window.innerWidth 获取窗口大小console.log('变化了');if (window.innerWidth <= 800) {div.style.display = 'none';} else {div.style.display = 'block';}})})</script><div></div>
2.3 定时器 (两种)
- setTimeOut 执行一次 执行完毕就结束了
第一种
setTimeout() 炸弹定时器
window.setTimeout(回调函数, [延迟的毫秒数]);第一个参数是到达一定时间执行的参数第二个参数是代码加载完毕以后 需要多长时间去加载这个函数 单位是毫秒清除定时器:clearTimeOut(tim) 跟一个参数 --要清除的这个定时器<script>// 回调函数是一个匿名函数setTimeout(function() {console.log('时间到了');}, 2000);function callback() {console.log('爆炸了');}// 回调函数是一个有名函数var timer1 = setTimeout(callback, 3000);var timer2 = setTimeout(callback, 5000);</script>
第二种
setInterval() 闹钟定时器
window.setInterval(回调函数, [间隔的毫秒数]);var timer=setInterval(function(){},时间)特点:在一定的时间 无限制的执行 --1、关闭浏览器 2、清除掉清除定时器:clearInterval(timer) 需要传递一个参数 这个参数就是要清除的定时器定时器里面的this指向的是window
除夕倒计时案例
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {width: 600px;height: 600px;margin: 100px auto;text-align: center;}.box1 {margin-left: 100px;}span {display: inline-block;width: 100px;height: 50px;line-height: 50px;margin: 0 10px;color: #fff;background-color: orange;}</style></head><body><div class="box"><h1>距离除夕还有</h1><div class="bo1"><span id="t">天</span><span id="h">时</span><span id="f">分</span><span id="s">秒</span></div></div><script>var c = new Date('2021-02-11 00:00:00')var tian = document.getElementById('t');var hours = document.getElementById('h');var fen = document.getElementById('f');var miao = document.getElementById('s');Dao();setInterval(Dao, 1000);function Dao() {var date = new Date();var time = (c - date) / 1000var t = parseInt(time / 60 / 60 / 24);t = t < 10 ? '0' + t : t;var h = parseInt(time / 60 / 60 % 24);h = h < 10 ? '0' + h : h;var f = parseInt(time / 60 % 60);f = f < 10 ? '0' + f : f;var s = parseInt(time % 60);s = s < 10 ? '0' + s : s;tian.innerHTML = t + '天';hours.innerHTML = h + '时';fen.innerHTML = f + '分';miao.innerHTML = s + '秒';}</script></body></html>最好采取封装函数的方式才没有空白
2.4停止定时器
window.clearInterval(intervalID);clearInterval()方法取消了先前通过调用 setInterval()建立的定时器。
案例
<body><button class="begin">开启定时器</button><button class="stop">停止定时器</button><script>var begin = document.querySelector('.begin');var stop = document.querySelector('.stop');// 全局变量 null是一个空对象(定时器是一个对象,但是setInterval并没有返回定时器对象,而是返回的定时器id)var timer = null;begin.addEventListener('click', function() {timer = setInterval(function() {console.log('ni hao ma');}, 1000);console.log(timer); // 1 ,定时器的id})stop.addEventListener('click', function() {clearInterval(timer);})// 补充内容:// 变量的默认初始值,刚开始不知道是什么,那怎么给初始值?变量要存储的数据是什么类型。var str = '';// sdfasdf 在经过一堆代码执行之后,才知道具体值是什么str = 'zs';// var num = 0,1,-1// var flag = true,false;// var obj = null;</script></body>
2.5this指向
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,**一般情况下this的最终指向的是那个调用它的对象**。
- 全局作用域或者普通函数中,this指向全局对象window(注意定时器里面的this也指向window)
- 方法调用中,谁调用方法,this指向谁
- 构造函数中this指向构造函数的实例(通过构造函数new出来的对象)
<button>点击</button><script>// this 指向问题 一般情况下this的最终指向的是那个调用它的对象// 1. 全局作用域或者普通函数中this指向全局对象window( 注意定时器里面的this指向window)console.log(this);function fn() {console.log(this);}window.fn();window.setTimeout(function() {console.log(this);}, 1000);// 2. 方法调用中谁调用this指向谁var o = {sayHi: function() {console.log(this); // this指向的是 o 这个对象}}o.sayHi();var btn = document.querySelector('button');btn.addEventListener('click', function() {console.log(this); // 事件处理函数中的this指向的是btn这个按钮对象})// 3. 构造函数中this指向构造函数的实例function Fun() {console.log(this); // this 指向的是fun 实例对象}var fun = new Fun();</script>
2.6 js的执行机制
- 单线程 同一个时间只能做一件事
- 同步和异步
- js执行机制:先执行同步代码 再执行异步代码
- 同步代码:除了异步代码以外的都是同步代码
- 异步代码:事件 回调函数 当事件满足条件的时候才执行
console.log(1);setTimeout(function() {//yibuconsole.log(3);}, 0);console.log(2);// 结果1,2,3
console.log(1);document.onclick = function () {console.log('click');}console.log(2);setTimeout(function () {console.log(3)}, 3000)//1 2
