js iframe 父子页面之间的通信做法
父页面 parent.html
function say() {
alert("parent.html------>I'm at parent.html");
}
function callChild()
{
//document.frames["myFrame"].window.say();//只适用于ie浏览器myFrame.window.say();
myFrame.window.document.getElementById("button").value="我变了"; }
onclick="callChild()">
子页面 child.html
function say()
{
alert("child.html--->I'm at child.html");
}
function callParent() {
parent.say();
parent.window.document.getElementsByName("myFrame")[0].style.height="100 px";
}
方法调用
如上面示例所示父页面调用子页面的方法可通过:
FrameName.window.childMethod();(这种方式兼容各种浏览器)
子页面调用父页面的方法:parent.window.parentMethod();
DOM元素访问
根据FrameName.window得到了子窗口对象之后,再访问其中的DOM元素就跟访问同一页面中的DOM元素没区别了都可以通过
document.getElementById(),document.getElementsByName()[index]。如:parent.window.document.getElementsByName("myFrame")[0],myFrame.window.do cument.getElementById("button")其中的window都是可以省略的。
注意事项
要确保在Iframe加载完成后再进行操作,如果Iframe还未加载完成就开始调用里面的方法或变量,无疑会产生错误。判断Iframe是否加载完毕有两种方法:
1.在Iframe上用onload事件;
2.用document.readyState=="complete"来判断
二、跨域父子页面通信方法
如果iframe所链接的是外部页面,因为安全机制则不能使用同域名下的通信方式了。在《SNS平台与第三方APP的JS通信实现》中提供易于且具有通用性的通信方式。父页面向子页面传递数据
实现的技巧就是利用 location 对象的 hash 值,通过它传递通信数据,我们只需要在父页面设置 iframe的 src 后面多加个#data 字符串(data就是你要传递的数据),然后在子页面中通过某种方式能即时的获取到这儿 data 就可以了,其实常用的一种方式就是:
1. 在子页面中通过 setInterval 方法设置定时器,监听 location.href 的变
化即可获得上面的 data 信息
2. 然后子页面就能根据这个 data 信息进行相应的逻辑处理。
子页面向父页面传递数据
实现的技巧就是利用一个代理 Iframe C,它嵌入到子页面中,并且和父页面必须保持是同域,然后我们通过它充分利用上面第一种通信方式的实现原理就能把子页面的数据传递给 iframeC,接下来的问题就是怎么让iframeC把数据传递给主页面A ,因为,iframeC 和主页面是同域的,所以它们之间传递数据就变得简单多了,属于同域名下的通信问题了,如前面所讨论的,在这里的可以使用一个经常使用的属性 window.top (也可以使用window.parent.parent),它返回对载入浏览器得最顶层 window 对象的引用,这样我们就能直接条用父页面中方法啦。
父窗口调用iframe子窗口方法
myFrame.window.functionName();
iframe子窗口调用父窗口方法
parent.functionName();
父窗口页面
function say() {
alert("parent.html------>I'm at parent.html");
}
function callChild()
{
//document.frames("myFrame").f1();
myFrame.window.say();
}
子窗口页面
function say()
{
alert("child.html--->I'm at child.html");
}
function callParent() {
parent.say();
}
IFrame问题汇总
取Iframe有两种方式:
1.ifr_id = document.getElementById("ifr"); //取到的是dom结果,主要用于操作property,改变Height,width之类的用这个
2.ifr_window = window.frames["ifr"]; //取到的是文档结果,可以取到文档的内容,如ifr_window.document.body.innerHTML
不同的对象用于不同的场合,注意不要弄混。
方法互调:
父调子:ifr_window.subMethod();
子调父:parent.topMethod();
注意用到的都是window.frames["ifr"]的方式取到的对象。
在Iframe加载完成后再进行操作
如果Iframe还未加载完成就开始调用里面的方法或变量,无疑会产生错误。判断Iframe是否加载完毕有两种方法:
1.在Iframe上用onload事件;
2.用document.readyState=="complete"来判断
跨域
并不是所有情况下父页面都可以操作子页面的。哪些情况下允许互相操作呢?
1.两个页面都是处于同一域名下,如https://www.360docs.net/doc/7b7656258.html,/;
2.两个页面处于同一父域名下,如https://www.360docs.net/doc/7b7656258.html,/和https://www.360docs.net/doc/7b7656258.html,,这种情况默认是不能互访的,但是通过设置document.domain来让其互访,下面会具体讲到。
如果父页面在https://www.360docs.net/doc/7b7656258.html,下,引用了一个https://www.360docs.net/doc/7b7656258.html,的Iframe,那么父页面的JS不能读取Iframe的结构,这个问题就是跨域。
为什么要禁止这个操作呢?如果可以随意操作的话,我在自己的站点上引用163的页面,然后读取Iframe的cookie,那么163用户cookie里记住的密码就被收集到了。
解决跨域的方法:
1.对于在同一父域名下的,如上面的第二种情况,通过设置document.domain=https://www.360docs.net/doc/7b7656258.html, 可让其实现互相访问;
2.对于不在同一父域名下的,但纯用JS是不能实现让其互访的,有一个变通的方法是类似ajax代理,即在https://www.360docs.net/doc/7b7656258.html,下新建一个页面,在server端其访问https://www.360docs.net/doc/7b7656258.html,下面的这个页面,将待访问的这个页面内容输出出来,然后再引用这个新建的页面,就变成在同一域名下了。
自适应高度
自适应高度平时用的较多,这里贴一段代码,兼容目前的各种浏览器
代码
function iFrameHeight() {
var ifm= document.getElementById("iframepage");
var subWeb = document.frames ?
document.frames["iframepage"].document : ifm.contentDocument;
if(ifm != null && subWeb != null) {
ifm.height = subWeb.body.scrollHeight;
}
}
用Js脚本实现页面跳转
1. Javascript 返回上一页 history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forward()返回下一页 4. window.history.go(返回第几页,也可以使用访问过的URL) 例: 向上一页 response.Write("") response.Write("") 向上一页 页面跳转:onclick="window.location.href='list.aspx'" P.S. 小技巧(JS引用JS): Javascript刷新页面的几种方法: 1 history.go(0) 2 location.reload() 3 location=location 4 location.assign(location) 5 document.execCommand('Refresh') 6 window.navigate(location) 7 location.replace(location) 8 document.URL=location.href 自动刷新页面的方法: 1.页面自动刷新:把如下代码加入
区域中 其中20指每隔20秒刷新一次页面.JS关闭窗口弹出新窗口,关闭新窗口时,刷新父窗口,JS代码实现刷新网页,js实现弹出窗口代码收集集萃
经常上网的朋友可能到过这样一些网站,一进入首页立刻会弹出一个窗口,或者按一个链接或按钮弹出,通常在这个窗口里会显示一些注意事项、版权信息、警告、欢迎光顾之类的话或者作者想要特别提示的信息。其实制作这样的页面非常容易,只要往该页面的HTML里加入几段javascript代码即可实现。下面我就带你剖析它的奥秘。 【最基本的弹出窗口代码】 其实代码非常简单: 因为这是一段javascript代码,所以它们应该放在之间。是对一些版本低的浏览器起作用,在这些老浏览器中如果不支持javascript,不会将标签中的代码作为文本显示出来。 Window.open ('page.html')用于控制弹出新的窗口page.html,如果page.html不与主窗口在同一路径下,前面应写明路径,绝对路径(http://)和相对路径(../)均可。 用单引号和双引号都可以,只是不要混用。 这一段代码可以加入HTML的任意位置,加入到
和之间也可以,位置越靠前执行越早,尤其是页面代码较长时,又想使页面早点弹出就尽量往前放。 【经过设置后的弹出窗口】 下面再说一说弹出窗口外观的设置。只要再往上面的代码中加一点东西就可以了。 我们来定制这个弹出窗口的外观、尺寸大小、弹出位置以适应该页面的具体情况。