`

iframe诡异的内容消失问题

 
阅读更多

iframe诡异的内容消失问题

 

 

问题描述

  不得不承认,这是一个非常诡异的问题,以下步骤可以重现问题:

  1. 用IE打开这个测试页面,确认页面上有个iframe,里面显示着abc三个字符。
  2. 把这页面加进收藏夹。
  3. 重新打开IE。
  4. 从收藏夹再打开这页面 。

  如果没出问题的话,你会发现页面上虽然还有iframe,但是abc消失了。更准确、详细地说,前后2次的页面主要有以下区别:

  • 从视觉上来说,页面中的abc字符消失了。
  • 从DOM结构上看,iframe中的body元素内没有任何内容。
  • 从iframe的右键-属性上看,第一次页面上iframe的地址是父页面的URL,第二次则变成了about:blank。

  以下是这个页面的源码,是从遇上问题的页面中不断分离、简化,最后形成的一个最简的重现方案:

!DOCTYPE html
html
head
meta charset="utf-8"/
titletest/title
/head
body
script type="text/javascript"
var text ='abc',
script
='var d = document; '+
'd.open(\'text/html\', \'replace\'); d.write(parent.text); d.close();',
html ='iframe id="abc" name="abc" '+
'src="javascript:void((function() {'+ script +'})())"/iframe';
document.write(html);
/script
/body
/html

  解决方案

  首先,这个页面虽然简单,但其中用到了几个很恶心人的东西:

  • document.write。
  • javascript:伪协议。

  如果有办法避免使用这两者的话,就可以忽略这个问题。但是如果必须使用javascript:伪协议来向iframe中输出内容的话,将以上代码改为如下形式可以解决问题:

var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
//插入到需要的位置
iframe.contentWindow.location ='javascript:void((function() {'+ script +'})())';

  具体的区别是,从直接使用document.write来输出iframe,变为了使用createElement创建iframe,随后使用iframe的location来采用javascript:伪协议输出具体内容。

  起因

  由于原本这段代码不是我写的,所以在发现这个问题的时候,我也有过疑问,为啥要这么写呢?难道下面的方式不是更好吗:

var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
//插入到需要的位置
iframe.contentWindow.document.write('abc');

  然而这一段代码的注释中写是IE在修改了document.domain进行提权后,iframe会出现跨域问题。所以以下代码,其中在IE中是会报错(拒绝访问)的:

//假设当前域是www.tt.com
document.domain ='tt.com'; //domain提权
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
//插入到需要的位置
iframe.contentWindow.document.write('abc');

  至于解决的办法,就是在iframe的src中,使用javascript:伪协议输出内容,当然输出的时候要注意,在iframe的document执行open以后,加上一句代码,把iframe的docuemnt.domain也进行提权,提升到和父页面相同,这样iframe和父页面就是同域的,可以进行交互了。

  正是因为IE存在着这样的问题,为了解决这个问题,原有代码中使用了document.write输出带src属性的iframe元素,从而引发了另一个问题……

  猜测

  那么这个问题是因为什么原因引起的呢?首先对页面的执行过程进行分析,大致是这么几步:

  1. 解析script标签,执行内容。
  2. document.write向文档流中输出一个iframe元素。
  3. iframe中,使用document.write输出文字。

  从页面的视觉效果而言,iframe是存在的,但iframe里面的内容消失了。这让人很自然地联想到,第2步已经执行了,但由于浏览器缓存iframe的内容等原因,第3步并没有执行。

  为了测试这个情况,比较简单的方法就是在iframe的src里的javascript代码中添加一个断点,我的选择是在d.close()这一句之前,加上了一行代码:alert(d.body.innerHTML);

  经过以上的修改,执行的结果是,成功地出现了alert对话框,并且innerHTML确实存在abc字符,另外更奇怪的是,经过alert,abc出现在了iframe中。

  也就是说,第3步是确实地执行了,但是在没有alert的情况下,却没有在界面上产生任何效果。综合以上的原因,联想到alert函数的一个作用是将浏览器的UI Update队列进行flush操作,因此对于完全黑盒的IE浏览器,现阶段只能猜测,在这种特殊的使用方式之下,IE丢失了UI Update队列中的部分更新,导致iframe的document并没有得到更新,因此也保留了about:blank这种地址。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    layer弹出层 iframe层去掉滚动条的实例代码

    如下所示: function newcont(url) { var index = layer.open({ ...以上这篇layer弹出层 iframe层去掉滚动条的实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。

    ProductDetails.cshtml

    加载iframe内容出来之前显示进度条,加载完成后让进度条消失

    Hide To Print-crx插件

    ===========================版本1.2.5-窗口iframe内容的扩展扩展脚本版本1.2.1-现在可以刷新带有此扩展名的Web页面直接在上下文菜单中发布1.2.0版,只需在上下文菜单中单击所有这些项都将消失:1)图像2)徽标2)...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正了使用IFrameUrl的Tab在切换过程中会重复加载的问题,这是一个在v2.1.6引入的问题(feedback:eroach)。 -修正了启用AutoPostBack的Grid,其RowClick会覆盖LinkButtonField, HyperLinkField, CheckBoxField的...

    KODExplorer 芒果云-资源管理器

    - iframe 打开url 优化。解决canvas问题 - 文件编辑器,载入loading去掉 - 删除错误时,或上传错误时也刷新目录。删除提示颜色错误 - 对话框右键 点击右键菜单隐藏修复 - 手机端 touch =双击 - 文件列表 ...

    ExtAspNet_v2.3.2_dll

    -修正了使用IFrameUrl的Tab在切换过程中会重复加载的问题,这是一个在v2.1.6引入的问题(feedback:eroach)。 -修正了启用AutoPostBack的Grid,其RowClick会覆盖LinkButtonField, HyperLinkField, CheckBoxField的...

    FineUI(ASP.NET UI控件) v4.1.2

    -修正更新未打开选项卡IFrame地址出错的问题(xxdddail-6107)。 -修正选项卡非激活ContentPanel面板内容在外部显示的问题(张海-6011)。 -修正页面上只有一个input[type=text]时,回车键会默认提交表单的问题(隨...

    清理页面「Clean Page」-crx插件

    只需单击一下,所有这些内容都将消失:1)图像2)徽标2)背景3)视频4)iframe 5)多媒体/ Flash对象该扩展程序目前处于beta阶段。 如果您有任何问题,请使用支持电子邮件发送反馈。 支持语言:English,‫العرب...

    《程序天下:JavaScript实例自学手册》光盘源码

    5.10 只打印iframe的内容 第6章 下拉列表特效 6.1 下拉框实现多选 6.2 实现两个select的同步 6.3 被选中的列表项下次不能再选 6.4 不带滚动条的select 6.5 从一个下拉列表往另一个下拉列表添加内容 6.6 改变列表项的...

    程序天下:JavaScript实例自学手册

    5.10 只打印iframe的内容 第6章 下拉列表特效 6.1 下拉框实现多选 6.2 实现两个select的同步 6.3 被选中的列表项下次不能再选 6.4 不带滚动条的select 6.5 从一个下拉列表往另一个下拉列表添加内容 6.6 改变列表项的...

    资源检查-crx插件

    1. 访问需要检查资源的页面(如需要检查异步加载的内容, 请先让这些内容加载完成再做检查) 2. 点击图标即开始检查, 不必等待检查完毕, 可继续进行其他操作, 但不要刷新或关闭当前页面 3. 检查完毕会显示统计结果, 并...

    DotNetTextBox所见即所得编辑器控件 v3.3.1

    5) 修正预览状态下提交内容后图片消失的BUG。 6) 插入表情图标功能由原来的弹出式窗口改为DIV窗口,更加美观实用。 7) 计算器功能由原来的弹出式窗口改为DIV窗口,更加美观实用。 8) 右键菜单增加创建和...

    网际畅游 MyIE 3.0 源代码

    你也可以将某个Frame或IFrame的URL加入窗口过滤器,这个Frame或IFrame以后就不会下载了。 使用*过滤窗口:在过滤广告窗口时可以在URL中使用*来过滤一批相似的地址。但你可不要用*把所有的窗口都过滤掉哦! ...

    搜索引擎优化魔法书

    目录 关于这本书.............................................................................................................................................1 第一章 搜索引擎基础..........................

Global site tag (gtag.js) - Google Analytics