跨域場景下的Iframe事件監聽

背景

在當前window窗口,對于一些浮窗組件,一般需要點擊當前window下的其他位置才能夠隱藏浮窗。但如果當前窗口中存在iframe區域,那么由于一些特殊的性質,無法通過常規的click點擊事件監聽iframe元素的點擊,而通過contentDocument的形式也很難在跨域存在的情況下實現。

解決方案

window對象本身可以監聽到blur方法,在點擊到iframe時,會觸發父級窗口的blur事件,此時可以間接監聽到相當于點擊到了iframe的事件。

缺陷

當然,缺陷很明顯,其他方式觸發了窗口的blur時,也會觸發該事件,而不是點擊到了iframe。但對于以上場景,是完全夠用的。

代碼

import { ref, onUnmounted, Ref } from 'vue';export function useIframeClick(iframeRef: Ref<HTMLIFrameElement | undefined>,handleIframeClick: () => void
) {// 監聽iframe點擊的狀態const iframeClickDetection = ref({isSetup: false,blurTimer: null as NodeJS.Timeout | null,focusTimer: null as NodeJS.Timeout | null,});// 覆蓋層相關狀態const showClickOverlay = ref(false);const overlayTimer = ref<NodeJS.Timeout | null>(null);// 處理覆蓋層點擊const handleOverlayClick = () => {console.log('覆蓋層檢測到點擊');handleIframeClick();// 點擊后短暫隱藏覆蓋層,讓用戶能正常與iframe交互showClickOverlay.value = false;setTimeout(() => {showClickOverlay.value = true;}, 100);};// 鼠標進入覆蓋層時暫時隱藏,允許正常交互const handleOverlayMouseEnter = () => {if (overlayTimer.value) {clearTimeout(overlayTimer.value);}overlayTimer.value = setTimeout(() => {showClickOverlay.value = false;}, 500); // 500ms后隱藏};// 鼠標離開后重新顯示覆蓋層const handleOverlayMouseLeave = () => {if (overlayTimer.value) {clearTimeout(overlayTimer.value);}overlayTimer.value = setTimeout(() => {showClickOverlay.value = true;}, 1000); // 1s后重新顯示};// 設置iframe點擊檢測const setupIframeClickDetection = () => {if (iframeClickDetection.value.isSetup) return;const detection = iframeClickDetection.value;// 監聽window的焦點事件const handleWindowBlur = () => {// 延遲檢測,確保是iframe獲得了焦點detection.blurTimer = setTimeout(() => {// 檢查當前活動元素是否是iframeif (document.activeElement === iframeRef.value) {handleIframeClick();}}, 0);};const handleWindowFocus = () => {// 清除blur定時器if (detection.blurTimer) {clearTimeout(detection.blurTimer);detection.blurTimer = null;}};// 監聽鼠標移動事件,確保是真實的點擊而不是鍵盤導航let mouseMovedOverIframe = false;const handleMouseMove = (e: MouseEvent) => {const iframeRect = iframeRef.value?.getBoundingClientRect();if (iframeRect) {const isOverIframe =e.clientX >= iframeRect.left &&e.clientX <= iframeRect.right &&e.clientY >= iframeRect.top &&e.clientY <= iframeRect.bottom;mouseMovedOverIframe = isOverIframe;}};// 改進的blur處理const handleWindowBlurImproved = () => {detection.blurTimer = setTimeout(() => {if (document.activeElement === iframeRef.value && mouseMovedOverIframe) {handleIframeClick();}}, 0);};window.addEventListener('blur', handleWindowBlurImproved);window.addEventListener('focus', handleWindowFocus);document.addEventListener('mousemove', handleMouseMove);detection.isSetup = true;// 清理函數onUnmounted(() => {window.removeEventListener('blur', handleWindowBlurImproved);window.removeEventListener('focus', handleWindowFocus);document.removeEventListener('mousemove', handleMouseMove);if (detection.blurTimer) {clearTimeout(detection.blurTimer);}});};return {showClickOverlay,setupIframeClickDetection,handleOverlayClick,handleOverlayMouseEnter,handleOverlayMouseLeave,};
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92199.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92199.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92199.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

零知識證明入門應用指南:原理與Python實踐

目錄 零知識證明入門應用指南:原理與Python實踐 1. 引言:隱私計算的革命 2. 零知識證明基礎原理 2.1 數學基礎:離散對數問題 2.2 基本協議流程 2.3 核心概念 3. Schnorr協議:經典ZKP實現 3.1 協議數學描述 3.2 Python實現 4. 非交互式證明:Fiat-Shamir變換 4.1 原理 4.2 P…

PyTorch中三角函數與特殊運算詳解和實戰場景示例

在 PyTorch 中&#xff0c;三角函數&#xff08;如 sin, cos, tan 等&#xff09;和一些特殊數學運算&#xff08;如雙曲函數、反三角函數、hypot, atan2, clamp, lerp, sigmoid, softplus, special 模塊等&#xff09;被廣泛用于科學計算、機器學習、深度學習中的前向推理或梯…

論文閱讀: Mobile Edge Intelligence for Large LanguageModels: A Contemporary Survey

地址&#xff1a;Mobile Edge Intelligence for Large Language Models: A Contemporary Survey 摘要 設備端大型語言模型&#xff08;LLMs&#xff09;指在邊緣設備上運行 LLMs&#xff0c;與云端模式相比&#xff0c;其成本效益更高、延遲更低且更能保護隱私&#xff0c;因…

JavaWeb(蒼穹外賣)--學習筆記17(Websocket)

前言 本篇文章是學習B站黑馬程序員蒼穹外賣的學習筆記&#x1f4d1;。我的學習路線是Java基礎語法-JavaWeb-做項目&#xff0c;管理端的功能學習完之后&#xff0c;就進入到了用戶端微信小程序的開發&#xff0c;&#x1f64c;用戶下單并且支付成功后&#xff0c;需要第一時間通…

WebForms 簡介

WebForms 簡介 概述 WebForms 是微軟公司推出的一種用于構建動態網頁和應用程序的技術。自 2002 年推出以來,WebForms 成為 ASP.NET 技術棧中重要的組成部分。它允許開發者以類似于桌面應用程序的方式創建交互式網頁,極大地提高了 Web 開發的效率和體驗。 WebForms 的工作…

vsCode軟件中JS文件中啟用Emmet語法支持(React),外加安裝兩個常用插件

1.點擊vsCode軟件中的設置&#xff08;就是那個齒輪圖標&#xff09;&#xff0c;如下圖2.在搜索框中輸入emmet&#xff0c;然后點擊添加項&#xff0c;填寫以下值&#xff1a;項&#xff1a;javascript 值&#xff1a;javascriptreact。如下圖3.可以安裝兩個常用插件&#xf…

【第2話:基礎知識】 自動駕駛中的世界坐標系、車輛坐標系、相機坐標系、像素坐標系概念及相互間的轉換公式推導

自動駕駛中的坐標系概念及相互間的轉換公式推導 在自動駕駛系統中&#xff0c;多個坐標系用于描述車輛、傳感器和環境的相對位置。這些坐標系之間的轉換是實現定位、感知和控制的關鍵。下面我將逐步解釋常見坐標系的概念&#xff0c;并推導相互轉換的公式。推導基于標準幾何變換…

深度拆解Dify:開源LLM開發平臺的架構密碼與技術突圍

注&#xff1a;此文章內容均節選自充電了么創始人&#xff0c;CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》&#xff08;跟我一起學人工智能&#xff09;【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

tomcat處理請求流程

1.瀏覽器在請求一個servlet時,會按照HTTP協議構造一個HTTP請求,通過Socket連接發送給Tomcat. 2.Tomcat通過不同的IO模型接收到Socket的字節流數據。 3.接收到數據后,按照HTTP協議解析字節流,得到HttpServletRequest對象 4.通過HttpServletRequest對象,也就是請求信息,找到該請求…

【音視頻】WebRTC 一對一通話-信令服

一、服務器配置 服務器在Ubuntu下搭建&#xff0c;使用C語言實現&#xff0c;由于需要使用WebSocket和前端通訊&#xff0c;同時需要解析JSON格式&#xff0c;因此引入了第三方庫&#xff1a;WebSocketpp和nlonlohmann&#xff0c;這兩個庫的具體配置方式可以參考我之前的博客…

Spring(以 Spring Boot 為核心)與 JDK、Maven、MyBatis-Plus、Tomcat 的版本對應關系及關鍵注意事項

以下是 Spring&#xff08;以 Spring Boot 為核心&#xff09;與 JDK、Maven、MyBatis-Plus、Tomcat 的版本對應關系及關鍵注意事項&#xff0c;基于最新技術生態整理&#xff1a; 一、Spring Boot 與 JDK 版本對應 Spring Boot 2.x 系列 最低要求&#xff1a;JDK 1.8推薦版本…

03-基于深度學習的鋼鐵缺陷檢測-yolo11-彩色版界面

目錄 項目介紹&#x1f3af; 功能展示&#x1f31f; 一、環境安裝&#x1f386; 環境配置說明&#x1f4d8; 安裝指南說明&#x1f3a5; 環境安裝教學視頻 &#x1f31f; 二、系統環境&#xff08;框架/依賴庫&#xff09;說明&#x1f9f1; 系統環境與依賴配置說明&#x1f4c…

24. 前端-js框架-Vue

文章目錄前言一、Vue介紹1. 學習導圖2. 特點3. 安裝1. 方式一&#xff1a;獨立版本2. 方式二&#xff1a;CDN方法3. 方式三&#xff1a;NPM方法&#xff08;推薦使用&#xff09;4. 搭建Vue的開發環境&#xff08;大綱&#xff09;5. 工程結構6. 安裝依賴資源7. 運行項目8. Vue…

Spring 的依賴注入DI是什么?

口語化答案好的&#xff0c;面試官&#xff0c;依賴注入&#xff08;Dependency Injection&#xff0c;簡稱DI&#xff09;是Spring框架實現控制反轉&#xff08;IoC&#xff09;的主要手段。DI的核心思想是將對象的依賴關系從對象內部抽離出來&#xff0c;通過外部注入的方式提…

匯川PLC通過ModbusTCP轉Profinet網關連接西門子PLC配置案例

本案例是匯川的PLC通過開疆智能研發的ModbusTCP轉Profient網關讀寫西門子1200PLC中的數據。匯川PLC作為ModbusTCP的客戶端網關作為服務器&#xff0c;在Profinet一側網關作為從站接收1200PLC的數據并轉成ModbusTCP協議被匯川PLC讀取。配置過程&#xff1a;匯川PLC配置Modbus TC…

【計組】數據的表示與運算

機器數與真值機器數真值編碼原碼特點表示范圍求真值方法反碼特點補碼特點表示范圍求真值方法移碼特點表示范圍求真值方法相互轉換原碼<->補碼補碼<->移碼原碼<->反碼反碼<->補碼移位左移右移邏輯右移算術右移符號擴展零擴展整數小數符號擴展運算器部件…

視頻水印技術中的變換域嵌入方法對比分析

1. 引言 隨著數字視頻技術的快速發展和網絡傳輸的普及,視頻內容的版權保護問題日益突出。視頻水印技術作為一種有效的版權保護手段,通過在視頻中嵌入不可見或半可見的標識信息,實現對視頻內容的所有權認證、完整性驗證和盜版追蹤。在視頻水印技術的發展歷程中,變換域水印因…

電動汽車電池管理系統設計與實現

電動汽車電池管理系統設計與實現 1. 引言 電動汽車電池管理系統(BMS)是確保電池組安全、高效運行的關鍵組件。本文將詳細介紹一個完整的BMS系統的MATLAB實現,包括狀態估計(SOC/SOH)、參數監測、電池平衡和保護功能。系統設計為模塊化結構,便于擴展和參數調整。 2. 系統架構…

JVM(Java Virtual Machine,Java 虛擬機)超詳細總結

一、JVM的基礎概念1、概述JVM是 Java 程序的運行基礎環境&#xff0c;是 Java 語言實現 “一次編寫&#xff0c;到處運行” &#xff08;"write once , run anywhere. "&#xff09;特性的關鍵組件&#xff0c;具體從以下幾個方面來理解&#xff1a;概念層面JVM 是一…

Balabolka軟件調用微軟離線自然語音合成進行文字轉語音下載安裝教程

首先&#xff0c;需要準備安裝包 Balabolka NaturalVoiceSAPIAdapterMicrosoftWindows.Voice.zh-CN.Xiaoxiao.1_1.0.9.0_x64__cw5n1h2txyewy.Msix MicrosoftWindows.Voice.zh-CN.Yunxi.1_1.0.4.0_x64__cw5n1h2txyewy.Msix借助上面這個工具&#xff1a;NaturalVoiceSAPIAdapter&…