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 shift
document.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) / 1000
var 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() {//yibu
console.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