`
lxs647
  • 浏览: 523105 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JS跨域访问操作iframe里的dom【转】

阅读更多

很多人一直都有个想法,要是可以随心所欲的操作iframe就好了。这样静态页面也就有了相当于后台动态页面php,jsp,asp中include,require实现统一多页面布局的能力。

通过Javascript的帮忙我们可以像后台一样动态加载操作iframe对象属性src指向的html页面的内容。这样的操作需要提供两个页面,一个页面是iframe所在页面(页面名称:iPage.html),另一个页面是iframe属性src指向页面(页面名称:srcPage.html)。

iPage.html,<body>里dom:
<iframe id=“iId“ name=“iName“ src=“srcPage.html“ scrolling=“no“ frameborder=“0“></iframe>

srcPage.html,<body>里dom:
<h1>妹妹的一天</h1>  
<p>早上吃早点,中午约会吃饭,下午K歌,晚上和哥哥瞎折腾</p>

下面讨论ie下JS是怎么操作以上两个页面,再讨论firefox的做法,最后给出兼容ie,firefox浏览器操作iframe对象的方法。
一、ie下访问操作iframe里内容

大家都知道iframe是非标准html标签,它是由ie浏览器推出的多布局标签, 随后Mozilla也支持了这个标签。(闲话,嘿嘿)

1. ie通过document.frames["IframeName"]获取它,例子:我们在iPage.html里输出srcPage.html里h1的内容,JS如下:
alert(document.frames["iName"].document.getElementsByTagName(‘h1‘)[0].firstChild.data);

你会发现这样在页面里加入代码,好像并没有输出想要的东东,为什么呢?这个我也没有搞清楚,只是习惯性的加入了window.onload就有输出了(注:JS代码都写到这个事件里去),知道的人士可否告诉我下。why?更改之后代码ie下有了输出,firefox下document.frames没有定义错误提示:
window.onload = (function () {  
  alert(document.frames["iName"].document.getElementsByTagName(‘h1‘)[0].firstChild.data);
});

2. ie另一种方法contentWindow获取它,代码:
window.onload = (function () {  
var iObj = document.getElementById(‘iId‘).contentWindow;
alert(iObj.document.getElementsByTagName(‘h1‘)[0].firstChild.data);
});

此方法经过ie6,ie7,firefox2.0,firefox3.0测试都通过,好事啊!嘿嘿。(网上一查,发现Mozilla Firefox iframe.contentWindow.focus缓冲区溢出漏洞,有脚本注入攻击的危险。

后来听说可以在后台防止这样的事情发生,算是松了口气。不过还是希望firefox新版本可以解决这样的危险。)

3.改变srcPage.html里h1标题内容,代码:
iObj.document.getElementsByTagName(‘h1‘)[0].innerHTML=‘我想变成她一天的一部分‘;

通过contentWindow后访问里面的节点就和以前一样了。
二、firefox下访问操作iframe里内容

Mozilla支持通过IFrameElmRef.contentDocument访问iframe的document对象的W3C标准,通过标准可以少写一个document,代码:
var iObj = document.getElementById(‘iId‘).contentDocument;
alert(iObj.getElementsByTagName(‘h1‘)[0].innerHTML=‘我想变成她一天的一部分‘);
alert(iObj.getElementsByTagName(‘p‘)[0].firstChild.data);

兼容这两种浏览器的方法,现在也出来了,就是使用contentWindow这个方法。

嘿嘿!操作iframe是不是可以随心所欲了呢?如果还觉得不爽,你甚至可以重写iframe里的内容。
三、重写iframe里的内容

通过designMode(设置文档为可编辑设计模式)和contentEditable(设置内容为可编辑),你可以重写iframe里的内容。代码:
var iObj = document.getElementById(‘iId‘).contentWindow;
iObj.document.designMode = ‘On‘;
iObj.document.contentEditable = true;
iObj.document.open();
iObj.document.writeln(‘<html><head>‘);
iObj.document.writeln(‘<style>body {background:#000;font-size:9pt;margin: 2px; padding: 0px;}</style>‘);
iObj.document.writeln(‘</head><body></body></html>‘);
iObj.document.close();

这两个对象的资料可参考:http://msdn.microsoft.com/en-us/library/ms533720(VS.85).aspx

firebug测试以上代码性能,如图



注释掉 iObj.document.designMode = ‘On’;

iObj.document.contentEditable = true;

如图:




效果没有变,时间效率是注释前的将近三倍。嘿嘿。那两个对象是参考网络一些人的写法,重写iframe里内容,其实没有必要用designMode和contentEditable,除非有其他的需求。
四、iframe自适应高度

有了上面的原理要实现这个相当简单,就是把iframe的height值设置成它里面文档的height值就可以。代码:
window.onload = (function () {  
var iObj = document.getElementById(‘iId‘);
iObj.height =  iObj.contentWindow.document.documentElement.scrollHeight;
});

现在对JS操作iframe你已经有了全新的认识,说不定那天会因为这个有什么新的web技术名词!

  • 大小: 2.7 KB
  • 大小: 2.7 KB
分享到:
评论

相关推荐

    JS操作iframe里的dom(实例讲解)

    在实际开发中,需要注意跨域问题,因为出于安全考虑,不同源的`iframe`之间不能自由地进行DOM操作和数据交互,除非两个页面都设置了正确的`CORS`策略。此外,`iframe`的加载可能有延迟,因此在操作`iframe`内的元素...

    JS未跨域操作iframe里的DOM

    ### JS未跨域操作iframe里的DOM相关知识点 1. **同源策略** - 同源策略是浏览器的一个安全功能,它限制了不同源文档之间的交互。所谓同源指的是协议、域名、端口完全相同,如果不同源则属于跨域。 - 在没有跨域的...

    JS操作iframe里的dom

    在本篇文章中,我们将深入探讨如何使用JS在iframe内进行DOM操作。 首先,理解iframe的基本概念至关重要。iframe(Inline Frame)是HTML中的一个元素,允许在同一个HTML文档中嵌入另一个HTML文档。这在需要在页面中...

    完美解决iframe跨域问题

    2. **同源策略**:同源策略是浏览器为了安全而实施的一种策略,规定了只有同源(协议+域名+端口完全相同)的网页才能互相访问对方的DOM元素和JavaScript对象,不同源的页面则受到限制。 3. **iframe跨域问题**:当...

    Jquery方式获取iframe页面中的 Dom元素

    这是因为浏览器安全策略不允许跨域访问DOM。 首先,确保iframe元素在HTML页面中有正确的id属性。在本例中,该属性值为“frame_1”。其次,需要在主页面中引入jQuery库。这可以通过在标签中引入在线的jQuery库链接来...

    iframe跨域访问示例

    在Web开发中,"iframe跨域访问"是一个重要的概念,涉及到浏览器的安全策略和网页的嵌入技术。本文将深入探讨这个主题,以便更好地理解和应用。 首先,我们需要了解什么是iframe。Iframe,全称Inline Frame,是HTML...

    原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法

    如果父页面和iframe页面不是同源的,那么在某些浏览器中通过JavaScript访问对方的DOM元素可能会遇到跨域访问控制(CORS)的限制。这时可能需要服务器端的支持,例如设置适当的CORS响应头,或者使用postMessage API...

    iframe自适应高度(DOM动态操作)

    - **跨域限制**:当`iframe`加载的内容与主页面不在同一域名下时,由于同源策略的限制,可能会出现安全问题,导致无法访问`iframe`内部的内容。 - **性能考虑**:频繁地调用`reinitIframe`函数会增加页面的负担,...

    iframe与主框架跨域相互访问

    它们可以共享JavaScript变量、通过DOM操作互相影响,以及使用`window.postMessage`进行通信。例如,主框架可以通过以下方式获取`iframe`中的DOM元素: ```javascript var iframeDoc = document.getElementById('...

    js调用-嵌入iframe

    JavaScript可以通过DOM(Document Object Model)来操作IFrame,包括获取IFrame、修改其属性、以及与IFrame内的页面进行通信。 - **获取IFrame**:使用`document.getElementById`或`document.querySelector`等方法...

    解决ASP.NET AJAX在frame及iframe中跨域访问的问题

    1、为ScriptManager添加脚本引用,不从ScriptResource.axd中加载MicrosoftAjax.js脚本,而是直接加载 &lt;asp:ScriptReference Name="MicrosoftAjax.js" ScriptMode="auto" Path="~/ScriptLibrary/System.Web....

    iframe 跨域 自动适应高度

    然而,`iframe`在处理跨域内容时,会受到同源策略的限制,导致一些功能无法正常使用,比如获取iframe内的DOM元素或设置其高度。本文将详细讲解如何解决`iframe`跨域问题以及实现自动适应高度的功能。 1. **同源策略...

    iframe 与主框架相互访问例子,同域、跨域访问例子。

    理解并掌握`iframe`与主框架的同域和跨域访问是非常关键的,这不仅涉及页面内容的嵌入和交互,还涉及到Web应用的安全性和性能优化。在实际开发中,需要根据项目需求和安全考虑来灵活运用这些技术。

    js操作iframe的一些知识

    然后,你可以通过JavaScript的DOM操作方法动态创建或修改iframe,例如`document.createElement('iframe')`创建一个新的iframe,再通过`appendChild()`添加到页面上。 2. **获取iframe引用**:要操作iframe,首先...

    同域jQuery(跨)iframe操作DOM(实例讲解)

    在跨域操作iframe时,有时我们需要从父页面访问iframe内部的内容。此时,我们可以结合使用parent.document属性来访问父页面的document对象,再使用find()方法定位到iframe元素,之后可以再次使用contents()方法来...

    跨域修改iframe页面内容详解

    主站点内嵌代理页面, 并向代理页传递数据, 代理页根据主站点的数据对目标页的DOM进行操作.由于代理页与目标页同域, 所以代理页可以获取并操作目标页的document对象. 前提条件 需要将proxy.html放到与内嵌的iframe页...

    跨域 iframe 实例 (Cross-Domain Javascript execution library)

    2. **通信机制**:由于同源策略,父页面和子页面之间不能直接访问对方的DOM或JavaScript对象。但可以通过两种主要方式进行跨域通信:`postMessage` API和`window.name`技术。 - **postMessage API**:这是一种现代...

    js-iframe-传值调用实例代码

    请注意,由于同源策略的限制,如果iframe加载的页面与父页面不在同一域名下,那么一些跨域安全策略会阻止直接访问iframe的DOM。在这种情况下,可以使用`window.postMessage` API来进行跨域通信。 总结一下,js-...

    js实现iframe自适应高度

    接下来,我们可以利用JavaScript的DOM操作和事件监听来实现自适应高度的功能。以下是一个基本的实现步骤: 1. **获取`iframe`元素**:通过`document.getElementById`或`querySelector`方法找到页面上的`iframe`元素...

Global site tag (gtag.js) - Google Analytics