JS之iframe

0.什么是iframe: iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。

1. 获得iframe的window对象:(存在跨域访问限制)

chrome: iframeElement. contentWindow 
firefox:   iframeElement.contentWindow 
ie6:       iframeElement.contentWindow

function getIframeWindow(element){
    return  element.contentWindow;
    //return  element.contentWindow || element.contentDocument.parentWindow;
}

2. 获得iframe的document对象:(存在跨域访问限制)

chrome:iframeElement.contentDocument
firefox:  iframeElement.contentDocument
ie:        element.contentWindow.document
备注:ie没有iframeElement.contentDocument属性。

var getIframeDocument = function(element) {
    return  element.contentDocument || element.contentWindow.document;
};

3. iframe中获得父页面的window对象:

存在跨域访问限制。

父页面:window.parent
   顶层页面:window.top
   适用于所有浏览器

4.同域下父子页面的通信

父页面parent.html:

<html>
<head>
    <script type="text/javascript">
        function say(){
            alert("parent.html");
        }
        function callChild(){
            myFrame.window.say();
            myFrame.window.document.getElementById("button").value="调用结束";
        }
    </script>
</head>
<body>
    <input id="button" type="button" value="调用child.html中的函数say()" onclick="callChild()"/>
    <iframe name="myFrame" src="child.html"></iframe>
</body>
</html>

子页面child.html:

<html>
<head>
    <script type="text/javascript">
        function say(){
            alert("child.html");
        }
        function callParent(){
            parent.say();
            parent.window.document.getElementById("button").value="调用结束";
        }
    </script>
</head>
<body>
    <input id="button" type="button" value="调用parent.html中的say()函数" onclick="callParent()"/>
</body>
</html>

方法调用

父页面调用子页面方法:FrameName.window.childMethod();

子页面调用父页面方法:parent.window.parentMethod();

DOM元素访问

获取到页面的window.document对象后,即可访问DOM元素

注意事项:

要确保在iframe加载完成后再进行操作,如果iframe还未加载完成就开始调用里面的方法或变量,会产生错误。判断iframe是否加载完成有两种方法:

1. iframe上用onload事件

补充:

非ie浏览器都提供了onload事件。

var ifr = document.createElement(‘iframe‘);
ifr.src = ‘http://www.b.com/index.php‘;
ifr.onload = function() {
    alert(‘loaded‘);
};
document.body.appendChild(ifr);

  实际上IE提供了onload事件,但必须使用attachEvent进行绑定。

var ifr = document.createElement(‘iframe‘);
ifr.src = ‘http://b.a.com/b.php‘;
if (ifr.attachEvent) {
    ifr.attachEvent(‘onload‘,  function(){ alert(‘loaded‘); });
} else {
    ifr.onload  = function() { alert(‘loaded‘); };
}
document.body.appendChild(ifr);

2. 用document.readyState=="complete"来判断

五、跨域父子页面通信方法

如果iframe所链接的是外部页面,因为安全机制就不能使用同域名下的通信方式了。

1.父页面向子页面传递数据

实现的技巧是利用location对象的hash值,通过它传递通信数据。在父页面设置iframe的src后面多加个data字符串,然后在子页面中通过某种方式能即时的获取到这儿的data就可以了,例如:

1. 在子页面中通过setInterval方法设置定时器,监听location.href的变化即可获得上面的data信息

2. 然后子页面根据这个data信息进行相应的逻辑处理

2.子页面向父页面传递数据

实现技巧就是利用一个代理iframe,它嵌入到子页面中,并且和父页面必须保持是同域,然后通过它充分利用上面第一种通信方式的实现原理就把子页面的数据传递给代理iframe,然后由于代理的iframe和主页面是同域的,所以主页面就可以利用同域的方式获取到这些数据。使用 window.top或者window.parent.parent获取浏览器最顶层window对象的引用。

时间: 2024-10-05 21:01:57

JS之iframe的相关文章

jquery、js调用iframe父窗口与子窗口元素的方法整理

转载自:http://www.soso.io/article/17034.html 1. jquery 在iframe子页面获取父页面元素代码如下: $("#objid", parent.document) 2. jquery在父页面 获取iframe子页面的元素 代码如下: $("#objid",document.frames('iframename').document) 3.js 在iframe子页面获取父页面元素代码如下: indow.parent.docu

js处理iframe中子页面与父页面里面对象的取得的解决方案

[1]子页面取得父页面的dom对象 parent.window.$('#id').val(""); [2]父页面取得子页面的对象 $(window.frames["iframeName"].document).find('#subjectDg').datagrid('acceptChanges'); $('#iframeId').contents().find('#id'); //***** [3]父页面调用子页面方法:reload()为自己写的子页面js方法 $(

js 利用iframe和location.hash跨域解决办法,java图片上传回调JS函数跨域

奶奶的:折腾了我二天,终于解决了!网上有很多例子. 但跟我的都不太一样,费话不多说了,上图   上代码: IE ,firefix,chrome 测试通过 js :这个主页面,部分代码, function submitUpload(id){ $("#imgSrc" + id +"").attr("alt", "图片上传中--"); var imgID = id; if(id>0){ imgID = 1; } var for

js取iframe内容

js取iframe内容 IE下操作IFrame内容的代码: document.frames["MyIFrame"].document.getElementById("s").style.color="blue"; 但是这在Firefox下无效.所以,想到在Firefox下用FireBug来调试.经过调试发现在Firefox下可用以下代码来实现: document.getElementById("MyIFrame").conte

js对iframe内外(父子)页面进行操作

怎么对iframe进行操作,1.在iframe里面控制iframe外面的js代码.2.在父框架对子iframe进行操作. 获取iframe里的内容 主要的两个API就是contentWindow,和contentDocument iframe.contentWindow, 获取iframe的window对象 iframe.contentDocument, 获取iframe的document对象 这两个API只是DOM节点提供的方式(即getELement系列对象) var iframe = do

python+selenium十一:jQuery和js语法、js处理iframe

selenium 执行jQuery/js语法 driver.execute_script(jQuery/js) 1.jQuery jQuery只支持css语法: jquery = '$(CSS).val("XXX");' # 根据css语法定位到元素,输入内容jquery = '$(CSS).val('');' # 清空jquery = '$(CSS).click();' # 点击 2.js 1.通过id获取 document.getElementById("id"

JS 获取 iframe内元素,及iframe与html调用

两种获得iframe内元素的方法 jquery获取$("#atrDialogIframe_protocoliframe").contents().find('span').text() JS原生获取document.getElementById("atrDialogIframe_protocoliframe").contentWindow.document.getElementById("span") iframe调用上级窗口的JS window

js让iframe高度自动

HTML: <iframe id="yb_if" width="940px" src="连接" frameborder=0 allowfullscreen></iframe> JS: //自动同步iframe高度 function reinitIframe(){ var iframe = document.getElementById("yb_if"); try{ iframe.height = ifr

js 利用iframe和location.hash跨域解决的方法,java图片上传回调JS函数跨域

奶奶的:折腾了我二天,最终攻克了!网上有非常多样例. 但跟我的都不太一样,费话不多说了,上图   上代码: IE ,firefix,chrome 測试通过 js :这个主页面,部分代码, function submitUpload(id){ $("#imgSrc" + id +"").attr("alt", "图片上传中--"); var imgID = id; if(id>0){ imgID = 1; } var fo

JS操作iframe

1. 获得iframe的window对象 2. 获得iframe的document对象 3. iframe中获得父页面的window对象 4. 获得iframe在父页面中的html标签 5. iframe的onload事件 6. frames 参考文章 1. 获得iframe的window对象 存在跨域访问限制. chrome:iframeElement. contentWindow firefox: iframeElement.contentWindow ie6:iframeElement.c