JavaScript系列之Web API篇

Posted coderkey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript系列之Web API篇相关的知识,希望对你有一定的参考价值。

二,事件高级导读

1,注册事件(绑定事件)

1.1,注册事件概述

(1)含义:

给元素添加事件,称为注册时间或者绑定事件。
注册事件有两种方式:传统方式和方法监听注册方式。

1,传统注册方式
利用on开头的事件onclick
btn.onclick = function ( ) { }
特点:注册事件的唯一性。 同一个元素同一个事件著能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数。
2,监听注册方式 W3C标准推荐方式。
addEventListener( ) 它是一个方法。
IE9之前的IE浏览器不支持此方法,可使用attachEvent( )代替。
特点: 同一个元素同一个事件可以注册多个监听器。

1.2,addEventListener 事件监听方式

(1)语法:

eventTarget.addEventListener(type, listener[, useCapture])

(2)注意:

eventTarget.addEventListener(type, listener[, useCapture])方法将指定的监听器注册到eventTarget 上,当该对象触发指定的事件时,就会执行事件处理函数。
该方法接收三个参数:
type:事件类型字符串,比如click、mouseover,注意这里不要带on,是字符串,带引号
listener:事件处理函数,事件发生时,会调用该监听函数。
useCapture:可选参数,是一个布尔值,默认是false

(3)例如:

  <button>传统方式注册事件</button>
  <button>事件监听注册事件</button>
  <script>
    var btns = document.querySelectorAll('button');
    // 传统方式注册事件
    btns[0].onclick = function( ) {
      alert(1);
    }
    btns[0].onclick = function( ) {
      alert(2);  // 前面的1会被当前的2覆盖掉。
    }
    // 事件监听注册事件
    btns[1].addEventListener('click', function( ) {
      alert(3);
    })
    btns[1].addEventListener('click', function( ) {
      alert(4);  // 先输出3,然后再输出4,从上往下依次执行。
    })
   </script>

1.3,attachEvent 事件监听方式

(1)语法:

eventTarget.attackEvent(eventNameWithon, callback)

(2)注意:

1,该特性非标准,请尽量不要在生产环境中使用它
2,eventTarget.attackEvent方法将指定的监听器注册到eventTarget 上,当该对象触发
指定的事件时,指定的回调函数将会被执行。
该方法接收两个参数:
ventNameWithon :事件类型字符串,比如onclick,onmouseover, 这里要带on
callback :事件处理函数,当目标触发事件时回调函数将被调用。

1.4,注册事件的兼容性解决方案

(1)方法:

<button>点击我</button>
<script>
    var btn = document.querySelector('button');
    function alertWarn ( ) {
        alert ('warning');
    }
    function addEventListener(element, eventName, fn) {
        //判断浏览器是否支持addEventListener方法
        if (element.addEventListener) {
            element.addEventListener (eventName, fn);   //第三个参数,默认是false
        } else if (element.attachEvent) {
            element.attachEvent ('on' + eventName, fn);
        } else {
            //相当于element.onclick = fn;
            element['on' + eventName] = fn;
        }
    }
    addEventListener(btn, 'click', alertWarn);
</script>

2,删除事件(解绑事件)

2.1,删除事件的方式

(1)语法:

// 传统注册方式
eventTarget.onclick = null;
// 方法监听注册方式
eventTarget.removeEventListener(type, listener[, useCapture])
// attach 方式
eventTarget.detachEvent(eventNameWithon, callback)

(2)例如:

  divs[1].addEventListener('click', alertWarn);
  function alertWarn ( ) {
    alert('warning');
    divs[1].removeEventListener('click', alertWarn);
  }
	
   divs[2].attachEvent('onclick', alertWarn1);
   function alertWarn1 ( ) {
    alert('warning');
    divs[1].detachEvent('click', alertWarn1);
    }

3,DOM 事件流

3.1,事件流概述

(1)含义:

事件流描述的是从页面中接收事件的顺序。
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流。
DOM事件分为三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。

(2)注意:

1,JS代码只能执行捕获或者冒泡其中的一个阶段。
2,onclickattachEvent 只能得到冒泡阶段。
3,addEventListener (type, listener[, useCapture]) 第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;如果是false(不写默认就是false),表示在事件冒泡阶段电泳事件处理程序。(从小到大)
4,在实际开发中,我们很少使用事件捕获,我们更关注事件冒泡。
5,有些事件是没有冒泡的,比如onblur、onfocus、onmouseover、onmouseleave
6,虽然事件冒泡有时候会带来麻烦,但是有时候又会巧妙的做某些事情,我们后面讲解。


4,事件对象

4.1,什么是事件对象

(1)含义:

event对象代表事件的状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态。事件发后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,它有很多属性和方法。

(2)语法

eventTarget.onclick = function(event) { }
eventTarget.addEventListener('click', function(event) { })
//这个event就是事件对象,还可以写成e或者evt

(3)注意:

event 就是一个事件对象,写道我们的侦听函数的小括号里面,当形参来看事件对象只有有了事件才会存在,他是系统给我们自动创建的,不需要我们传递参数事件对象是我们的事件的一系列相关数据的集合,比如鼠标点击里面就包含了鼠标的相关信息这个事件对象我们可以自己命名,比如 event、evt 、e 等事件对象也有兼容性问题。 IE 6、7、8通过 window.event 实现
兼容性写法:

  event = event || window.event;

4.2,事件对象常见的属性和方法

(1)属性和方法:

事件对象属性方法说明
e.target返回触发事件的对象 标准
e.scrElement返回触发事件的对象 非标准 IE 6 7 8 使用
e.type返回事件的类型,比如click、mouseover等,不带 on
e.cancelBubble该属性阻止冒泡,非标准,IE 6 7 8 使用
e.returnValue该属性阻止默认事件(默认行为)非标准 ,IE 6 7 8 使用,比如不让链接跳转
e.preventDefaule()该方法阻止默认事件(默认行为)标准 ,比如不让链接跳转、文字选中等
e.stopPropagation()阻止冒泡,标准

(2)例如:

  //  e.target 和 this 的区别
  this 返回的是绑定事件的对象(元素)
  e.target 返回的是点击的那个对象,就是谁触发了这个事件
  var ul = document.querySelector('ul');
  ul.addEventListener('click', function (e) {
  // 我们给 ul 绑定事件,那么 this 就指向绑定事件 ul
    console.log(this);
    console.log(e.target);
  })
  // <ul>...</ul>
  // <li>123</li>

  //1,阻止对象默认行为
  三种方法:e.preventDefaule(); 是一个方法,适合普通浏览器
  e.returnValue;是一个属性,适用于 IE 6 7 8
  return false; 没有兼容性问题,但是需要注意后面的语句就不执行了,直接跳出

5,阻止事件冒泡

5.1,阻止事件冒泡的两种方式

(1)语法:

event.stopPropagation(); // 标准写法 一般浏览器停止冒泡
event.cancelBubble; // 非标准写法 IE 6 7 8 的停止冒泡

(2)例如:

  // 写法一,
  <div class="father">
      <div class="son">son儿子</div>
  </div>
  <script>
  var father = document.querySelector('.father');
  var son = document.querySelector('.son');
  father.addEventListener('click', alertName, false);
  son.addEventListener('click', alertName, false);
  document.addEventListener('click',function ( ) {
      alert('document');
  }, false);
  function alertName (event) {
      alert(this.getAttribute("class"));
      event.stopPropagation( );    // 停止冒泡
      event.cancelBubble;         // IE 6 7 8 的停止冒泡
  }
  </script>

   // 写法二
  <div class="father">
      <div class="son">son儿子</div>
   </div>
    <script>
      var son = document.querySelector('.son');
      son.addEventListener('click', function(e) {
        alert('son');
        e.stopPropagation( );    // 停止冒泡
      }, false);
      var father = document.querySelector('.father');
      father.addEventListener('click', function(e) {
        alert('fater');
        e.stopPropagation( );
      }, false);
      document.addEventListener('click',function ( ) {
        alert('document');
        })
    </script>

6,事件委托(代理、委派)

6.1,事件委托概述

(1)含义:

事件委托也称为事件代理,在JQuery里面称为事件委派。

(2)事件委托的原理:

不给每个子节点单独设置事件监听器,而是设置在其父节点上,然后利用冒泡原理设置每个子节点

(3)例如:

 //给 ul 注册点击事件,然后利用事件对象的 target 来找到当前点击的 li ,然后事件冒泡到 ul 上,
  ul 有注册事件,就会触发事件监听器。
 <ul>
      <li>1</li>
      <li>1</li>
      <li>1</li>
      <li>1</li>
 </ul>
    <script>
      // 事件委托核心原理:给父节点添加监听器,利用事件冒泡影响每个子节点。
      var ul = document.querySelector('ul');
      ul.addEventListener('click',function(e) {
        e.target = alert(1);  // 点击每个小li,都会弹出1
      })
    </script>

(4)事件委托的作用:

只操作了一次 DOM ,提高了程序的性能。

7,常用的鼠标事件

7.1,常用的鼠标事件

(1)用法

鼠标事件触发条件
onclick鼠标点击左键触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发
onfocus获得鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标弹起触发
onmousedown鼠标按下触发

7.1.1,禁止鼠标右键菜单
(1)含义:

contextmenu主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单。

(2)例如:

  123
  <script>
      document.addEventListener('contextmenu',function(e) {
      e.preventDefault( ); 
      })
  </script>

7.1.2,禁止鼠标选中文字

(1)语法:

selectstart

(2)例如:
123

7.2,鼠标事件对象

(1)含义:

event 对象代表事件的状态,跟事件相关的一系列信息的集合。现阶段我们主要是用鼠标事件对象MouseEvent 和键盘事件对象 KeyboardEvent

(2)常用鼠标事件对象:

鼠标事件对象说明
e.clientX返回鼠标相对于浏览器窗口可视区域的X坐标
e.clientY返回鼠标相对于浏览器窗口可视区域的Y坐标
e.pageX返回鼠标相对于文档页面的X坐标 IE9+ 支持
e.pageY返回鼠标相对于文档页面的Y坐标 IE9+ 支持
e.screenX返回鼠标相对于电脑屏幕的X坐标
e.screenY返回鼠标相对于电脑屏幕的Y坐标

8,常用的键盘事件

8.1,常用键盘事件

(1)用法:

键盘事件触发条件
onkeyup某个键盘按键被松开时触发(松开的时候触发)
onkeydown某个键盘按键被按下时触发(按下之后一直触发)
onkeypress某个键盘按键被按下时触发(按下之后一直触发),但是它不能识别功能键,比如 ctrl、shift等。

(2)例如:

  <script>
      document.addEventListener('keydown',function(e) {
      console.log('我按下了keydown');
      })
      document.addEventListener('keypress',function(e) {
      console.log('我按下了keypress');
      })
      document.addEventListener('keyup',function(e) {
      console.log('我松开了keyup');
      })
  </script>

(3)例如:

1,当按下的时候,keydown 执行在 keypress 之前。
2,如果用 addEventListener 不需要加on
3,onkeypress 它不能识别功能键,比如 ctrl、shift ,左右箭头等。

8.2,键盘事件对象

(1)方法:

键盘事件对象属性说明
keyCode返回该键的 ASCII 值

(2)注意:

1,keyupkeydown 事件不区分字母大小写, a 和 A 得到的都是65
2,keypress 区分大小写,a 得到的是97,A 得到的是 65


以上是关于JavaScript系列之Web API篇的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript系列之 Web API篇Dom,Bom

JavaScript系列之基础篇

WEB前端开发最佳实践系列JavaScript篇

[JavaScript从入门到放弃系列] 高级篇11.Vue.js之路由part2

JavaScript系列之基础篇

译ECMAScript 2016, 2017, 2018 新特性之必读篇