首先我碰到的情况咧,比较二;在用户登录首页面后加载首页body页面;body呢包含了N个iframe,其中有一个iframe是加载后预先隐藏的,此iframe的显示触发条件是在本body主页面,点击另一个iframe上的数据才显示;
<iframe id="projectAndPlanFrame" style="display: none" border="0" vspace="0" hspace="0" marginwidth="0" marginheight="0" framespacing="0" frameborder="0" scrolling="no" width="100%" height="" src="">
</iframe>
问题在于我点击body页面的触发条件,该id=projectAndPlanFrame的隐藏iframe确实是出来了,但是只出现了一半;
oh,忘了介绍了,至于上面的iframe的src链接地址怎么是空的了。
刚说了我点击另一个iframe才能触发这个隐藏的iframe,另一个iframe在主页面body加载时候跟着加载,它是一个由XML+swf文件生成的flash,因为要用到该flash的一些参数数据才能让俩个iframe匹配上,所以我在body页面写了js
function taskClick(projectID,planID,planTYPE){
var plan = document.getElementById('projectAndPlanFrame');
plan.style.display = "block";
plan.src = "<%=request.getContextPath()%>/HomePageAction.do?cmd=queryGttDetial&planid="+planID+"&proid="+projectID+"&protype="+planTYPE;
document.location.href = "#projectAndPlanFrame";//页面定位
}
看到吗,projectID,俩个iframe公用一个项目ID,所以由taskCllick方法给隐藏掉的那个iframe赋上链接地址;
注意,这里的taskClick在哪用的呢,它是在生成XML文件时候调用的,不是在body页面调用;
Element processes = root.addElement("processes");
Element process = processes.addElement("process");
//传递参数项目id,计划id,计划类型
process.addAttribute("link", "javascript:taskClick('"+vo.getProject_id()+"','"+vo.getId()+"','"+vo.getPlan_type()+"')");
好了,到这里终于把具体问题背景发生的情况说完了;接下来就是解决怎么让隐藏掉的iframe自适应body页面的高度
网上找了一些资料大部分的解释情况如下:
//var iframe = document.getElementById("projectAndPlanFrame");
//iframe.height = iframe.contentWindow.document.documentElement.scrollHeight;
试了不行,后来猜测是不是js不能跨域所以从body主页面并不能这样给iframe控制高度;不知道大伙怎么搞的,反正我是alert出来的高度是0;
看到taskClick中plan.src链接的地址了吧,就在那个页面加上如下代码
$(window.parent.document).find("#projectAndPlanFrame").load(function(){//绑定事件
var main = $(window.parent.document).find("#projectAndPlanFrame");//找到iframe对象
var thisheight = $(document).height();//获取页面高度
main.height(thisheight);});
从body父页面我取不到子iframe的高度,我从子页面整还不行吗,现在高度是自适应了,可另一个问题又来了,页面定位;
看到//页面定位 的那行了啊,本来是可以直接定位到要展示的iframe的位置的,但是由于从iframe页面内部计算了高度,不知道什么原因body页面定位不到该iframe,只能让它出现一半,但是呢第二次在重新触发已经显示的隐藏iframe时,它倒是定位准到了;纠结中。。。
------------------------------------------------------------------------------
解决办法:
首先分析一下,我们的这俩个iframe都是预加载的,只是一个是直接数据显示,另一个没有指定链接地址所以是空的iframe,并且是隐藏状态,只有点击触发条件时才会重新填充内容;而现在当我点击触发条件时,隐藏iframe内部计算该高度并赋给它,所以完成了页面的iframe自适应高度。但是由于第一次登陆进入body时候,隐藏的iframe并不占用body页面的高度,而定位代码是在body页面的js中,也就是触发显示隐藏iframe的js中,所以它会找不到该iframe显示后的位置,所以定位不准;
既然它是没有位置,所以才不能定位的,那咱就给他个位置,在iframe上套个div同样隐藏状态,并且给div一个大高度,反正隐藏的不影响页面,等触发iframe时,由该iframe内部计算的高度会覆盖掉这个1000px的,所以这里他的作用主要就是为了定位而占位置;
<div id="div_projectAndPlanFrame" style="height:1000px; display: none" >
<iframe id="projectAndPlanFrame" style="display: none" border="0" vspace="0" hspace="0" marginwidth="0" marginheight="0" framespacing="0" frameborder="0" scrolling="no" width="100%" src="">
</iframe>
</div>
触发条件js,
function taskClick(projectID,planID,planTYPE){
var div_plan = document.getElementById("div_projectAndPlanFrame"); div_plan.style.display="block";//显示隐藏的div var plan = document.getElementById('projectAndPlanFrame');
plan.style.display = "block";//显示隐藏的iframe plan.src = "<%=request.getContextPath()%>/HomePageAction.do?cmd=queryGttDetial&planid="+planID+"&proid="+projectID+"&protype="+planTYPE;
document.location.href = "#projectAndPlanFrame";//页面定位
}
iframe页面内部计算高度,并同时赋给iframe和div
$(window.parent.document).find("#projectAndPlanFrame").load(function(){//绑定事件
var main = $(window.parent.document).find("#projectAndPlanFrame");//找到iframe对象
var main_div = $(window.parent.document).find("#div_projectAndPlanFrame");//找到div对象
main.height("auto");//重新赋给父页面高度为auto,此句可有可无,为了不致使一些莫名因素导致页面错乱,最好还是带着吧 var thisheight = $(document).height();//获取页面高度
main.height(thisheight);//给iframe高度
main_div.height(thisheight);//给div高度
});
我去丫的,终于搞定!