iframe使用记录

iframe确实不好用,尤其IE的支持更是非常的不好。
以下记录几点关于iframe使用过程中认识到的点。

1.关于浏览器缓存

浏览器缓存分为两种,from disk cache 和from memory cache,浏览器加载页面的时候,对于资源的请求,会先从memory cache中取,找不到的话,就往disk cache里找,再找不到,最后会请求网络重新获取。
网上看到有人说,js和静态资源会存到disk cache,css会存在memory cache中,但实际上,我发现这和不同浏览器自身有关系,拿谷歌浏览器来说,会把大文件放到disk cache中。
还有一个问题就是,如果js比较大,例如3M多,即便从disk cache中取,页面加载也很慢。
浏览器缓存是浏览器级别的,和域名、标签没有关系,即:不管是不是在一个标签页中,不管几个iframe,只要他们请求的资源相同且浏览器缓存中,就会直接从缓存中取,即:对于同一个资源,不管是那个页面(iframe)先请求,并缓存到浏览器中,其他的页面都会使用缓存。

2.IE中使用iframe不加载页面

经过测试发现在IE11中,如果事先指定iframe的src,会出现加载失败的情况。解决办法是等父页面onload之后,再手工指定iframe的src。我尝试了下,确实可行。

3.iframe白屏问题

iframe在加载页面的时候,会有白屏闪现,最开始以为是页面背景色问题,有的说是设置iframe透明,但是这些都无法解决问题,造成这个问题的原因在于iframe自身,即:在iframe发起src的请求到返回的间隙这段时间,他就是会白屏,只不过有些非常快,根本察觉不到。针对这个问题,解决方案也是建议在父页面onload完成之后,再动态指定src。

4.vue中onload

基于vue-cli构建的web应用,本身是单页应用,这就意味着,当index.html首次正确加载后,window.onload事件已经加载完毕了,不存在在组件中再去动态绑定onload事件,没意义。

5.操作iframe

项目中有这样一个需求,在iframe里加载了一个页面,这个页面默认是全屏显示的,如果在iframe中点击ESC,会退出全屏,要求在父页面中给iframe监控键盘事件,并屏蔽掉ESC案件的功能。
通过JS屏蔽键盘事件,在晚上有很多的样例代码,给document.onkeydown指定一个函数,获取window.event.keyCode==27时,return false即可。例如:

document.onkeydown = killesc; 
function   killesc() 
{   
	if(window.event.keyCode==27)   
	{   
		window.event.keyCode=0;   
		window.event.returnValue=false;   
	}   
} 

但,问题是iframe其实是独立的线程,和父页面是隔离的,你不可能把这些代码写到iframe的页面中。
那么我们是否可以通过获取iframe的document,为其绑定onkeydown事件呢?
答案是可以的。相关操作如下

var iframe=document.getElementById(“xxx”);//父窗口获取iframe子窗口对象
var iframew=iframe.contentWindow;//iframe窗口的window对象
var iframed=iframew.document;//iframe窗口的document对象
var iframed2=iframe.contentDocument;//DOM2也支持直接获取document对象

通过上述代码,可以获取到iframe的document和window对象,然后就可以尽情的操作了。
问题是,按照上述方式,发现还是不行,会提示有跨域问题。
原因在于,我的iframe中引入的src是外链,和父页面不是同一个域。
非同域的页面之间是不能获取window对象和document的。

结论:
iframe和父页面是同域情况下,可以在父页面任意操作iframe。
不同域情况下,两者完全隔离,不允许父页面操作子iframe的页面。
PS:想想这样设计也完全合乎情理,不然,我随意写个页面,把别人的网页加载进来,然后随意的修改和调整,那岂不乱套?

暂时先记录这些!

Safari浏览器并不会在其历史记录中保存iframe内嵌框架的浏览历史。这意味着,当在iframe内加载不同的页面时,Safari浏览器的历史记录不会记录这些页面的访问记录。因此,无法通过浏览器的前进和后退按钮来访问iframe内加载的不同页面。 然而,如果您想要在使用iframe时实现保持历史记录的功能,可以考虑使用其他解决方案。一个可能的解决方案是使用隐藏框架或隐藏内嵌框架来实现客户端/服务器之间的通信。这种方法涉及到使用两个框架页,其中一个框架页必须是隐藏的,另一个框架页则必须是可见的。通过在可见框架页中加载不同的页面,并在隐藏框架页中保存历史记录,可以实现在iframe内保持历史记录的效果。 另外,可以使用window.onpopstate事件来监听浏览器的前进和后退操作。当用户点击浏览器的前进或后退按钮时,该事件将被触发,并且可以通过检查history.state中的信息来获取先前保存的历史记录。这种方法可以在不使用iframe的情况下实现保持历史记录的功能。 综上所述,Safari浏览器不会在其历史记录中保存iframe内嵌框架的浏览历史。但是,可以通过使用隐藏框架或隐藏内嵌框架以及监听window.onpopstate事件等方法来实现在iframe内保持历史记录的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [iframe创建智能表单](https://blog.csdn.net/weixin_39624389/article/details/117880470)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [关于ajax后退页面及历史记录的问题?](https://blog.csdn.net/weixin_36482976/article/details/119475896)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值