键盘事件
常见的键盘事件
- onkeyup:键盘按键按下被松开时触发
- onkeydown:键盘按键被按下时触发
- onkeypress:键盘按键被按下时触发(不辨认ctrl shift功能键)
三个事件的执行程序:onkeydown—-onkeypress—onkeyup
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
document.addEventListener('keydown',function(e){
console.log('键盘按键被按下了keydown')
})
document.addEventListener('keypress',function(e){
console.log('键盘被按下了 press')
})
document.addEventListener('keyup',function(){
console.log('键盘按键按下被松开了 keyup')
})
</script>
</body>
</html>
键盘事件对象
- keyCode:返回该键的AScll码
留神
- onkeydown和onkeyup不辨别大小写,onkeypress辨别字母的大小写
- 在咱们理论开发中咱们更多的应用keydown和keyup,他能辨认所有的功能键
- keypress不辨认功能键,然而keyCode属性能辨别大小写,返回不同的ASCI值
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
// 键盘事件对象中的keyCode属性能够失去相应键的ASCII码值
document.addEventListener('keyup', function(e) {
console.log(e.keyCode);
if (e.keyCode === 65) {
alert("按下a键")
} else {
alert('没按下a键')
}
})
document.addEventListener('keypress', function(e) {
console.log(e.keyCode)
});
document.addEventListener('keydown', function(e) {
console.log(e.keyCode)
})
</script>>
</body>
</html>
模仿京东按键输出内容
当咱们按下s键 光标就主动定位到搜寻框外面
思路如下
1.检测用用户是否按下s建,如果按下s键,就把光标定位到搜寻框外面
2.应用键盘事件中的keyCod来判断用户是否按下s键
3.搜寻框取得焦点:应用js中的focus()办法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="text">
<script>
var search = document.querySelector('input');
document.addEventListener('keyup', function(e) {
// 打印s键绝对应的ASCI嘛
console.log(e.keyCode);
if (e.keyCode === 83) {
search.focus()
}
})
</script>
</body>
</html>
仿京东快递单号查问
1.快递单号输出内容时,下面的大号盒子con显示
2.同时把快递单号外面的值(value)赋值给con盒子(innerText)作为内容
3.如果快递单号为空,则暗藏大号字体盒子(con)盒子
4.当咱们失去焦点,就暗藏con盒子
5.当咱们取得焦点,并且文本框内容不为空,就显示这个盒子。
<!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>
* {
margin: 0;
padding: 0;
}
.search {
position: relative;
width: 600px;
margin: 200px auto;
}
.con {
position: absolute;
top: -34px;
left: -4px;
width: 200px;
height: 25px;
border: 1px solid #3c3c3c;
margin-bottom: 10px;
}
.con::after {
position: absolute;
top: 24px;
left: 0;
content: '';
width: 0;
height: 0;
border: 10px solid transparent;
border-top: 10px solid #000000;
/* 关照兼容性 */
line-height: 0;
font-size: 0;
}
</style>
</head>
<body>
<div class="search">
<div class="con"></div>
<input type="text" class='jd'>
</div>
<script>
var con = document.querySelector('.con');
var jd = document.querySelector('.jd');
jd.addEventListener('keyup', function() {
if (this.value == "") {
con.style.display = "none"
} else {
con.style.display = "block";
con.innerHTML = this.value
}
})
jd.addEventListener('blur', function() {
con.style.display = 'none'
})
jd.addEventListener('focus', function() {
if (this.value !== '') {
con.style.display = "block"
}
})
</script>
</body>
</html>
BOM
BOM:浏览器对象模型,提供拜访与操作浏览器交互的接口与办法,其中BOM蕴含着DOM.其顶级对象是window
BOM不足规范,javascript的标准化组织是ECMA,DOM的标准化组织是W3C,BOM最后是Netscape浏览器规范的一部分。
区别如下
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var num = 10;
console.log(window.num);
function fn() {
console.log('hello')
}
window.fn()
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
var num = 10;
console.log(window.num);
function fn() {
console.log('hello')
}
window.fn()
</script>
</body>
</html>
window常见事件
窗口加载事件
- window.onload 页面内容加载结束,其中包含css flash dom元素 图片等
- document.DOMContentloaded: DOM加载结束,不包含css falsh 图片等等,加载速度比拟快,但有兼容性
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<script>
window.addEventListener('load', function() {
var bth = document.querySelector('button');
bth.addEventListener('click', function() {
alert("onload")
})
});
document.addEventListener('DOMContentLoaded',function(){
var bth = document.querySelector('button');
bth.addEventListener('click',function(){
alert('DOMContentLoaded')
})
})
</script>
<body>
<button>按钮</button>
</body>
</html>
窗口大小加载事件
window.onresize = function(){};
windows.addEventListener(‘resize’,function(){})
windows.onresize:是调整窗口大小加载事件,当窗口大小产生扭转时,则触发该事件
window.innerWidth:能够获取以后屏幕的宽度
<!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>
* {
margin: 0;
padding: 0;
}
div {
width: 400px;
height: 400px;
background-color: blueviolet;
border-radius: 50%;
}
</style>
</head>
<script>
window.addEventListener('load', function() {
var div = document.querySelector('div');
window.addEventListener('resize', function() {
console.log(window.innerWidth);
if (window.innerWidth <= 800) {
div.style.display = 'none'
}
})
})
</script>
<body>
<div></div>
</body>
</html>
定时器
window对象给咱们提供2个十分好用的定时器办法
setTimeout()
setInterval()
setTimeout()
window.setTimeout(调用函数,[提早的毫秒数]);
setTimeout()中的调用函数也被称为回调函数callback
注意事项
1.window能够省略
2.提早的毫秒数默认为0,如果写,必须是毫秒
3.因为定时器很多,所以咱们常常给定时器赋值给一个标识符。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 第一种办法
setTimeout(function() {
console.log('hello')
}, 2000)
// 第二种办法
function callback() {
console.log('word')
}
var time1 = setTimeout(callback, 5000);
var time2 = setTimeout(callback, 8000)
</script>
</body>
</html>
5秒后敞开广告
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<script>
window.addEventListener('load', function() {
var img = document.querySelector('img')
function callback() {
img.style.display = 'none'
}
setTimeout(callback, 2000)
})
</script>
<body>
<img src="./image/side.png" alt="">
</body>
</html>
革除定时器
window.clearTimeout(timeoutID)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var time = setTimeout(function() {
console.log("hello word")
}, 5000);
clearTimeout(time)
</script>
</body>
</html>
setInterval()
setInterval(callback,[距离的毫秒数])
setInterval()是反复调用此函数,每隔一段时间就调用该回调函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
setInterval(() => {
console.log('hello')
}, 2000);
</script>
</body>
</html>
倒计时成果
外围思路如下
- 这个倒计时是一直变动的,因而须要定时器来主动变动
- 三个彩色盒子别离寄存时分秒
- 三个盒子利用innerHTML放入计算的小时分钟秒数
- 先调用一次这个函数,避免最开始刷新页面有空白问题
<!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>
* {
margin: 0;
padding: 0;
}
.time {
width: 400px;
margin: 200px auto;
}
span {
display: inline-block;
width: 100px;
height: 50px;
font: 700 normal 20px '微软雅黑';
text-align: center;
line-height: 50px;
color: white;
background-color: black;
}
</style>
</head>
<body>
<div class="time">
<span class="hour">1</span>
<span class="min">2</span>
<span class="second">3</span>
</div>
<script>
// 获取事件源
var hour = document.querySelector('.hour');
var min = document.querySelector('.min');
var second = document.querySelector('.second');
var inputTime = +new Date('2020-8-29 14:00:00');
countDown()
setInterval(countDown, 1000)
function countDown(time) {
var nowTime = +new Date(); // 返回的是以后工夫总的毫秒数
var times = (inputTime - nowTime) / 1000; // times是剩余时间总的秒数
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;
min.innerHTML=m;
var s = parseInt(times % 60); // 以后的秒
s = s < 10 ? '0' + s : s;
second.innerHTML =s;
}
</script>
</body>
</html>
进行定时器
window.clearInterval(intervalID);
注意事项
- 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>
</head>
<body>
<button class="star">计时开始</button>
<button class="end">计时敞开</button>
</body>
<script>
// 获取事件源
var star = document.querySelector('.star');
var end = document.querySelector('.end');
var time = null;
star.addEventListener('click', function() {
timer = setInterval(function() {
console.log("hello word")
}, 1000)
})
end.addEventListener('click', function() {
clearInterval(timer)
})
</script>
</html>
!
发送短信案例
外围思路
1.按钮点击之后,会禁用disabled为true
2.同时按钮外面的内容会变动,留神button外面的内容通过innerHTML批改
3.外面的秒数是有变动的,因而须要计时器
4.定义一个变量,在计时器外面,一直递加。
<!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>
* {
margin: 0;
padding: 0;
}
.container {
width: 800px;
margin: 200px auto;
}
</style>
</head>
<body>
<div class="container">
<input type="text"> <button>发送短信</button>
</body>
<script>
var bth = document.querySelector('button');
var time = 3;
bth.addEventListener('click', function() {
this.disabled = true;
var timer = setInterval(function() {
if (time == 0) {
clearInterval(timer)
bth.disabled = false;
bth.innerHTML = '发送';
time = 3
} else {
bth.innerHTML = '还剩下' + time + '秒'
time--
}
}, 1000)
})
</script>
</div>
</html>
this指向
this的指向在函数定义的时候缺定不了,只有在函数执行的过程中能力确定
this指向
- 全局作用域下或者一般函数中的this指向window(留神定时器中的this只想window);
- 办法调用中的谁调用this指向谁
- 构造函数中的this指向构造函数的实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button>按钮</button>
<script>
console.log(this) //window
function fn() {
console.log(this) //window
}
window.fn();
var o = {
sayHi: function() {
console.log(this) //this指向o这个对象
}
};
o.sayHi();
var bth = document.querySelector('button');
bth.addEventListener('click', function() {
console.log(this) //button
});
function Fun() {
console.log(this) //this指向的是Fun实例对象
}
var fun = new Fun()
</script>
</body>
</html>
js是单线程
javascript语言的一大特点就是单线程,也就是说,同一个工夫只能做一件事。
单线程语言意味着,所有的工作都须要排队,前一个工作完结,才会执行后一个工作,如果一个工作耗费很长,后一个工作不得不等着。
同步工作
为了解决这个问题,利用cpu的计算能力,HTML5提出web worker规范,容许javascript脚本创立多个线程
同步工作
必须等到上一个工作完结之后,能力执行下一个工作
异步
在执行上一个工作同时,还能够执行其它的工作
本质区别:流水线上的各个流程的执行程序不同
js单线程
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
console.log(1);
setTimeout(function() {
console.log(3)
}, 1000);
console.log(2);
</script>
</body>
</html>
js单线程
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
console.log(1);
setTimeout(function() {
console.log(3);
}, 0);
console.log(2);
</script>
</body>
</html>
js的执行机制
同步工作
同步工作都在主线程上执行,造成一个执行栈
异步工作
js的异步工作是通过回调函数实现的
一般而言,异步工作有三种类型
1.一般事件 如onclick resize等等
2.资源加载 如load,error等
3.定时器,包含setInterval,setTimeout等
异步工作相干的回调函数增加到工作队列中(工作队列也称为音讯队列)
js的循环机制
因为主线程一直反复的取得工作,执行工作,再获取工作,再执行,这种机制叫做事件循环
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
console.log(1);
document.onclick = function() {
console.log('click')
}
setTimeout(function() {
console.log(3)
}, 3000);
console.log(2)
</script>
</body>
</html>
location对象
window对象给咱们提供了一个location属性用于获取或设置窗体的URL
URL
URL:对立资源定位符,是互联网上规范资源的地址
格局
京东案例
5秒之后跳往首页
利用定时器做倒计时成果
工夫到了,就主动跳往首页,用loaction.herf
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button>点击</button>
<p></p>
</body>
<script>
var bth = document.querySelector('button');
var p = document.querySelector('p');
bth.onclick = function() {
location.href = 'https://www.baidu.com/'
}
var time = 5;
setInterval(function() {
if (time == 0) {
location.href = 'https://www.baidu.com/'
} else {
p.innerHTML = '还剩' + time + '秒钟跳往首页';
time--
}, 1000)
</script>
</html>
获取URL参数
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="index.html">
用户:<input type="text" name="unmame" id="" autocomplete="off">
<input type="submit" value="登录">
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div></div>
<script>
// 获取location属性;
var pathname = location.search.substr(1);
console.log(pathname)
var arr = pathname.split('=');
console.log(arr);
var div = document.querySelector('div')
div.innerHTML = arr[1] + "欢送你"
</script>
</body>
</html>
location对象中的罕用办法
- location.assign():跟href一样,能够跳转页面(会记录历史);
- location.replace():替换以后页面,因为不记录历史,所以不能后退页面
- location.reload():从新加载页面,相当于刷新按钮或者F5,如果参数为true,则强制刷新;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button>按钮</button>
<script>
var bth = document.querySelector('button');
bth.addEventListener('click', function() {
location.assign("http://www.alloyteam.com/nav/");
})
</script>
</body>
</html>
navigator对象
上面前端代码能够判断用户那个终端关上页面,实现跳转
if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
window.location.href = ""; //手机
} else {
window.location.href = ""; //电脑
}
history对象
window给咱们提供一个history对象,与浏览器历史记录进行交互。
- history.forword():后退
- history.back():后退
- history.go(参数),参数如果为1,则后退一个页面,参数如果为-1,则后退一个页面。
留神:以下文件位于同一目录中,history对象个别在OA办公零碎中用的比拟多
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<a href="list.html">点我返回列表页 </a>;
<button>后退</button>
<script>
var bth = document.querySelector('button')
bth.addEventListener('click', function() {
history.forward()
})
</script>
</body>
</html>
list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<a href="index.html">点我返回首页 </a>;
<button>后退</button>
<script>
var bth = document.querySelector('button');
console.log(bth)
bth.addEventListener('click', function() {
history.back()
})
</script>
</body>
</html>
发表回复