最近做的一块功能,需要在页面A中,用iframe嵌入一个页面B。本来嘛,这是件easy到吃生菜都没那么容易的事。问题在于:iframe的这个页面B,也继续嵌入了另一个页面C。其实呢,这还是个正常得不能再正常的事。然后呢, 那个呢,在B页面iframe C页面的时候,就产生了一个历史记录了。表现就是,原来不能点击的后退按钮变得可点击了。是不是有点乱,看看下面的示意图:

由于这个页面是个Web App,同时要保证浏览器的前进/后退/刷新按钮可用。无端端的多出个没意义历史记录,而且这种历史记录,点击后退时是不会有hashchange和popstate事件触发的,兼容起来是相当的狠蛋疼~.~。
more
为了生活的更美好,为了晚上可以早点回家把妹子,这个臭虫必须杀了!

首先看看页面结构(页面B):

<!-- 省略掉那些打酱油的代码 -->
<iframe src="about:blank"></iframe>

页面加载完成之后,就根据情况改变iframe的src为具体的url(例如页面C)。因此可以猜测,是src由“about:blank”变成页面C导致的历史记录变动。

于是把页面上的iframe的src设置为空字符串“”再测,结果还是增加了历史。又尝试着干脆页面不要这个src属性,结果还是一样。

啊啊啊~~~某人要疯掉了。

然后崩溃之际发现了一件奇怪的事:页面B是用了个跨域代理文件的(跨子域通信用的,具体就不在这细说了),也是用iframe嵌入,为何它没引起历史记录的增加?

迅速的查了下源代码,哦~~原来是这样紫。原来啊,代理页的嵌入是动态创建了个iframe,给src赋值之后再append到body的,结果就是页面嵌入之后,历史记录没有任何变化!

真是蓦然回首,那人却在灯火阑珊处啊~~迅速把iframe页面的代码改成下面的样子:

var loadPage = function(url){
    var iframe = document.createElement('iframe');
    iframe.src = url;
    document.body.appendChild(iframe);
}

嗯,测试……

嗯,一切正常。哇哈哈哈,妹子,我来啦 ~^.^~

Comments
Write a Comment

Tags

css3   魅力CSS   nodejs   loading   CSS   疯狂的菊花   html5   animation   compiler   编译脚本   png   WordPress   智能   旅行   优化   模板   历史记录   跨域   manifest   frame   canvas   动画   js   离线应用   codelet   transform   抽取   java   兼容问题   发布脚本   富文本   那一年在他乡   htaccess   iframe   帧动画   加载速度   intelligent   跨浏览器   DNS解析   插件   checkbox   单边   step-start   vary   复选框   自动更新   转换   文本溢出   盒子阴影   menu   blob   西安   滑动背景   box-shadow   内存占用   键盘事件   python   auto   text overflow   background   所见所得   android   rotate   字节数   合并   文本框   slide   字符串连接符   协议   伪类   兄弟选择符   网格   节点位置比较   空白   斜线拼接   自定义命令   溢出   clock   素描   无法更新   分隔符   字符编码   body   下载文件   精灵图   step   nodej   ubuntu   apache   css3选择器   创建文件   多级菜单   编辑状态   ajax   阴影   垂直   chrome   管道   时钟   firefox   背景   文件上传   createobjecturl   游记   下载   放射渐变   版本号   宽高   照片   localStorage   渐变背景   图片   图片拼接   属性值检测   自动生成   计算   返回键   oauth   合图   reset   调用   cavnas   漏洞   按钮   margin   线性渐变   xsrf   被黑   tab   checked   修复   border   消失   step-end   sprite   common-upload   菜单   兄弟选择器   字符串   svn   九寨沟   缩进   css遮罩   svg   添加系统服务   gzip   插入代码   动态   加速   模拟