Web APIs

本篇学习目标:

能够说出常用的3-5个键盘事件

能够知道如何获取当前键盘按下的是哪个键

能够知道浏览器的顶级对象window

能够使用window.onload事件

能够使用window.onresize事件

能够说出两种定时器的区别

能够使用location对象的href属性完成页面之间的跳转

能够使用location对象获取url中的参数部分

能够使用history提供的方法实现页面刷新

1.1. 常用的键盘事件

1.1.1 键盘事件

    <script>// 常用的键盘事件//1. keyup 按键弹起的时候触发 document.addEventListener('keyup', function() {console.log('我弹起了');})//3. keypress 按键按下的时候触发  不能识别功能键 比如 ctrl shift 左右箭头啊document.addEventListener('keypress', function() {console.log('我按下了press');})//2. keydown 按键按下的时候触发  能识别功能键 比如 ctrl shift 左右箭头啊document.addEventListener('keydown', function() {console.log('我按下了down');})// 4. 三个事件的执行顺序  keydown -- keypress -- keyup</script>

1.1.2 键盘事件对象

使用keyCode属性判断用户按下哪个键

    <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>

1.1.3 案例:模拟京东按键输入内容

当我们按下 s 键, 光标就定位到搜索框(文本框获得焦点)。

注意:触发获得焦点事件,可以使用 元素对象.focus()

    <input type="text"><script>// 获取输入框var search = document.querySelector('input');// 给document注册keyup事件document.addEventListener('keyup', function(e) {// 判断keyCode的值if (e.keyCode === 83) {// 触发输入框的获得焦点事件search.focus();}})</script>

1.1.4 案例:输入银行卡号,自动分割

要求:当我们在文本框中输入内容时,文本框下面自动显示分割后的银行卡号。

    <input type="text" name="" id="numbers"><div class="info"></div><script>var txt = document.querySelector('#numbers')var info = document.querySelector('.info')txt.addEventListener('keyup', function (e) {if (this.value.length > 4) {var result = ''for (var i = 0; i < this.value.length; i++) {var temp=i+1if (temp % 4 === 0 && temp!=0) {result += this.value[i] + ' '} else {result += this.value[i]}}info.innerHTML =result} else {info.innerHTML = this.value}})

延申练习:输入了字母如何处理?

1.2. BOM

1.2.1. 什么是BOM

​ BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window。

​ BOM 由一系列相关的对象构成,并且每个对象都提供了很多方法与属性。

​ BOM 缺乏标准,JavaScript 语法的标准化组织是 ECMA,DOM 的标准化组织是 W3C,BOM 最初是Netscape 浏览器标准的一部分。

1.2.2. BOM的构成

BOM 比 DOM 更大,它包含 DOM。

1.2.3. 顶级对象window

1.2.4. window对象的常见事件

总结:到现在为止,学习到的事件分为两类

1)需要用户触发的事件,比如前面学习的鼠标事件、键盘事件

2)不需要用户触发,而是程序在执行过程中自动触发,开发者只需为其编写事件处理程序即可

页面(窗口)加载事件(2种)

第1种

window.onload 是窗口 (页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、CSS 文件等), 就调用的处理函数。

第2种

​ DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表,图片,flash等等。

​ IE9以上才支持!!!

​ 如果页面的图片很多的话, 从用户访问到onload触发可能需要较长的时间, 交互效果就不能实现,必然影响用户的体验,此时用 DOMContentLoaded 事件比较合适。

    <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>

调整窗口大小事件

​ window.onresize 是调整窗口大小加载事件, 当触发时就调用的处理函数。

注意:

  1. 只要窗口大小发生像素变化,就会触发这个事件。

  2. 我们经常利用这个事件完成响应式布局。 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>

1.2.5. 定时器(两种)

window 对象给我们提供了 2 个非常好用的方法-定时器。

  • setTimeout()

  • setInterval()

setTimeout() 炸弹定时器

开启定时器

普通函数是按照代码顺序直接调用。简单理解: 回调,就是回头调用的意思。上一件事干完,再回头再调用这个函数。
例如:定时器中的调用函数,事件处理函数,也是回调函数。以前我们讲的   element.onclick = function(){}   或者  element.addEventListener(“click”, fn);   里面的 函数也是回调函数。
    <script>// 回调函数是一个匿名函数setTimeout(function() {console.log('时间到了');}, 2000);function callback() {console.log('爆炸了');}// 回调函数是一个有名函数var timer1 = setTimeout(callback, 3000);var timer2 = setTimeout(callback, 5000);</script>
案例:5秒后关闭广告

<body><img src="data:images/ad.jpg" alt="" class="ad"><script>// 获取要操作的元素var ad = document.querySelector('.ad');// 开启定时器setTimeout(function() {ad.style.display = 'none';}, 5000);</script>
</body>
停止定时器

    <button>点击停止定时器</button><script>var btn = document.querySelector('button');// 开启定时器var timer = setTimeout(function() {console.log('爆炸了');}, 5000);// 给按钮注册单击事件btn.addEventListener('click', function() {// 停止定时器clearTimeout(timer);})</script>

setInterval() 闹钟定时器

开启定时器

    <script>// 1. setInterval setInterval(function() {console.log('继续输出');}, 1000);</script>
案例:倒计时


    <div><span class="hour">1</span><span class="minute">2</span><span class="second">3</span></div><script>// 1. 获取元素(时分秒盒子) var hour = document.querySelector('.hour'); // 小时的黑色盒子var minute = document.querySelector('.minute'); // 分钟的黑色盒子var second = document.querySelector('.second'); // 秒数的黑色盒子var inputTime = +new Date('2020-5-1 18:00:00'); // 返回的是用户输入时间总的毫秒数countDown(); // 我们先调用一次这个函数,防止第一次刷新页面有空白 // 2. 开启定时器setInterval(countDown, 1000);function countDown() {var nowTime = +new Date(); // 返回的是当前时间总的毫秒数var times = (inputTime - nowTime) / 1000; // times是剩余时间总的秒数 var h = parseInt(times / 60 / 60); //时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>
停止定时器

案例:发送短信倒计时

​ 点击按钮后,该按钮60秒之内不能再次点击,防止重复发送短信。

    手机号码: <input type="number"> <button>发送</button><script>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>

1.2.6. this指向问题

​ this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,一般情况下this的最终指向的是那个调用它的对象。

现阶段,我们先了解一下几个this指向

  1. 全局作用域或者普通函数中this指向全局对象window(注意定时器里面的this指向window)

  2. 方法调用中谁调用this指向谁

  3. 构造函数中this指向构造函数的实例

    <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>

1.2.7. location对象

什么是 location 对象

URL

URL 就是常说的网址,专业的说:全球统一资源定位符

https://baike.baidu.com/m/24267858?fromtitle=新型冠状病毒&fromid=7904360&fr=aladdin#link

location 对象的属性

案例:5秒钟自动跳转页面

    <button>点击</button><div></div><script>var btn = document.querySelector('button');var div = document.querySelector('div');btn.addEventListener('click', function() {// console.log(location.href);location.href = 'http://www.itcast.cn';})var timer = 5;setInterval(function() {if (timer == 0) {location.href = 'http://www.baiduc.com';} else {div.innerHTML = '您将在' + timer + '秒钟之后跳转到首页';timer--;}}, 1000);</script>

案例:获取URL参数


// console.log(window.location)
console.log(location.search)
// 获取参数部分
var search = location.search
// 从 “?” 后面开始截取
var params=search.substr(1)
console.log(params)// 根据“=”进行分割
var param_list=params.split('=')
console.log(param_list)
console.log(decodeURI(param_list[1]))

延申思考:如何传递多个参数?如何获取多个参数,并输出每个参数的值?如果传递的参数的值是中文,在获取参数值是会发生什么情况?如何解决?请以此回答上面四个问题,并写出案例

location对象的常见方法

    <button>点击</button><script>var btn = document.querySelector('button');btn.addEventListener('click', function() {// 记录浏览历史,所以可以实现后退功能// location.assign('https://baike.baidu.com/');// 不记录浏览历史,所以不可以实现后退功能// location.replace('https://baike.baidu.com/');location.reload(true);})</script>

1.2.8. navigator对象

​ navigator 对象包含有关浏览器的信息,它有很多属性,我们最常用的是 userAgent,该属性可以返回由客户机发送服务器的 user-agent 头部的值。

下面前端代码可以判断用户那个终端打开页面,实现跳转

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 = "";     //电脑}

1.2.9 history对象

​ window对象给我们提供了一个 history对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的URL。

history对象一般在实际开发中比较少用,但是会在一些 OA 办公系统中见到。

1.3. JS执行机制

以下代码执行的结果是什么?

 console.log(1);setTimeout(function () {console.log(3);}, 1000);console.log(2);

以下代码执行的结果是什么?

 console.log(1);setTimeout(function () {console.log(3);}, 0);console.log(2);

1.3.1 JS 是单线程

 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。这样所导致的问题是: 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

案例演示

在单线程中执行多个任务:同步任务

在多个线程中执行多个任务:异步任务

1.3.2 同步任务和异步任务

​ 单线程导致的问题就是后面的任务等待前面任务完成,如果前面任务很耗时(比如读取网络数据),后面任务不得不一直等待!!

​ 为了解决这个问题,利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程,但是子线程完全受主线程控制。于是,JS 中出现了同步任务异步任务

同步

​ 前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。比如做饭的同步做法:我们要烧水煮饭,等水开了(10分钟之后),再去切菜,炒菜。

异步

​ 你在做一件事情时,因为这件事情会花费很长时间,在做这件事的同时,你还可以去处理其他事情。比如做饭的异步做法,我们在烧水的同时,利用这10分钟,去切菜,炒菜。

JS中所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务指的是:不进入主线程、而进入”任务队列”的任务,当主线程中的任务运行完了,才会从”任务队列”取出异步任务放入主线程执行。

1.3.3 JS执行机制(事件循环)

1.3.4 代码思考题

 console.log(1);document.onclick = function() {console.log('click');}setTimeout(function() {console.log(3)}, 3000)console.log(2);

再思考一个问题,下面代码的执行结果是什么?说明什么问题

console.log(1);      setTimeout(function () {console.log('ok')
}, 0)
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);
console.log(2);

系统带你学习 WebAPIs 第四讲相关推荐

  1. 系统带你学习 WebAPIs 第一讲

    Web APIs 本篇学习目标: 能够通过ID来获取元素 能够通过标签名来获取元素 能够通过class来获取元素 能够通过选择器来获取元素 能够获取body和html元素 能够给元素注册事件 能够修改 ...

  2. 系统带你学习 WebAPIs —— 动画篇(第六讲)

    Web APIs 本篇学习目标: 能够封装简单动画函数 能够理解缓动动画的封装 能够使用动画函数 能够写出网页轮播图案例 能够写出移动端触屏事件 1.1. 动画函数封装 1.1.1 缓动效果原理 缓动 ...

  3. 系统带你学习 WebAPIs 第二讲

    Web APIs 本篇学习目标: 能够说出排他操作的一般实现步骤 能够使用html5中的dataset方式操作自定义属性 能够根据提示完成百度换肤的案例 能够根据提示完成全选案例 能够根据提示完成ta ...

  4. 系统带你学习 WebAPIs 第五讲

    Web APIs 本篇学习目标: 能够说出常见 offset 系列属性的作用 能够说出常见 client 系列属性的作用 能够说出常见 scroll 系列属性的作用 能够封装简单动画函数 **1.1. ...

  5. 系统带你学习 WebAPIs 第三讲

    Web APIs 本篇学习目标: 能够使用removeChild()方法删除节点 能够完成动态生成表格案例 能够使用传统方式和监听方式给元素注册事件 能够说出事件流执行的三个阶段 能够在事件处理函数中 ...

  6. 视觉SLAM十四讲学习笔记-第四讲-Sophus实践、相似变换群与李代数

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  7. 视觉SLAM十四讲学习笔记-第四讲---第五讲学习笔记总结---李群和李代数、相机

    第四讲---第五讲学习笔记如下: 视觉SLAM十四讲学习笔记-第四讲-李群与李代数基础和定义.指数和对数映射_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第四讲-李代数求导与扰动模 ...

  8. 视觉SLAM十四讲学习笔记-第四讲-李代数求导与扰动模型

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  9. 零基础带你学习计算机网络—(四)

    零基础带你学习计算机网络(四) 学习内容 一.物理层的基本概念 二.传输媒体 三.传输方式 四.编码与调制 五.信道的极限容量 六.真题演练 思维导图 (一).物理层的基本概念 物理层考虑的是怎样才能 ...

最新文章

  1. 西安java招聘_西安招聘 | 陕西安控科技公司招聘(员工宿舍、节日福利、餐补)...
  2. java反射设置access_Java反射之java.lang.reflect.Field
  3. 数据结构实验之链表五:单链表的拆分_JAVA
  4. history.back(-1)和history.go(-1)的区别
  5. linux server.xml日志参数,Linux Log4j+Kafka+KafkaLog4jAppender 日志收集
  6. nginx An attempt was made to access a socket in a way forbidden by its access permissions
  7. js父元素获取子元素img_css,前端_父标签div中包含一个子元素img标签,子元素div标签,为什么img要加上浮动,子元素div才会处于正常位置?,css,前端 - phpStudy...
  8. linux裸分区如何区分,Linux 裸设备基础知识
  9. python从入门到精通-小白如何系统学习python,从入门到精通?
  10. windows下MATLAB2016a安装配置
  11. python 大智慧 dll 交易_大智慧自动交易DLL文件
  12. 打印机服务器不存在修复,win10电脑安装打印机提示处理器不存在_win10添加打印机错误“打印处理器不存在的修复办法-爱纯净...
  13. CentOS 7.6 编译安装最新版本glibc2.30 实录
  14. Golang的一个简单实用的http客户端库httpc
  15. RDD、DataFrame、DataSet原理解析
  16. zynq系列之-----PS端iic使用
  17. 网络与信息安全实验总结(报文监听与分析,漏洞扫描,逆向工程,安全产品)
  18. 奇文共欣赏 疑义相与析
  19. OpenSSL之十三:证书和CA指令
  20. RV1109 EVB板使用流程

热门文章

  1. 基于SPI协议的Flash全擦除
  2. 查询计算机端口号被谁占用了
  3. power bi 日期计算_PowerBI 动态计算周内日权重指数
  4. python symbol函数展开_QGIS表达式中的函数
  5. mplab x ide 中文使用手册_SCI必备利器:翻译又快又准,强推这款超牛X的神器!...
  6. java有 号_JAVA揭竿而起总要有名号
  7. mac ssh远程登录linux,MAC使用SSH远程登录
  8. 利用均差的牛顿插值法(Newton)
  9. RDS Mysql中binlog日志查看
  10. 嵌入式系统UBOOT