键盘事件

常见的键盘事件

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