1.0.5 • Published 6 years ago

watch-event v1.0.5

Weekly downloads
6
License
ISC
Repository
github
Last release
6 years ago

监听事件模块

version: 1.0.3 ## 增加修改发布可以传递任意参数给订阅的函数

万物皆有变化,当发生变化时做相对应的动作,故为监听。在按键监听时才用一事件名 对应多个 keyCode

用途 :

对监听事件进行封装,提高可读性。在这主要先对订阅发布模式和键盘事件的封装。

如何使用

你可以通过 npm 包获取:

  npm install watch-event

或者在 html 中引入

  <script src="./control-script.js"></script>

注意: 1. 所有通过本 npm 包所创建的自定义键盘事件都必须以.press结尾。 2. 本模块使用 ES6 语法,请使用 babel 编译。

API

实例化

实例化可以传入键值对,也可以不传参数默认为电脑端的键值对,但目前只有包括方向, 数字键,enter 和 esc。

支持事件节流 参数 keyValue < Object > | isThrottle < Boolean | false > | interval < Number | 500 >

  const keyValue = {
    'enter': 17,
    'up': 57
  }
  const controlor = new Controler(keyValue,true, 300);

addPress 添加按键值,键名为事件名,键值为keyCode。事件名是为了监听所用。

arguments | Object

  controlor.addPress({'play': 10});

delPress 删除事件名,参数是事件名数组。

arguments | Array

  controlor.delPress(['play']);

subscribe

订阅事件,参数为事件名、回调函数,并且返回解绑函数。

arguments | String | Function

  // 之后会添加发布回来的消息
  // 1.0.3版本已经可以传参数了
  const unSubscribe = controlor.subscribe('play',(data)=>{
    console.log(data)
  });

  // 解绑
  unSubscribe();

publish

发布事件,参数为事件名。

arguments | String

  // 发布事件
  controlor. publish('play',data)
思考:

对于 keydown 事件而言,在工程实践中,我更倾向于把它理解成一个遥控器操作多个 电器。

一个房间可以有多个遥控器,红外线的或者是 wifi 的。即你可以通过不同的遥控器,来 控制节奏,比如是否节流。

也可以把电器添加到遥控器的白名单,进行操作,当不想操控的时候直接移除,不论电器 是否有接收的接口。比如视频和界面都添加了一个实例的左右键事件,当进入视频,界面 解绑遥控器就算监听了事件,也无法触发。返回界面后视频亦然。

当然要注意不同的遥控器操作同一个接口要使用不同的事件名,不要因为相同的电器,相 同的接口,不同的遥控器而导致误操作。推荐使用遥控器名作为后缀。

addListener

arguments | el

绑定监听对象,注意: keydown 事件绑定在 document 上,而且实际上只绑定一次。 原理是通过 keydown 事件的触发来遍历所有绑定好的 DOM 元素触发对应的事件。有点像 document 是信息集散地,addListener 即订阅数据。

  improt Controlor from 'keydownEvent';

  const controlor = new  Controlor();
  controlor.addListener(document.body);

removeListener

arguments | el

删除 DOM,从而监听对应的 DOM 元素上的键盘事件失效。 注意:所有的绑定事件还 是生效的。只是不会被触发。如果只是对自定义事件解绑,请使用原生解绑。

controlor.removeListener(document.body)

keydownTrigger DEL

手动触发自定义事件方法 * 注意:解绑过后的事件是无法被触发的,参数可 以监听事件的名称也可以是键名。*

说明:目前个人觉得有了发布订阅的 API,此 API 作用不大,转为模块内部自用。传参 也变为传入事件 event 对象。如果真要使用请传入以下 JSON 对象作为参数:

// 传参对象
 const evt = {
   keyCode: 12, // 键值
   target: element, // DOM对象
   type: 'play' // 事件名
 }
  controlor.addListener(document.body);

  document.body.addEventListener('play', ev => {
    console.log('this is body!');
  });

  const evt = {
    keyCode: 12, // 键值(可以忽略)
    target: document.body, // DOM对象
    type: 'play' // 事件名
  }

  controlor.keydownTrigger(evt);

getElems 获取所有监听的 DOM 对象,返回一个 DOM 元素数组。

controlor.getElems()

getKeycode 获取所有键值对,返回一个 Object。

controlor.getKeycode()

demo

  improt Controlor from 'watch-event';

  const keyOpts = {
    enter: 17, // 实际是alt键
    RL: [37, 39] // RL即对应2个键值
  }
  // 这里首先会覆盖掉 enter事件的13,然后再覆盖alt的事件名。
  // 遵循默认配置会被覆盖,一事件名对应多个键值的原则。
  const controlor = new Controlor(keyOpts);

  const play = document.querySelector('#videoPlayer');
  const main = document.querySelector('#main');

  // 每个DOM元素都使用原生监听自定义事件
  play.addEventListener('RL', ev => {
      if(ev.detail.keyCode === 37){
        console.log('this is Left!');
      }else {
        console.log('this is Right!');
      }
    });

  main.addEventListener('RL', ev => {
      console.log('this is html!');
  });

  // ...此处省略监听部分代码
  if(isVideo){

    // 是否为播放视频界面,如果是,移除main,遥控器只对play有效。
    controlor.removeListener(main);
    controlor.addListener(play);
  }else{
    controlor.addListener(main);
    controlor.removeListener(play);
  }

  // 设置全局事件节流
  const controlor = new Controlor(keyOpts, true, 300);
1.0.5

6 years ago

1.0.4

6 years ago

1.0.3

6 years ago

1.0.1

6 years ago