iframe子页面与父页面间的方法,属性互相调用

本文详细介绍了一种在父页面与子页面(iframe)间进行数据传递和方法调用的技术方案,包括使用纯JS和jQuery两种方式实现父页面向子页面发送数据,以及子页面向父页面发送数据的方法。

以下方式亲测可以使用

1.建议一个动态web工程,本人使用的是eclipse,建立两个jsp页面及一个jquery插件,一个是父页面,一个子页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>
<title>Insert title here</title>
</head>
<script type="text/javascript">
     var parVal = '我是父页面默认变量值!!';
     function parentToChild(){
    	 //获取子页面窗口对象
    	 var childWin = document.getElementById('frame1').contentWindow;
    	 //调用子页面对象
    	 childWin.childtest();
    	 //获取子页面标签对象,并修改
    	 var childInp1 = childWin.document.getElementById('inp1');
    	 childInp1.value='js修改子页面inp1的值';
     }
     $(function(){
		     $("#btn").click(function(){
		    	 //获取子页面窗口对象
		    	  var childjq = $("#frame1").contents();
		    	 //获取子页面标签对象
		    	  var inp1val = childjq.find("#inp1");
				  //为子标签属性赋值
		    	  inp1val.val('jquery修改子页面inp1的值')
		     });
     });
     
     function childToParent(){
           alert('我是父页面 childToParent 方法,待子页面调用');    	 
     }
</script>
<body>
            <div>父页面</div>
            <div>
                  <input id="pInput1" value="我是父页面-pInput1-的值">
            </div>
            <iframe id="frame1" style="width: 400px;height: 400px;margin-top: 20px" src="child.jsp"></iframe>
            <button onclick="parentToChild()">父页面调用子页面</button>
            <button id="btn" onclick="parentToChildJquery()">父页面调用子页面==jquery</button>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>
<title>Insert title here</title>
</head>
<script type="text/javascript">
      function childtest(){
         //$("#inp1").val('修改inp1的值');
         alert('子页面供父页面调用,测试方法');    	 
      }
      function childToP(){
    	 // 下面两种操作父页面方法的方式一样
    	 // window.parent.childToParent();
    	  parent.childToParent();
    	  var parInp = window.parent.document.getElementById('pInput1');
    	  parInp.value='通过子页面js赋值';
      }
      
      $(function(){
    	  $("#btn3").click(function(){
    		  //获取父页面标签对象
    		  var parInp = parent.$("#pInput1");
    		  //通过jquery为父页面对象赋值
    		  parInp.val('通过子页面jquery赋值')
    		  //调用父页面方法
    		  parent.childToParent();
    	  }) ;
      });
</script>
<body>
         <div >iframe子页面测试</div>
         <input style="margin-top: 50px" id="inp1" value="通过父页面来修改此值~~~">
         <button id="btn2" onclick="childToP()">js子页面调用父页面</button>
         <button id="btn3">jquery子页面调用父页面</button>
</body>
</html>

è¿éåå¾çæè¿°

### 如何从父页面触发 iframe 页面的 `onload` 事件 在 HTML 和 JavaScript 中,可以通过操作 DOM 来实现父页面 iframe 页面的交互。当需要从父页面触发 iframe 的 `onload` 事件时,可以利用以下几种方法。 #### 方法一:通过监听 iframe 的 load 事件 父页面可以直接绑定到 iframe 元素上的 `load` 事件来检测页面加载完成的时点。以下是具体代码示例: ```javascript // 获取 iframe 元素 var iframeElement = document.getElementById('myIframe'); // 绑定 load 事件 iframeElement.onload = function () { console.log("iframe 页面已加载完毕"); }; ``` 这种方法适用于同源策略下父页面的通信[^1]。如果跨域,则无法访问 iframe 内部的内容或执行其脚本。 --- #### 方法二:手动触发动态创建的 iframe 加载过程 有时可能需要动态设置 iframe 的 src 属性或者重新加载它以触发动态的 `onload` 事件。这种情况下可采用如下方式: ```javascript // 动态获取并重置 iframe 的 src 属性 var iframeElement = document.getElementById('myIframe'); iframeElement.src = iframeElement.src; // 或者直接刷新 iframe 页面 iframeElement.contentWindow.location.reload(); ``` 上述代码会强制让 iframe 进入新的加载流程,并自动触发它的 `onload` 事件处理程序[^2]。 --- #### 方法三:调用页面内的函数模拟 onload 行为 假如希望更灵活地控制何时触发某些逻辑而不仅仅是依赖默认的 `onload` 时点,可以在页面定义好特定初始化函数之后由父页面主动去调用这个函数作为替代方案之一: ```javascript // 假设这是存在于 childPage.js 文件里的一个公开可用功能 function initializeChildFrame() { ... } // 父页面中尝试调用该初始化器 document.getElementById('myIframe').contentWindow.initializeChildFrame(); ``` 注意这里同样受限于浏览器的安全模型即所谓的“Same-Origin Policy”,只有两者处于相同协议、端口以及主机名的情况下才允许互相访问彼此的对象属性方法[^3]。 --- ### 总结 综上所述,在满足同源条件下,最常用的方式是从父窗口监控 iframe 的 load 事件;而对于特殊需求则考虑调整资源地址促使重新渲染或是直接介入目标文档内部结构进行自定义化管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值