表单跨域提交 |
您所在的位置:网站首页 › form跨域 › 表单跨域提交 |
利用form表单跨域post
现在ajax应用这么广泛,一般的应用都是直接通过异步调用就可以了,但是有些东西必须要使用post,而且是跨域的时候,ajax异步调用的方式就无能为力了。当然现在也有很多种办法,比如通过flash中转去post,可以post到任何域中,或者是通过嵌入iframe来实现,flash的方式虽然好,但是用户还得下载个swf文件,而且as开发我也就略知皮毛,所以这里我就是要使用嵌入iframe的方式来实现。 我的需求是将部分内容post到server中,因为服务器是c++写的cgi,所以没办法通过代理页的方式来实现,只好在本页面来实现。
在这里,我通过将需要post的内容写入content的input中,然后点击提交,将form的action设置为目标服务器的url,target设置为iframe的名称,这样就可以实现无刷新的跨域post了,但是由于浏览器防止重复提交的功能,所以如果直接提交到iframe的话,后面你刷新页面的话,浏览器就会提示是否要重复提交,所以这里我们监听iframe的onload事件,当iframe成功load之后,就将iframe的src指向空白页,从而浏览器认为已经跳转到新页面了,刷新也就不会提示重复提交的弹出框了。 这里我们还可以在iframe load成功的时候,通过contenWindow属性来获取服务器的响应,从而可以判断post是否成功。因为这里要先判断post是否成功,所以在取得了服务器返回的数据之后再设置iframe的src为空白页面,并且将iframe的onload事件取消,否则iframe每次src设置为about:blank都会触发onload事件。
这里看到有人说ie6中会有iframe的onload事件调用时页面仍未载入完成,或是不触发onload事件,则需要通过监听iframe的readyState来实现得到服务器响应完成的功能。我貌似还没碰到,等碰到了的话再来解决。最近做的东西还要改as代码,恩,可以学学as了 ddd function check() { var btn = document.getElementById("test_submit"); var frm = document.forms["test_form"]; var ifm = document.getElementById("test_iframe"); frm.action = "http://xxx.xxx.xxx/post.php"; frm.target = "test_iframe"; frm.submit(); btn.disabled = "disabled"; ifm.onload = function(){ btn.disabled = ""; var str = ifm.contentWindow; alert(str.document.body.innerHTML); ifm.src = "about:blank"; ifm.onload = null; } return false; }
好吧,果然在ie下iframe不会触发onload事件,于是改为了 Nicholas C.Zakas提供的方法,通过attachEvent来添加onload事件。 ifm.onload = function(){ btn.disabled = ""; var str = ifm.contentWindow; alert(str.document.body.innerHTML); ifm.src = "about:blank"; ifm.onload = null; } //改为 if(ifm.attachEvent){ ifm.attachEvent("onload", function(){ btn.disabled = ""; var str = ifm.contentWindow; alert(str.document.body.innerHTML); ifm.src = "about:blank"; ifm.detachEvent("onload", arguments.callee); } }else{ ifm.onload = function(){ btn.disabled = ""; var str = ifm.contentWindow; alert(str.document.body.innerHTML); ifm.src = "about:blank"; ifm.onload = null; } } |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |