iframe 跨域提交的问题

在a.domain.com下a.html

  
<html>
<head>
</head>
<body>
<div id="p"></div>
</body>
</html>

然后用js动态生成p.innerHTML = '<iframe width="400" height="400" marginWidth=0 marginHeight=0 frameBorder=0 width="100%" scrolling="no" allowTransparency="true" src="b.domain.com/b.html"></iframe>'

b.html
<form id="form1" name="form1" target="login_ifr" action="c.domain.com/c.php" method="POST">
......
</form>
<iframe id="login_ifr" name="login_ifr" src="" width="0" height="0" frameborder="0" scrolling="no" style="display:none;"></iframe>

上面是主要的几个文件,在a.html里有个按钮,当user点击按钮后弹出层b.html,然后用户在弹出层里输入信息点提交后,b.html中的form提交到c.domain.com下的c.php进行逻辑处理,form的target为b.html的一个隐藏iframe。现在除了IE6外的浏览器都可以运行成功,就是在IE6下报错“拒绝访问”

请输入图片描述

这个错误目前发现是在安装有360软件的机子上出现的几率大些,我如果把http://*.domain.com加入为信任站点,就不报错了,程序执行成功。但你不能让用户去添加信任站点呀,帮忙分析一下是哪里的问题。

评论 (0)链接2012-02-21 

没有人回答呀,今天终于让我搞出来了,分享给大家。
这个问题主要是父窗口与iframe子窗口的通信问题,当在父窗口设置document.domain = 'domain.com';时导致无法正常和Iframe(也是同域下)进行通信,IE下抛出的错误是:拒绝访问,导致无法操作iframe中的内容。因为在父页面或在iframe页面中,只要设置了document.domain,无论是和当前域名相同还是根域名,均视为跨域,所以才会出现拒绝访问的错误。所以在父窗口和子窗口里设置一样的document.domain = 'domain.com';这个方只适用于当你知道iframe的src时。

如果你是动态创建iframe在ie下还是会出现“拒绝访问”,解决办法就是在被调用的iframe页面中设置一个脚本变量,然后在父页面中不停地去尝试获取这个值,什么时候获得到了,就停下来执行自己的业务逻辑。这是没办法的办法。

抛弃我上面提问的问题的方法,在页面A(http://a.domain.com/a.html )中动态创建一个 iframe,iframe的src指向页面B(http://b.domain.com/b.html ),然后在页面A中获取或更改页面B中的内容。

a.html代码:

  
<html>  
<head>
<title>a.html</title>
</head>
<body>
<script type="text/javascript">
document.domain = 'domain.com';
var iframe = document.createElement("iframe");
iframe.src = 'http://b.domain.com/b.html';
iframe.id = 'login_ifr';
iframe.width =0;
iframe.height =0;
iframe.frameborder = 0;
iframe.name = 'login_ifr';
iframe.style.display="none";
document.body.appendChild(iframe);
window.frames.login_ifr.name = "login_ifr"; //这里主要是兼容其他浏览器,比如FF
if(/MSIE/i.test(navigator.userAgent)){ //判断如果是ie浏览器
var timer = setInterval(function(){
if(iframe.contentWindow.accessTmp){
clearInterval(timer);
document.regform.submit();
}
}, 100);
} else {
document.regform.submit();
}
</script>
<form id="regform" name="regform" target="login_ifr" action="http://c.domain.com/c.php" method="POST">
.....
</form>
</body>
</html>

b.html代码:

  
<html>  
<head>
<title>http://b.domain.com/b.html</title>
<script type="text/javascript">
document.domain = 'domain.com';
var accessTmp = true;
</script>
</head>
<body>
</body>
</html>
小飞
小飞
6832
编辑于 2012-03-02
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-22

是不是第二次才报错?syntax error的详细错误是啥?
用appendChild试试:
var ifr='<iframe width="400" height="400" marginWidth=0 marginHeight=0 frameBorder=0 width="100%" scrolling="no" allowTransparency="true" src="b.domain.com/b.html"></iframe>';

document.getElementById('div#p').appendChild(ifr);

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2012-02-21
  • 0 支持
    没有第二次提交呀,流程是这样的,比如用户点“登陆”按钮,然后程序会弹出登陆窗口层(也就是上面的b.html),用户在登陆窗口里填写信息后提交,这里的登陆窗口form的action是c.php,target是b.html里的隐藏iframe – 张洪保 2012-02-21

不是您所需,查看更多相关问题与答案

德问是一个专业的编程问答社区,请 登录注册 后再提交答案