JavaScript 怎么跨域获取 iframe 中的内容
发布时间:2025-05-22 16:39:54 发布人:远客网络
一、JavaScript 怎么跨域获取 iframe 中的内容
要解释这个问题,首先要解释两个技术点。
每个“窗口”都是一个JS Runtime,即JS的运行时。如果只有一个窗口,那么就只有一个Runtime;如果一个窗口下面还有一个iframe,那么就有两个Runtime;以此类推。
Runtime之间互操作(或者通信)是有跨域限制的。也就是说,如果这个窗口本身是a.baidu.com域名下的页面,那么如果这个页面下还有一个iframe,这个iframe中加载的页面是b.baidu.com域名下的。那么外层的JS。就不能跟这个iframe中的内容互操作(或者通信)。
因此外层Runtime中的JS想操作内层iframe中的内容,就必须要避免跨域限制。要么内层iframe加载页面的域名跟外层是一样的。要么就是需要在内层iframe加载的页面中执行document.domain='baidu.com';从而设置跟外层的主域相同。
例如,当前页面是a.baidu.com/test.html
<iframe id="iFrm1" src="0c893329b8c9af6ff578db9b1a128d13"margin: 0px; padding: 0px; color: rgb(69, 69, 69); font-family: arial,宋体, sans-serif, tahoma,'Microsoft YaHei'; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;-webkit-tap-highlight-color: rgba(26, 26, 26, 0.301961);-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;">
<div id="innerDiv">恭喜操作到内部iframe中的元素了!!!</div>
document.domain='baidu.com';
在HTML5中新增了postMessage的API。可以方便窗口跟内部iframe之间进行通信,并且可以实现跨主域通信。但是有一些限制,1.老版本的浏览器一般不支持。2.父窗口只能向iframe中发送信息,iframe只能收消息,且父窗口不能直接操作iframe中的内容。3.父窗口发送的数据也是有限制的。只能发送基本数据类型或者plain object。
二、javascript 能否调用到iframe标签包含页面中的函数
1、可以的。只要两个页面有一定的关系,无论是通过iframe,还是frameset,甚至是window.open,超链接等等方式,都可以让两个页面之间的js互相调用。注意,是互相调用,也就是说,两者谁都有办法调用另一个的js代码。
2、当然有前提,前提就是两个页面都是你自己的页面,是在同一个域下面的,否则牵扯跨域问题,就比较麻烦了。
3、互相调用的关键是获取另一方的window对象。通常页面中window对象就是window,直接使用。但通过某种关系的另一个页面的window就需要通过别的方式获取了。以iframe为例,跨域通过普通节点获取的方式得到iframe节点,比如iframe节点id为ifr,则:
4、varifr=document.getElementById('ifr');
5、varwin=ifr.window||ifr.contentWindow;//考虑兼容性问题
这里获取到的win,就对应普通页面的window。要操作这个框架页面,就可以通过这个win进行操作了。比如获取框架页面的文档对象win.document,到了这一步,剩下的就和普通页面没有区别了。
6、这里获取到的win,就对应普通页面的window。要操作这个框架页面,就可以通过这个win进行操作了。比如获取框架页面的文档对象win.document,到了这一步,剩下的就和普通页面没有区别了。
7、要获取通过window.open打开的页面的window引用就更简单了:
8、varwin=window.open(url);//这个函数还有其它知识点,请自行搜索
而要在window.open打开的页面中获取父页面的window,也就是打开该页面的页面的window,也很简单:
9、而要在window.open打开的页面中获取父页面的window,也就是打开该页面的页面的window,也很简单:
10、varwin=window.opener;//表示打开本window的那个页面的window
获取到另一个页面的window引用后,实际上另一个页面的很多控制权就拿到了。你可以通过获取到的window随意修改另一个页面了。比如要调用iframe中的a函数,就可以这样:
11、获取到另一个页面的window引用后,实际上另一个页面的很多控制权就拿到了。你可以通过获取到的window随意修改另一个页面了。比如要调用iframe中的a函数,就可以这样:
12、varifr=document.getElementById('ifr');
13、varwin=ifr.window||ifr.contentWindow;
14、win.a();//调用iframe中的a函数
三、如何向iframe中写入js代码让js在iframe中执行
1、首先,我们新建一个网页,用于进行演示,网页代码和效果如下图所示。
2、然后,为<button>按钮添加onclick事件,响应函数名的addiframeclick()。
3、再添加javascript脚本框架,并写出addiframeclick()函数的声明。
4、addiframeclick()函数的作用是为iframe框架添加onclick()事件。
5、当点击button按钮后,会给iframe框架添加onclick()事件,点onclick()事件的响应效果是,点击iframe框架弹出信息提示。
6、如果你想要让iframe框架添加的onclick()事件内容更加丰富,能够执行更多的动作,则只需在onclick()=function(){};的大括号内添加相应的代码即可。