当前位置: 首页 > article >正文

iframe 内事件冒泡

说明

网址: https://gitee.com/linuxmail/node-iframe-event-bubble

iframe 内鼠标事件和键盘事件冒泡。

支持 ctrl, shift, alt, meta 冒泡

npm i iframe-event-bubble

用法

// npm i iframe-event-bubble

import iframeEventBubble from "iframe-event-bubble";

// iframeElement 是 iframe 的 Element,不是 iframe 内的 document,第二个参数默认是 true
// true: 启用冒泡, false: 关闭冒泡
// 具体的事件见方法名,顾名思义即可

iframeEventBubble.bubbleClick(iframeElement, true/false);
iframeEventBubble.bubbleDblclick(iframeElement, true/false);
iframeEventBubble.bubbleMousedown(iframeElement, true/false);
iframeEventBubble.bubbleMouseup(iframeElement, true/false);
iframeEventBubble.bubbleMouseover(iframeElement, true/false);
iframeEventBubble.bubbleMouseout(iframeElement, true/false);
iframeEventBubble.bubbleMouseenter(iframeElement, true/false);
iframeEventBubble.bubbleMouseleave(iframeElement, true/false);
iframeEventBubble.bubbleKeydown(iframeElement, true/false);
iframeEventBubble.bubbleKeyup(iframeElement, true/false);
iframeEventBubble.bubbleKeypress(iframeElement, true/false);

源码

如果 npm 不方便, 下面是 ts 源码

const _mouseEventHandler = (eventType: string) => {
  try {
    let ev = (window as any).event
    if (!ev || !ev.view) {
      return
    }
    let ele = ev.view.document.body.___bubble_event_iframe_element__ || document.body
    let evt = new MouseEvent(eventType, {
      bubbles: true,
      cancelable: false,
      button: ev.button,
      buttons: ev.buttons,
      ctrlKey: ev.ctrlKey,
      shiftKey: ev.shiftKey,
      altKey: ev.altKey,
      metaKey: ev.metaKey
    })
    ele.dispatchEvent(evt)
  } catch {
    console.log("bubble ev error: ", eventType)
  }
}

const _mouseEventHandlerClick = () => {
  _mouseEventHandler("click")
}

const _mouseEventHandlerDbclick = () => {
  _mouseEventHandler("dblclick")
}

const _mouseEventHandlerMousedown = () => {
  _mouseEventHandler("mousedown")
}

const _mouseEventHandlerMouseup = () => {
  _mouseEventHandler("mouseup")
}

const _mouseEventHandlerMouseover = () => {
  _mouseEventHandler("mouseover")
}

const _mouseEventHandlerMouseout = () => {
  _mouseEventHandler("mouseout")
}

const _mouseEventHandlerMouseenter = () => {
  _mouseEventHandler("mouseenter")
}

const _mouseEventHandlerMouseleave = () => {
  _mouseEventHandler("mouseleave")
}

const _opMouseEventHandler = (iframeElement: Element, eventType: string, eventHandler: EventListenerOrEventListenerObject, addOrRemove?: boolean) => {
  let ele: any = iframeElement
  if (!ele.contentWindow) {
    return
  }
  let doc = ele.contentWindow.document
  doc.body.___bubble_event_iframe_element__ = iframeElement
  if (addOrRemove === undefined || addOrRemove === true) {
    doc.addEventListener(eventType, eventHandler)
  } else {
    doc.removeEventListener(eventType, eventHandler)
  }
}

const bubbleClick = (iframeElement: Element, addOrRemove?: boolean) => {
  _opMouseEventHandler(iframeElement, "click", _mouseEventHandlerClick, addOrRemove)
}

const bubbleDblclick = (iframeElement: Element, addOrRemove?: boolean) => {
  _opMouseEventHandler(iframeElement, "dblclick", _mouseEventHandlerDbclick, addOrRemove)
}

const bubbleMousedown = (iframeElement: Element, addOrRemove?: boolean) => {
  _opMouseEventHandler(iframeElement, "mousedown", _mouseEventHandlerMousedown, addOrRemove)
}

const bubbleMouseup = (iframeElement: Element, addOrRemove?: boolean) => {
  _opMouseEventHandler(iframeElement, "mouseup", _mouseEventHandlerMouseup, addOrRemove)
}

const bubbleMouseover = (iframeElement: Element, addOrRemove?: boolean) => {
  _opMouseEventHandler(iframeElement, "mouseover", _mouseEventHandlerMouseover, addOrRemove)
}

const bubbleMouseout = (iframeElement: Element, addOrRemove?: boolean) => {
  _opMouseEventHandler(iframeElement, "mouseout", _mouseEventHandlerMouseout, addOrRemove)
}

const bubbleMouseenter = (iframeElement: Element, addOrRemove?: boolean) => {
  _opMouseEventHandler(iframeElement, "mouseenter", _mouseEventHandlerMouseenter, addOrRemove)
}

const bubbleMouseleave = (iframeElement: Element, addOrRemove?: boolean) => {
  _opMouseEventHandler(iframeElement, "mouseleave", _mouseEventHandlerMouseleave, addOrRemove)
}

const _keyEventHandler = (eventType: string) => {
  try {
    let ev = (window as any).event
    if (!ev) {
      return
    }
    var evtObj = new KeyboardEvent(eventType, {
      key: ev.key,
      keyCode: ev.keyCode,
      code: ev.code,
      charCode: ev.charCode,
      which: ev.which,
      ctrlKey: ev.ctrlKey,
      shiftKey: ev.shiftKey,
      altKey: ev.altKey,
      metaKey: ev.metaKey,
      repeat: false,
      isComposing: false,
      bubbles: true,
    })
    let ele = ev.view.document.body.___bubble_event_iframe_element__ || document.body
    ele.dispatchEvent(evtObj)
  } catch {
    console.log("bubble ev error: ", eventType)
  }
}

const _keyEventHandlerKeydown = () => {
  _keyEventHandler("keydown")
}

const _keyEventHandlerKeyup = () => {
  _keyEventHandler("keyup")
}

const _keyEventHandlerKeypress = () => {
  _keyEventHandler("keypress")
}

const _opKeyEventHandler = (iframeElement: Element, eventType: string, eventHandler: EventListenerOrEventListenerObject, addOrRemove?: boolean) => {
  let ele: any = iframeElement
  if (!ele.contentWindow) {
    return
  }
  let doc = ele.contentWindow.document
  doc.body.___bubble_event_iframe_element__ = iframeElement
  if (addOrRemove === undefined || addOrRemove === true) {
    doc.addEventListener(eventType, eventHandler)
  } else {
    doc.removeEventListener(eventType, eventHandler)
  }
}

const bubbleKeydown = (iframeElement: Element, addOrRemove?: boolean) => {
  _opKeyEventHandler(iframeElement, "keydown", _keyEventHandlerKeydown, addOrRemove)
}

const bubbleKeyup = (iframeElement: Element, addOrRemove?: boolean) => {
  _opKeyEventHandler(iframeElement, "keyup", _keyEventHandlerKeyup, addOrRemove)
}

const bubbleKeypress = (iframeElement: Element, addOrRemove?: boolean) => {
  _opKeyEventHandler(iframeElement, "keypress", _keyEventHandlerKeypress, addOrRemove)
}

export default {
  bubbleClick,
  bubbleDblclick,
  bubbleMousedown,
  bubbleMouseup,
  bubbleMouseover,
  bubbleMouseout,
  bubbleMouseenter,
  bubbleMouseleave,
  bubbleKeydown,
  bubbleKeyup,
  bubbleKeypress,
}


http://www.kler.cn/a/584782.html

相关文章:

  • 数据标注质量对AI模型质量的影响分析
  • 微信小程序-实现锚点跳转,页面加载后自动跳转、点击跳转到指定位置
  • vue判断视频链接是否有效
  • windows平台的ffmpeg编译使用
  • 5.1 程序调试
  • Qt-开发设置窗体透明效果
  • Gitlab报错:sudo: a password is required
  • 【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真(基于运放的电流模BGR)
  • autoreconf --install的作用
  • 复试难度解析,西电先进材料与纳米科技学院学院考研录取情况
  • c++ 中的float和double 的区别 开发过程中使用哪个更好
  • 《阿里云Data+AI:开启数据智能新时代》电子书上线啦!
  • 每日一题力扣2697.字典序最小回文串c++
  • 生成式AI+安全:API防护的“进化革命”——从被动防御到智能对抗的技术跃迁
  • 【openGauss】物理备份恢复
  • Nginx的流式响应配置详解
  • 使用服务器搭建开源建站工具Halo 2.0
  • 版本控制案例 | 硬盘巨头希捷(Seagate)的版本管理升级之路:从SVN到Perforce Helix Core
  • Word 小黑第19套
  • 基于Java + Redis + RocketMQ的库存秒杀系统设计与实现