CustomEvent()

创建自定义事件

  1. const event = new CustomEvent(type[,eventInitDict])
  • type:事件的类型名称.
  • eventInitDict

canBubble:一个布尔值,表明该事件是否会冒泡.
cancelable:一个布尔值,表明该事件是否可以被取消.
detail:当事件初始化时传递的数据.

示例:

比如storage事件

默认的storage事件,只能在同源的两个页面之间能使用,比如页面A注册了storage事件,页面B设置值,A页面就能监听到B页面的设置。

比如两个同原页面 a、b。在 a 页面监听 storage 事件,在 b 页面通过 localstorage 设置缓存数据的时候,会触发 a 页面的监听;

  1. window.addEventListener('storage',function(e){
  2. console.log(e)
  3. },false)

如果要在同一个页面生效的话,可以使用自定义事件实现。

本质就是对原有的localStorage.setItem方法进行增强。

  1. var orignalSetItem = localStorage.setItem
  2. localStorage.setItem = function(key, newValue) {
  3. var setItemEvent = new CustomEvent('setItemEvent', {
  4. detail: {
  5. val: newValue
  6. }
  7. })
  8. window.dispatchEvent(setItemEvent)
  9. orignalSetItem.apply(this, arguments)
  10. }
  11. window.addEventListener('setItemEvent', function(e) {
  12. console.log(e.detail.val)
  13. })

通过上面的代码实现,就能在每次设置的时候触发自定义的方法。

CustomEvent可以使用Event对象替换。这两个api是不是重复了呢???

不过Event没有detail选项

  1. var orignalSetItem = localStorage.setItem
  2. localStorage.setItem = function(key, newValue) {
  3. var setItemEvent = new Event('setItemEvent')
  4. // 自定义一个属性val挂载在对象上
  5. setItemEvent.val = newValue
  6. window.dispatchEvent(setItemEvent)
  7. orignalSetItem.apply(this, arguments)
  8. }
  9. window.addEventListener('setItemEvent', function(e) {
  10. // 通过自定义val获取
  11. console.log(e.val)
  12. })