环境:websphere 7
一个流程主页,里面include了上面这个页面,内部有一个iframe;
现象:项目发布在测试环境中,打开流程主页时,里面iframe内页显示不出来;
同样的jsp页面,在生产环境时,页面显示正常;
同样的jsp页面,在本地环境websphere7时,页面显示正常
测试环境中调试记录:
上图js方法是设置iframe高度的,在var subweb下方紧接着通过alert取subweb.body.scrollheight或者
Subweb.documentElement.scrollHeight都为0,所以设置iframe高度为0导致显示不出来;
调试1:
删除ie页面缓存,再次请求,发现可以显示iframe,但是再次请求,iframe还是显示不出来高度为0;判断是缓存问题导致。
调试2:
在线修改项目中iframe里面的jsp,保存;第一次请求页面,可以正常显示,后面再次请求,iframe又不能显示了。
调试3:
查资料改websphere里面的相关xml,删除temp,修改测试环境pc的时间,无效。
调试4:
Iframe内页jsp添加dtd申明,外框页对body.scrollheight先alert,再对documentElement.scrollHeight alert,发现,body为0,documentElement有值;
Ps:正常情况下,iframe内页不加dtd申明时,body高度有值,documentElement高度为0;Iframe内页添加dtd申明时,documentElemnt高度有值;
调试4的后期总结是,对body的高度alert的 时候,阻塞页面,页面有足够的时间加载异步加载的iframe内页,所以body的alert人工点击确定后,此时可以取到已加载完成的iframe内页高度;
但把2个alert都去掉的时候,iframe不显示,此时没有取到内页iframe的加载后实际高度,取的是没加载完成的高度0;(要么是0,要么是实际高度,不会是中间的只加载一部分的高度)
调试5:
根据调试4,判断是外页onload执行设置iframe高度的时候,内页没有加载完成,所以此时没有取到内页的实际高度,取的是0;
解决方法是给这个js方法设置一个延迟,setTimeout,问题解决,页面可以正常显示,但是这种方法并不完美,如果内页数据量很大或者因为某种原因导致内页加载很慢的时候,比如说内页要加载5s,而你外页这个js设置的延迟是3s,那么3s到的时候执行设置iframe高度,此时取的高度不是内页实际高度;
调试6:
准备在iframe内页的body的window.onload事件上,再写一个js方法,当内页onload完成时,从内页设置外页iframe的高度,这样可以保存设置iframe时取的是内页实际高度,此方法准备做未做,但是还是想从根本上解决,一样的代码,为什么所有环境都行,就测试环境这个不行?
调试7:
发现测试环境打开了启用servlet高速缓存,而生产环境和本地发布的环境都没有启用这一项,与一开始判断的缓存问题一致,然后在测试机上不要启用高速缓存,重启项目,不修改代码,问题解决。