首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

父页面上的EventListener -通过iFrame滚动块

基础概念

EventListener 是 JavaScript 中用于监听特定事件并在事件触发时执行相应操作的机制。通过 addEventListener 方法,可以为元素添加事件监听器。

iFrame(内嵌框架)是一种 HTML 元素,允许在当前网页中嵌入另一个 HTML 文档。通过 iFrame,可以在一个页面中加载并显示另一个页面的内容。

相关优势

  1. 模块化设计:iFrame 可以将复杂的应用分割成多个独立的模块,便于管理和维护。
  2. 安全性:不同 iFrame 中的内容可以有不同的安全策略,减少跨站脚本攻击(XSS)的风险。
  3. 性能优化:对于大型应用,可以将不常用的部分放在 iFrame 中,按需加载,提高页面加载速度。

类型与应用场景

  • 类型
    • 同源策略下的 iFrame:内容和父页面来自同一个域。
    • 跨域 iFrame:内容和父页面来自不同的域。
  • 应用场景
    • 嵌入第三方内容(如地图、社交媒体插件)。
    • 多语言支持,不同语言版本的内容放在不同的 iFrame 中。
    • 复杂的单页应用(SPA),将不同功能模块放在不同的 iFrame 中。

遇到的问题及解决方法

问题描述

在父页面上通过 iFrame 滚动块时,可能会遇到事件监听器无法正确触发的问题。

原因分析

  1. 同源策略限制:浏览器的安全策略限制了跨域 iFrame 中的事件传递。
  2. 事件冒泡和捕获机制:事件可能没有正确地在父页面和 iFrame 之间传递。

解决方法

同源策略下的解决方案

如果父页面和 iFrame 内容来自同一个域,可以直接在父页面上监听 iFrame 内的事件。

代码语言:txt
复制
<!-- 父页面 -->
<iframe id="myIframe" src="child.html"></iframe>
<script>
  document.getElementById('myIframe').contentWindow.addEventListener('scroll', function() {
    console.log('iFrame scrolled');
  });
</script>
代码语言:txt
复制
<!-- child.html -->
<div style="height: 2000px;">Scroll me!</div>
跨域解决方案

如果父页面和 iFrame 内容来自不同的域,可以使用 postMessage API 进行跨域通信。

父页面:

代码语言:txt
复制
<iframe id="myIframe" src="https://example.com/child.html"></iframe>
<script>
  window.addEventListener('message', function(event) {
    if (event.origin !== 'https://example.com') return; // 安全检查
    console.log('Received message:', event.data);
  });

  document.getElementById('myIframe').contentWindow.postMessage('listenForScroll', 'https://example.com');
</script>

子页面(child.html):

代码语言:txt
复制
<script>
  window.addEventListener('message', function(event) {
    if (event.origin !== 'https://parentdomain.com') return; // 安全检查
    if (event.data === 'listenForScroll') {
      window.addEventListener('scroll', function() {
        event.source.postMessage('iFrame scrolled', event.origin);
      });
    }
  });
</script>
<div style="height: 2000px;">Scroll me!</div>

总结

通过上述方法,可以在父页面上有效地监听 iFrame 中的滚动事件,无论是同源还是跨域情况。关键在于理解浏览器的同源策略和事件传递机制,并合理利用 postMessage API 进行跨域通信。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

手摸手打造类码上掘金在线IDE(四)——双向通信

前言 写字楼里写字间,写字间里程序员; 程序人员写程序,挣点小钱过大年 一首定场诗送给大家 上回书说道,一个在线IDE所必备的条件之一——沙箱环境,我们讲了现在市面上主流的沙箱环境的原理 讲了现在主流...和沙箱环境,只能通过window.postMessage 来传递。...我们知道 src 引入方式他首先有个跨域限制,于是,跨域限制就会导致我们只能通过postMessage 来通信 我们上回书说道,如果通过 postMessage来通信!...// 向父组件发送消息,并且根据tpye来区分不同的消息 this....,其实在真正的通信中,还有很多类型,比如完成之后的通信,重新渲染的通信,等等 在这里我们暂且按下不表,因为后面还有个重头戏,编译,这一块是整个内容中最重要的部分,因为涉及babel,vuesfc解析等内容

78930
  • 前端之HTML和CSS

    a>   块元素标签(行元素)和内联元素标签(行内元素)   标签在页面上会显示成一个方块。... 4、id选择器   通过id名来选择元素,元素的id名称不能重复,所以一个样式设置项只能对应于页面上一个元素,不能复用,id名一般给程序使用,所以不推荐使用id作为选择器。...,常用的属性有: 1、none 元素隐藏且不占位置 2、block 元素以块元素显示 css元素溢出 当子元素的尺寸超过父元素的尺寸时,需要设置父元素显示溢出的子元素的方式,设置的方法是通过overflow...3、scroll 内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。 4、auto 如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。...页面 iframe src="001.html" frameborder="0" name="mainframe">iframe> 上面的iframe窗口,缺省显示001.html页面,

    4.3K30

    【JS应用】Iframe 解决跨域

    ,网上相关内容一抓一大把,但是突然学习到一个关于前端解决跨域的方式 就是 利用 iframe 不管你有没有了解过,反正我没有 我觉得很有用并且容易忘,所以我记录下来哈哈哈 下面会分三块内容进行描述...来解决这个问题 基本原理 1、需要三个页面 两个同域(a.com)的 页面,一个和接口同域的 页面(b.com) 其中一个页面是父页面,也就是真正的内容页,展示数据的 另外两个作为子页面,是辅助父页面请求跨域数据用的...5、给父页面传递数据 上面那个 a.com 页面是辅助页,拿到数据之后,需要传递给真正需要数据的父页面(同样是 a.com 下) 大概了解之后,我们来说一下简单流程 现在有 a.com 下的内容页 A,...window.name 3、隐藏 iframe 由页面B 跳转到 a.com 下另一个辅助页(页面C) 4、页面C 读取到 B存放的 window.name,然后传递给 父页面A 5、父页面A 拿到...数据,用于展示在页面上 简单模拟 现在我启动了两个服务 1、localhost:3001 下有 a.html 和 c.html a.html 是内容页,需要使用数据的终端页(以下简称A) c.html

    15.3K11

    学员投稿 | iframe 解决跨域

    ,网上相关内容一抓一大把,但是突然学习到一个关于前端解决跨域的方式 就是 利用 iframe  不管你有没有了解过,反正我没有 我觉得很有用并且容易忘,所以我记录下来哈哈哈 下面会分三块内容进行描述... 来解决这个问题 基本原理 1、需要三个页面 两个同域(a.com)的页面,一个和接口同域的页面(b.com) 其中一个页面是父页面,也就是真正的内容页,展示数据的 另外两个作为子页面,是辅助父页面请求跨域数据用的... 中 4、页面跳转 上一步保存完数据之后,由 b.com 页面 跳到 a.com 页面 此时 a.com 页面就能通过 window.name 拿到 b.com 保存过的数据啦 5、给父页面传递数据 上面那个... a.com 页面是辅助页,拿到数据之后,需要传递给真正需要数据的父页面(同样是 a.com 下) 大概了解之后,我们来说一下简单流程 现在有 a.com 下的内容页 A,需要请求接口 b.com/xxxx...隐藏 iframe 由页面B跳转到 a.com 下另一个辅助页(页面C) 4、页面C读取到B存放的 window.name,然后传递给父页面A 5、父页面A 拿到数据,用于展示在页面上 简单模拟 现在我启动了两个服务

    2.5K30

    记录工作中遇到的各种问题(Bug,总结,记录)

    父页面中有iframe,iframe里面有分页按钮,在父页面对iframe做加载之后监听iframe中点击事件的操作,初始第一页正常,但点击第二页之后事件就失效了 原代码: ?...第一次成功打印出来,即触发了load事件,但点击下一页后,iframe实际上已经刷新了,但并不会再触发这个load事件 后来的解决办法是换了种监听方法,区别主要是获取iframe对象的方式变了,还不知为啥会这样...有个编辑器叫做 wangEditor,也有一些坑 wangEditor默认的吸顶 滚动会影响页面上position: fixed的元素 可依据文档中配置为false ?...,所以解决办法是通过iframe>嵌入pdf文件的地址,不过还有问题,见下一个 59.  ...iPhone或iPad的safari浏览器通过iframe>嵌入pdf来预览时,只能看到第一页,无法滚动翻页查看更多 这个问题是ios自家的bug了,所以为了解决,只能引入第三方支持(不再使用浏览器自身支持的

    18.2K12

    vivo 商品中台的可视化微前端实践

    看到这,小伙伴可能会有以下疑问: iframe 和父窗口的数据通信是通过 postMessage 完成的,这里为什么不使用 postMessage 呢?...通过上述 6 个步骤,就可以让用 iframe 做展示容器的商品预览页和商品管理页共享 store 啦。 这里,小伙伴可能会有疑问,为什么要使用沙箱 vue 呢?...而我们通过 uni-render ,让父窗口和 iframe 子窗口的数据通信不再需要 postMessage ,同时只使用 vue 生态中的 vuex 做数据通信。...3.2 可视化总结 综上,商品中台的可视化介绍完了,我们通过 uni-render 技术方案让商品预览页( iframe )和商品管理页的数据通信只通过 vuex 即可完成。...六、总结 综上,我们对商品中台的可视化和微前端做了整体的阐述,包含以下内容: 通过 uni-render 技术方案解决了可视化页面 iframe 和父页面的数据通信问题。

    1.2K50

    Scroll,你玩明白了嘛?

    而且相较于其他的方法,一般不会出什么幺蛾子(后文会讲到)。 3.2 应用 自己以往需要用到滚动的场景有: 组件初始化,定位到目标位置 点击当前页靠底部的某个元素,触发滚动翻页 .........1、页面有 iframe 的情况下,比如说这个例子。 表现是当 iframe 内的内容发生滚动时,主页面也发生了滚动。...这显然和 MDN 上的描述不一致: Element 接口的 scrollIntoView () 方法会滚动元素的父容器,使被调用 scrollIntoView () 的元素对用户可见。...但从现象上看,影响的不只是 “所在滚动区” 或者 “父容器”,祖先 DOM 元素也被影响了。 由于寻觅不到 scrollIntoView 的源码,暂时只能定位到是 start 这个默认值在做妖。...所以在不那么严格的场景下,上述的代码其实可以抛弃 eventListener 的部分,只保留兜底的逻辑,进一步简化: /** 列表滚动封装 */ export const listScroll = (

    3.2K22

    见识了电信流氓插iframe+分析解决方案

    首先毫无疑问wp后台是使用的iframe的结构,我们来把滚动条拉到末端,发现页面底部无故多出大片空白。最里边的滚动条拉到底部是正常的wp的最底部,另外两个滚动条到底部之后呈现的空白块又是什么呢?...通过chrome右键的审查元素我们发现,我们的页面被嵌入了一个iframe之中,而正因为文章编辑这个页面本身有一层iframe(src:post-new.php),这里被挂了一次iframe,加上wp后台边栏这一层又被加了一次...iframe,所以出现了3个滚动条。...,而第二个iframe的src是空白页,而重点就在于后面的js。...通过我水水的前端水平,起码我可以看出:第一,这个js请求了某“logo.jpg”(不要被这寻常的名字和后缀名骗到了,后面给他传参数呢),并放在了第二个iframe中(也就是src是空白页的那个)。

    1.4K20

    2021前端面试高频 HTML + CSS

    常见的行内元素有: a b span img button input label select textarea 「块级元素:」 块级元素占据父容器的整个宽度。...的区别是不会随之浏览器关闭消失,除非主动删除,最大存储 5M ❞ 15. iframe 有哪些缺点 ❝ iframe 会 阻塞页面的 onload 事件,它会等待 iframe 加载执行完后,再执行...使用图片 base64 优点缺点 ❝base64编码是一种图片处理格式,通过特定的算法将图片编码成一长串字符串,在页面上显示的时候,可以用该字符串来代替图片的 url 属性。 优点 : 「1....元素的包含块为 viewport 视口。该定位方式常用于创建在滚动屏幕时仍固定在相同位置的元素。 元素的位置在屏幕滚动时不会改变。...❞ sticky 粘性定位 ❝元素根据正常文档流进行定位,然后相对它的最近滚动祖先 和 最近块级祖先 。

    95040

    RenderingNG中关键数据结构及其角色

    : ❝绘画块的有序列表,即显示项目组和属性树状态,作为「渲染管道」图层化Layerize步骤的输入数据 ❞ 整个「绘制块列表」可以合并成一个合成层并一起栅格化,但这需要在用户每次滚动时进行昂贵的栅格化操作...一个好的方法是「默认合并图块」,也就是「不对具有属性树状态的绘制块进行合并处理」,这些属性树状态可能会在「合成器线程」上发生变化,比如合成器线程的滚动或合成器线程的变换动画。...例如,当滚动一个网站时,现有瓦片的位置会向上移动,只是需要为更远的页面内容栅格化一个新瓦片。 上面的图片有四张「瓦片」。当滚动发生时,「第五块」瓦片开始出现。...另一个例子是存在「站点隔离」的多个iframe之间。这种嵌入是表面Surface通过完成的。 当一个合成器提交一个合成器帧时,它伴随着一个用于区分合成帧的标识符,即「表面ID」。...这也是一个优化不必要的中间纹理或屏幕外内容的机会。例如,在很多情况下,一个独立网站的iframe的合成器帧不需要它自己的中间纹理,可以通过绘制quad直接绘制到框架缓冲区。

    2K10

    网页内容加速黑科技趣谈

    通过新 tab 打开的页面,其加载速度竟然比直接点击链接打开的页面要快。不信请看视频(译者注:可能需要访问外国网站):GitHub link click vs new tab。...点击链接的同时复制链接并在新的 tab 页中打开。可以看到,尽管先点击的是链接,但渲染更快的却是新 tab 中打开的页面。...是写到 iframe 中的,但它却出现在了父级的 document 中!这是因为解析器维护了一个敞开元素栈(stack of open elements),新创建的元素会被压入栈中。...与常规 JSON 相比,ND-JSON 提前 1.5s 将内容渲染到页面上,尽管速度不如 iframe 方法那么快。在创建元素之前,必须等待完整的 JSON 对象出现。...如果你的 JSON 文件体量巨大,可能会陷入对流的企盼之中。 单页应用?别着急 如前所述,Github 使用了大量的代码,然而却带来这样的性能问题。

    2.9K10

    25个经典Selenium自动化面试题,赶紧收藏

    (4)如何去定位页面上动态加载的元素?...另外xpath定位有通过绝对路径定位的,有时会不准确; 而用css选择器定位比较简洁,运行速度更快,通常用于性能要求严格的场景。 (15)如何判断一个页面上元素是否存在?...飘忽不定,定位方法也是一样,根据元素属性定位(元素的tag name属性是不会变的,动的只是class属性和style属性) (17)如何通过子元素定位父元素?...通过父元素定位子元素,可以通过二次定位来找到。...第一种:通过子元素定位父元素,selenium提供了parent方法,但是只能定位到父元素,却不能获取元素属性,也不能操作。 第二种:通过xpath的语法直接定位。 如.

    2.6K30

    油猴脚本从编写到检测

    油猴脚本记(含检测) 写脚本 模拟爬取市面上网站(淘宝、京东、美团等)的页面内容 油猴脚本是通过JS来编写,我也才接触只是对dom进行操作来完成 首先是@match需要设置,就是用来说明脚本在哪个页面执行...那么脚本就设置在列表页进行 为了直观显示,将在列表页创建一个iframe用来显示爬取的详情页 模拟用户去点击每一个商品操作,这样子做轮询 实现 列表页:获取当前的页面,获取商品数,获取每个商品的链接...= 0)now_car_info_i[0].parentNode.removeChild(now_car_info_i[0]); //调用父删除iframe var iframe =...所以如果要对脚本进行检测,没有像上面代码这样子向页面中植入iframe的话,通过去检测dom和window是无法检测出使用油猴脚本的。...同时也可以通过用户的行为等方式来辅助的进行判断,因为人工去点击和脚本去执行操作还是有很大的不同。 Q.E.D.

    5.1K10

    html学习

    --只有1-6级标签,设置h7会不识别,而当作普通文字进行解析--> p 划分段落,自动在段前段后自动加空行 align段落的对齐方式,默认为居左 hr 分隔符标签,会在页面上显示一条分割线 size属性.../表示本层 ​ 第二种互联网路径 必须在前面加上https:// alt属性:图片无法显示的时候显示的文字 width height 可以是400也可以是百分比,百分比是父标签的百分比...标签 内联框架标签 iframe元素会创建一个包含另一个文档的内联框架() name属性:指定iframe的名称,如果 a 标签的中的 target 属性值是其 name 属性的时候,点击a标签,对应...的链接内容会出现在 iframe 中 src属性:指的是iframe中显示的内容的连接 frameborder属性:取值为0(不显示边框)和1(显示边框) scrolling属性:取值为yes(可以滚动...、等等一些 笔记 笔记1 子标签可以继承宽度值,不能直接继承高度值 但是有一些标签是例外例如 iframe需要父标签同时设置 笔记2 常用的响应状态码 常用状态码 意义 200 请求成功 302 重定向

    1.5K10
    领券