iframe通信

同域

window.top返回顶层窗口,即浏览器窗口

父>子



//子页面

子>父

//在父页面


//在子页面

非跨域 父页面获取子页面元素操作

//原生js 获取子页面window对象

iframe不存在name和Id

1, var childWindow=document.getElementById("f").contentWindow;
var _div = childWindow.document.getElementById("ObjId")//iframe中的dom元素
2, var childWindow=document.getElementsByTagName('iframe')[0].contentWindow;
var ifm_document = childWindow.contentWindow.document;//iframe中的文档内容 document对象
var ifm_document = childWindow.contentWindow//window对象

iframe中有id或者name

document.frames['iframe-name'].document//iframe document对象

//其实也就是普通的获取方法,只是后面多了一个contentWindow;
//jquery
var childWindow=$('#f').contentWindow;

//获取子页面的document对象 (假设已经通过上面的方法得到了window对象)
var frameDoc=childWindow.document;
var frameBody=frameDoc.body;
//jquery 也是跟上面的一样
var frameDoc=$(childWindow.document);

//原生获取元素
childWindow.document.getElementById('a') //上面都已经拿到了子页面的window对象,所以获取子页面的元素也就只需要想普通操作那样获取就好
childWindow.document.getElementById('a').style.color='red' //改个颜色

//jq拿子页面元素
('#f').contents 这相当于拿到了iframe 里面所有的dom;

非跨域 子页面获取父页面元素

//原生js
window.parent.document.getElementById('a'); //window.parent获取到父页面的window对象,那么接可以使用一般操作获取元素
window.parent.document.getElementById('a').style.color="red";//dom操作
//jquery
(父页面元素选择器, parent.document);
(window.parent.document).find("#obgId")

postMessage

子传父

window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。
postMessage;
otherWindow.postMessage(message, targetOrigin, [transfer]);
//otherWindow 窗口对象
// message 传递的消息,可以是对象,可以是字符串
// target 目标窗口,* 代表所有;

//子页面

登录窗口

//父页面



//子页面

//父页面

父传子

//父页面


//子页面

//父页面

//子页面

//接受子数据
//父页面
window.addEventListener('message',function(event){
if(!event.data.param) return;
passParams = utils.getParamsFromGm(event.data.param)
console.log("passParams", passParams)
if ( passParams) {

        }
    })

//子页面
window.parent.postMessage('close','*');

document.frames('reportFrame').document 不是很了解,有两个document,其中document.frames('reportFrame')指的是你当前文档中一个name属性为'reportFrame'的frame的window对象(不是DOM对象),然后接一个".document"就取得了DOM对象,这个DOM对象就是你要查找frame中ID为reportFrameForm的DOM对象的context

$("#reportFrameForm",document.frames('reportFrame').document)
先解释document.frames('reportFrame').document 这句是原生态的javascript意思是.获取当前文档(document)里框架集(frames)里id/name为reportFrame的文档(最后的那个document)

jQuery语法:(选择器)这样,指从当前文档查询.如果指定了[待查文档]就从指定的待查文档里查询选择器.

$("#reportFrameForm" 的意思就是"找到id为reportFrameForm的DOM元素

$("#reportFrameForm",document.frames('reportFrame').document) 整句的意思就是:
从当前页面的名字为reportFrame的框架页面里找到id为reportFrameForm的元素.


大致可以猜出这句是操作嵌入页里的一个叫reportFrameForm的表单

document.frames()与document.frames[]的区别






其中:
document.frames(“ifr_1”)可以得到一个window对象
document.frames[“ifr_1”]可以得到一个Html Element DOM对象

你可能感兴趣的:(iframe通信)