页面嵌套iframe,子框架怎么调用父页面函数

子框架调用父页面函数的方法及跨域问题

子框架内调用父页面函数,只需要写上window.parent就可以了。

这是父页面

<!-- 父页面 1.html -->
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>父页面</title>
    <script src="js/jquery-1.9.1.min.js"></script>
    <script>
        function showMessage() {
            alert('parent message');
        }
    </script>
    
</head>
<body>
    <iframe src="2.html" id="ifr1"></iframe>
</body>
</html>

这是子框架

<!-- 子框架 2.html -->
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>子iframe</title>
    <script src="js/jquery-1.9.1.min.js"></script>
    <script>    	
        function callParentMethod() {
						window.parent.showMessage();
        }
    </script>
    
</head>
<body>
    <button id=btn2 onclick="callParentMethod()">调用父页面的方法</button>
</body>
</html>
注意点:如果“父页面”和“子页面”不是同一个域名 可能与遇到如下错误

解决方法:不用本地访问,用域名访问即可。

参考文章:

页面嵌套iframe怎么调用父页面的方法,子页面回调父页面函数方法_iframe子页面调用父页面函数-优快云博客

SecurityError:阻止了具有原点的框架访问跨域框架_from accessing a cross-origin frame.-优快云博客

<think> 我们参考用户提供的三个引用,特别是引用[1]和引用[2],它们提到了在iframe嵌套页面中,页面调用父页面函数的方法。 根据引用[1]: - 当父页面页面在同一域下时,可以直接使用`parent.window.parentMethod();`来调用父页面函数。 - 当不在同一域下(跨域)时,使用`window.parent.postMessage`发送消息,父页面通过监听`message`事件来接收并处理。 根据引用[2]: - 父页面通过`window.addEventListener("message", receiveMessage, false);`来监听页面发送的消息,并在`receiveMessage`函数中处理。 因此,我们可以总结如下: 1. 同域情况(最简单): 在页面中,直接使用`parent`对象来访问父页面的全局函数或变量。 例如,父页面有一个函数`parentFunction()`,那么在页面调用:`parent.parentFunction();` 2. 跨域情况(需要消息传递): 页面使用`window.parent.postMessage`发送消息,父页面通过`message`事件监听并执行相应的函数页面发送消息示例: ```javascript // 页面中 window.parent.postMessage('message content', '*'); // 第二个参数是目标域,'*'表示不限制,也可以指定为父页面的域(如'http://example.com')以提高安全性 ``` 父页面接收消息示例: ```javascript // 父页面中 window.addEventListener('message', function(event) { // 检查消息来源的域,确保安全 // if (event.origin !== 'http://页面的域') return; // 处理消息 if (event.data === 'message content') { // 执行相应的函数 parentFunction(); } }); ``` 注意:跨域情况下,由于浏览器的同源策略,直接访问`parent.window`的方法或属性是不被允许的,因此必须使用`postMessage`方法。 另外,引用[3]提到的方法(window.open)并不适用于iframe,而是适用于通过window.open打开的窗口。 所以,针对用户的问题“页面调用父页面域内函数的方法”,我们需要区分同域和跨域两种情况。 同时,根据引用[1]的建议,如果项目前期规划好,采用统一网关、反向代理或纯前端路由等方式,可以避免跨域问题,从而简化调用。 因此,我们的回答如下: </think> ### 页面调用父页面函数的实现方法 根据引用内容,页面调用父页面函数的方法需根据**同域**或**跨域**场景分别处理: #### 📌 一、同域场景(父页面在同一域名下) ```javascript // 页面调用父页面函数 parent.window.parentMethod(); // 直接调用父页面的全局函数[^1] // 页面操作父页面DOM $('#parentElement', parent.document).hide(); // 通过jQuery操作父页面元素[^1] ``` #### 🌐 二、跨域场景(父页面不同域名) 使用`postMessage`API实现安全通信: ```javascript // 页面发送消息 window.parent.postMessage(JSON.stringify({ action: "callFunction", functionName: "parentMethod", args: [param1, param2] }), '*'); // 第二个参数指定目标域,'*'表示任意域(生产环境应指定具体域名)[^1][^2] // 父页面监听消息 window.addEventListener('message', (event) => { if (event.origin !== 'https://页面域名') return; // 安全验证 const data = JSON.parse(event.data); if (data.action === "callFunction") { window[data.functionName]?.(...data.args); // 执行对应函数 } }); ``` #### ️ 关键注意事项 1. **同源策略**:跨域时直接访问`parent.window`会引发安全错误[^1] 2. **消息验证**:父页面需验证`event.origin`防止恶意攻击[^2] 3. **架构优化**:建议通过反向代理统一域名或采用SPA架构避免跨域问题[^1] 4. **数据类型**:`postMessage`只能传输字符串,复杂对象需序列化[^1] > 最佳实践:对于新项目,建议采用**前端统一路由框架**(如Vue Router/React Router)替代iframe嵌套,从根本上规避跨域问题[^1]。 --- ### 🔍 相关问题 1. 如何安全地验证`postMessage`的消息来源? 2. 同域场景下,页面如何修改父页面的CSS样式? 3. 除了`postMessage`,还有哪些跨域通信方案? 4. 如何防止iframe中的跨域页面篡改父页面DOM? [^1]: 引用内容1 [^2]: 引用内容2 [^3]: 引用内容3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值