项目又报错了。有时候觉得自己真是经验不足。
记录下吧:
在动态删除iframe时,同时把iframe里嵌套的iframe 删除,遇到了这个问题。
本来之前都没报错,突然昨天他们嵌套了一个 跨域 的网页,导致程序报错了。
var ii = eqdiv.children("iframe").contents().find("iframe");
var ilen = ii.length;
for(var m = 0 ; m < ilen ; m++){
ii[m].contentWindow.location.replace("about:blank");
ii.eq(m).remove();
}
所以我给代码加了一段 try catch :
try{
var ii = eqdiv.children("iframe").contents().find("iframe");
var ilen = ii.length;
for(var m = 0 ; m < ilen ; m++){
ii[m].contentWindow.location.replace("about:blank");
ii.eq(m).remove();
}
}catch(err){ };
得提醒大家的是:contents()方法在iframe中使用时,涉及到跨域问题,请注意下。
今天做项目时,有一个这样的需求,需要动态删除的Tab,比如:可以删除某一个,可以删除多个。
每一个Tab对应一个iframe。
本来我的代码是这么写的:
//…前面代码省略
eqdiv.children("iframe")[0].contentWindow.location.replace("about:blank");
eqdiv.remove();
//…后面代码省略
上面的代码可以实现删除。但我突然奇思妙想,给remove()来个setTimeout吧,自己的内心总觉得延迟个50毫秒执行好些,于是把代码改为:
//…前面代码省略
setTimeout(function(){
eqdiv.children("iframe")[0].contentWindow.location.replace("about:blank");
eqdiv.remove();
},50);
//…后面代码省略
改了后,当时也没仔细测试,后来终于被测试员找出问题,夜晚2点被叫到公司找bug。。。
于是我慢慢找bug,发现有如下情况:
在单独关闭一个Tab时,没有问题。
在同时关闭多个Tab时,问题来了。于是我对删除Tab的代码进行了一句句调试,终于找出问题所在。
最终代码还是之前的:
//…前面代码省略
eqdiv.children("iframe")[0].contentWindow.location.replace("about:blank");
eqdiv.remove();
//…后面代码省略
之后仔细一想,的确setTimeout在做循环删除时,会有问题。
举个很简单的例子:
var a = $("#t");
$("<p>1</p>").appendTo(a);
setTimeout(function(){
$("<p>2</p>").appendTo(a);
},500);
$("<p>3</p>").appendTo(a);
运行结果肯定是: 1 , 3 , 2
但我脑子里 当时 怎么就忘记setTimeout() 的这个特性了呢 , 循环时真的要注意啊 。
经过这次项目才发现了这个问题。一些后台程序员装的系统各式各样,有精简版的,有完美版的。
看似跟前端开发没关系,实际上却埋下祸根。
程序员A:一个文本框,没有设置任何样式,既然显示成没有内嵌边框的样式。好像浏览器默认就是border 1px 。
程序员B:一个脚本在我机子上运行非常快,然后在他机子上异常慢,而且时不时报错。
话说回来,我最厌恶程序员给系统装 皮肤。鼠标形状都变形了,还真不习惯。
请爱护你的浏览器,不要乱装皮肤,乱装插件。也不要装精简版,绿化版,完美版。
项目中遇到一个棘手问题,简化了一下。
请看下面的Demo:
http://www.cssrain.cn/demo/diviframebug/home.html
当外面有滚动条时,点击iframe里的链接#号,会导致外面滚动条滚动。按理来说,iframe里的链接应该不会对外面的滚动条有影响啊。 想不明白? 不知道哪位网友遇到过类似问题,,能给与解答。
IE下有这个问题, firefox没有。