二分之一

Just Jason's Blog

记录一下IE6下的两个小坑(form post target iframe、void)及解决办法

一、IE6下使用form post target iframe进行POST跨域请求,如果设置了document.domain,POST请求发送不出去。

另外iframe的name属性要一次性写入,不能通过dom的方式修改,修改无效。

www.2fz1.com/a.html

<script type="text/javascript">
document.domain = "2fz1.com"
</script>
<iframe name="commentpost" id="commentpost"></iframe>
<form action="http://data.2fz1.com/data.php" method="post" target="commentpost">
    <textarea name="detail"></textarea>
    <input type="submit" class="publish_btn" value="提交">
</form>

原因分析:

1、IE6下,因为在父页面或在iframe页面中,只要设置了document.domain,无论是和当前域名相同还是根域名,均视为跨域。而我们使用form post到iframe时,IE6当作跨域给“拒绝访问”了。有人可能会说,可以给子页面设置document.domain,但是我们的子页面是变动的服务器程序,iframe的src如果是定死的就可以解决。

2、大概定位一下:IE6升级到IE7后默认禁用了“跨域浏览子框架”,但是IE7下不会禁用这种,但是把IE7卸载后回到ie6这个设置没改回原来默认的启用,导致ie6不允许form.target指向一个空的iframe。IETester下的IE6,也有同样的原因。

解决办法:

<iframe src="javascript:document.domain='xxx.ooo';void 0;"></iframe>

二、javascript:;和javascript:void(0);

void 运算符对任何值返回 undefined。该运算符通常用于避免输出不应该输出的值。目的是为了终止默认事件。

在下IE6下,给一个a添加javascript:void(0);或javascript:; 然后监听该元素,去做一个JSONP操作,该JSONP是无法成功执行的,请求会被abort掉,如下代码:

<a href="javascript:void(0);" id="btn">button</a>
$(function(){
    $("#btn").click(function(event){
        $.getJSON('test.php',function(data){
            alert(data);
        });                     
    });
});

原因:javascript:void(0)本意是终止默认事件,但是在IE6下,其它外部请求也会被终止掉,但是ajax异步请求不受影响。

解决办法:有jsonp操作的,不要使用javascript:void(0);使用href=”#”替换,然后使用event的方法来终止事件或return false;

TIPS:href=”###”也可以终止页面锚点的查找(即页面不滚动),但依然会影响URL的美观。

最后修改时间:2014年9月10日星期三晚上7点54