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

iframe 引用父页面的js

iframe 是一种 HTML 元素,用于在当前网页内嵌另一个网页。当使用 iframe 嵌入一个页面时,这个被嵌入的页面(子页面)会在其自身的上下文中运行,这意味着它有自己的全局对象、文档对象等。然而,有时我们可能需要在子页面中访问或操作父页面的 JavaScript 环境。

基础概念

iframe 中引用父页面的 JavaScript 主要通过以下几个方法实现:

  1. window.parent:这个属性指向包含当前 iframe 的窗口对象,即父页面的窗口对象。通过它,可以访问父页面的全局变量、函数等。
  2. document.domain:当跨域的 iframe 需要访问父页面的内容时,可以通过设置相同的 document.domain 来实现。这通常用于同一二级域名下的不同子域名之间的通信。
  3. postMessage API:这是一个安全的跨域通信机制,允许不同源的窗口之间发送消息。

相关优势

  • 代码复用:可以在多个页面中共享相同的 JavaScript 逻辑,减少重复代码。
  • 模块化:可以将功能模块化,通过 iframe 嵌入到不同的页面中,提高代码的可维护性。
  • 安全性:通过 postMessage 等机制,可以在保证安全的前提下实现跨域通信。

类型与应用场景

  • 同源策略下的引用:当 iframe 和父页面同源(协议、域名、端口都相同)时,可以直接通过 window.parent 访问父页面的 JavaScript。
  • 跨域策略下的引用:当 iframe 和父页面不同源时,需要借助 postMessage 或设置相同的 document.domain 来实现通信。

示例代码

同源策略下的引用

父页面 (parent.html):

代码语言:txt
复制
<!DOCTYPE html>
<html>
<head>
    <title>Parent Page</title>
</head>
<body>
    <iframe src="child.html" width="600" height="400"></iframe>
    <script>
        window.myFunction = function() {
            alert('This is a function from the parent page!');
        };
    </script>
</body>
</html>

子页面 (child.html):

代码语言:txt
复制
<!DOCTYPE html>
<html>
<head>
    <title>Child Page</title>
</head>
<body>
    <button onclick="window.parent.myFunction();">Call Parent Function</button>
</body>
</html>

跨域策略下的引用(使用 postMessage

父页面 (parent.html):

代码语言:txt
复制
<!DOCTYPE html>
<html>
<head>
    <title>Parent Page</title>
</head>
<body>
    <iframe id="myIframe" src="https://example.com/child.html" width="600" height="400"></iframe>
    <script>
        window.addEventListener('message', function(event) {
            if (event.origin !== 'https://example.com') return; // 安全检查
            alert('Message received from iframe: ' + event.data);
        });
    </script>
</body>
</html>

子页面 (child.html):

代码语言:txt
复制
<!DOCTYPE html>
<html>
<head>
    <title>Child Page</title>
</head>
<body>
    <button onclick="window.parent.postMessage('Hello from iframe!', 'https://parentdomain.com');">Send Message to Parent</button>
</body>
</html>

遇到的问题及解决方法

问题:尝试在 iframe 中访问父页面的 JavaScript 时遇到跨域错误。

原因:浏览器的同源策略阻止了不同源页面之间的直接访问。

解决方法

  1. 使用 postMessage API:如上例所示,通过 postMessage 实现安全的跨域通信。
  2. 设置相同的 document.domain:如果 iframe 和父页面属于同一二级域名下的不同子域名,可以设置相同的 document.domain 来绕过同源策略的限制。
代码语言:txt
复制
// 在父页面和子页面中都添加以下代码
document.domain = 'example.com';

请注意,修改 document.domain 会降低安全性,因此应谨慎使用,并确保只在必要时才这样做。

通过以上方法,可以在 iframe 中有效地引用和操作父页面的 JavaScript 环境。

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

相关·内容

  • js的动态加载、缓存、更新以及复用(一)使用范围:遇到的问题:目标:页面结构:正文

    4、  Js文件的复用。 页面结构:   一般OA、MIS这一类的项目,大多采用frameset或者iframe的方式来实现,这样就有了父页和子页的概念。我们可以利用这一点来做做文章。   ...复用   这个就要先看看上面那个图了,就是页面结构,有一个外壳页(或者首页),我们叫做父页。里面还有若干个iframe加载的页面,我们加做子页。   ...一般的做法是,父页里加载jQuery.js,然后子页里也要加载jQuery.js。当然当子页在加载jQuery.js的时候,直接从缓存里面提取,一般不会再去折腾服务器了。   ...优点就是,所有的js文件都在父页里加载,子页直接使用父页里加载好的js,这样子页就不需要在折腾js文件了。....$ (’div’) ; //能够找到div,但是不是子页的div而是父页里的div。   咋回事呢?原因就在于搜索范围。jQuery是有三个参数的,我们平时只用了第一个,后面的就被忽略了。

    4.1K50

    作为window对象属性的元素 多窗口和窗体

    一个窗口或标签页中的脚本可以打开新的窗口或者标签页。当一个脚本这样做,多个窗口可以相互操作 iframe 已经处于半废弃的inframe标签。挺无奈的,已经快废了。...不过学习还是学习一下吧 iframe是用来嵌套多个文档的。由iframe所创建的嵌套浏览上下文是用自己的window对象表示的。每一个iframe都是一个独立的window对象。...对于客户端js来说,窗口,标签页,iframe和框架都是浏览上下文。对于js来说都是window对象。...使用 _top(顶级祖先窗口) 和 _parent(直接父级窗口) 来获取上下文。 窗口名字 窗口名字,运行open()方法引用已存在的窗口。...即,通过这样两个窗口可以实现相互引用。或者调用对方的方法。

    2.1K50

    layer弹出层详解

    layer如何获取父界面的元素,比如我点击新增按钮,在layer框编辑后提交,是如何关闭当前layer框,额,关闭layer框很简单,但是如何关闭后根据父界面的form表单向后台发起Ajax请求,,刷新信息...即:layer子界面如何调用父界面的方法。 如果你不想使用Layui,而只是想使用layer,你可以去layer独立组件官网下载组件包。...); //再执行关闭 layer.getChildFrame(selector, index) – 获取iframe页的DOM 当你试图在当前页获取iframe页的DOM元素时,你可以用此方法。...')[0]['name']]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method(); 7 console.log(body.html())...(windowName) – 获取特定iframe层的索引 此方法一般用于在iframe页关闭自身时用到。

    5.2K20

    JQuery javascript实现父子页面相互调用

    场景1 父页面调用子页面 如上图,在iframe子页面的元素中,定义了taskStatus全局变量,如果希望在其父页面中获取该全局变量的值,则可在父页面的元素中新增js脚本如下...: var taskStatus = document.getElementById('iframe-1-11').contentWindow.taskStatus; 注:这里iframe-1-11为子页面...iframe id属性值 注:也可以通过上述方式去调用子页面定义的全局函数 场景2 子页面调用父页面 如上图,如果希望在iframe子页面中获取父页面当前tab页面,以获取tab标签页其它信息...,可在父页面的元素中新增js脚本如下: var currentTab = window.parent....; # 后续操作 var tabID = currentTab.panel('options').id; …… 说明:此处的#tabs 为easyui tab div容器的id 上述带背景色部分的js

    2K20

    bootstrap3-dialog打开嵌套iframe窗口

    ,在关闭事件后传递消息通知父级页面关闭dialog window.addEventListener('message', receiveMessage, false); function...的一个标识,title是dialog的标题名字,url为嵌套内的页面地址,height/weight就是高/宽,callback就是dialog关闭时的回调函数,比如新增数据时关闭新增页面调用回调函数刷新列表页,...其中对页面的嵌套就是通过对dialog中的内容加载嵌套一个iframe实现,但是这样整体样式会有些问题,所以我们通过对modalbody,modaldialog的一些样式进行了调整,特别注意,需要先调用...中打开窗口,遮罩层和dialog都会以iframe为基准,但有时候这样会显的窗口太小使用不方便,所以我们这里要再加一种方法,打开全局dialog,就是如果在iframe中打开,dialog要显示在iframe.../static/common/dialog.js 注: 使用时引用jquery,bootstrap-dialog.js,bootstrap-dialog.css,dialog.js 提供一个调用示例:

    45420

    Chrome 浏览器现在会显示每个活动标签页的内存使用情况了

    注意 随时间稳步增加 JS 堆或 DOM 节点 某些用户操作后,JS 堆中出现尖峰 这可能表明存在潜在的内存问题,值得进一步调查。性能监控器可用于确认可疑问题。...使用 DevTools 测量内存使用情况 Chrome DevTools 中的 "内存 "面板可让你深入了解页面的内存消耗情况。你可以对堆分配进行快照,记录分配时间线,并按组件检查内存使用情况。...使用性能API 对于编程内存测量,浏览器API performance.measureUserAgentSpecificMemory() 允许测量页面的总内存使用情况。...一些常见的来源包括: 在DOM分离时忘记移除事件侦听器 在闭包中无意中捕获对DOM元素的引用 增长的数据结构,如 map 或数组,不进行清理 未能正确关闭 Web Workers 父 iframe 和...iframe 上下文之间的残留引用 闭包和意外的引用是一个常见的原因。

    59210

    那些年前端跨过的域

    window.name 还有一种实现思路,就是 数据页在设置完 window.name 值之后,通过 js 跳转到与父页面同源的一个页面地址,这样的话,父页面就能通过操作同源子页面对象的方式获取 window.name...www.a.com 与 news.a.com 被认为是不同的域,那么它们下面的页面能够通过 iframe 标签嵌套显示,但是无法互相通信(不能读取和调用页面内的数据与方法),这时候我们可以使用 js 设置...name: 'document.domain', version: '1.0.0' }) // 设置一些全局方法 window.getTestContext = function () { // 尝试调用父页面的方法...该方案要做到父子页面的双向通信,需要用到 3 个页面:主调用页,数据页,代理页。...这是因为主调用页可以修改数据页的 hash 值,但是数据页不能通过 parent.location.hash 的方式修改父页面的 hash 值(仅 IE 与 Chrome 浏览器不允许),所以只能在数据页中再加载一个代理页

    2K60

    vivo 悟空活动中台 - 微组件状态管理(下)

    假如代码如下,父窗口暴露store对象给子iframe访问,在子窗口中获取数据,能保持数据的响应式嘛?...computed: { title() { // __store__子页面获取父页面的store对象 // 能不能保证反应式 ?...因为 iframe 的关系父窗口的Dep.target获取值为null,导致父的dep对象收集不到子iframe中的watcher,阻断了响应式,关键代码如下图: 8、守正出奇 我们能不能将中断的父子窗口的依赖收集...神器Vue.observable来帮忙 通过在子 iframe 中使用 Vue.observable 添加对父 store 的 state的包装,可以实现在子 iframe 保留一份响应式 Dep 的收集...8.1 抽象parent-store-mixin 通过 parent-store-mixin 将父窗口的store挂载在子 iframe窗口内vue对象的$pstore属性上,方便 在vue组件内获取父窗口的

    1.7K40

    油猴脚本从编写到检测

    油猴脚本记(含检测) 写脚本 模拟爬取市面上网站(淘宝、京东、美团等)的页面内容 油猴脚本是通过JS来编写,我也才接触只是对dom进行操作来完成 首先是@match需要设置,就是用来说明脚本在哪个页面执行...接下来就是写脚本,主要思路是 页面分为列表页,从列表页可以进入详情页。...那么脚本就设置在列表页进行 为了直观显示,将在列表页创建一个iframe用来显示爬取的详情页 模拟用户去点击每一个商品操作,这样子做轮询 实现 列表页:获取当前的页面,获取商品数,获取每个商品的链接...function() { 'use strict'; var content = document.getElementsByClassName("info--wrap"); //获取当前页面的所有商品...= 0)now_car_info_i[0].parentNode.removeChild(now_car_info_i[0]); //调用父删除iframe var iframe =

    5.1K10

    新窗口创建问题 | Electron 安全

    还是当前页面的父页面? 还是顶级导航的页面,还是干脆新打开一个标签/窗口来展示 _self:当前页面加载。(a标签默认) _blank:通常在新标签页打开,但用户可以通过配置选择在新窗口打开。...如果未启用 popup,也没有声明窗口特性,则新的浏览上下文将是一个标签页。...c窗口,即其父窗口,无法执行 Node.js 0x05 window.open 上下文情况 父窗口调用 window.open 创建子窗口时会返回一个指向新窗口对象的引用,父窗口可以通过这个引用直接访问子窗口的上下文...同源情况下,子窗口获取父窗口上下文测试 同源情况下的访问是双向的,与之前 iframe 、object 之类的没有区别 非同源情况下,按照正常来说,父窗口访问子窗口应该还是一样的 结果并不是我们想的那样...Node.js 的能力,除非显式地设置 features ,限制其能力 在上下文方面,window.open 表现与之前的 iframe等基本一致,父子窗口同源情况下可以通过引用获取上下文,非同源就需要

    65210
    领券