关于iframe跨域POST提交的方法示例


Posted in Javascript onJanuary 15, 2017

前言

以前在面试的时候经常遇到问关于跨域的事儿,所以自己对跨域有一定的概念性了解,知道什么是跨域以及解决跨域的方法,但是具体实际从来没有操作过,直到最近在公司项目中,遇到了一个需要使iframe跨域进行POST提交的实际案例,我才明白具体如何使用iframe进行跨域操作。

说到跨域,就不得不提起浏览器的同源策略。

同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。

如果协议,端口(如果指定了一个)和主机对于两个页面是相同的,那么这两个页面就具有相同的源。

从这个定义可以看出,如果两个页面的协议,端口,主机三个只要有一个不一样,就是不同的源,想要相互之间进行交互,就需要进行跨域。

iframe跨域POST无刷新提交

跨域的方法有很多,像JSONP、iframe、CORS、postMessage等等,由于项目中用到了iframe进行POST跨域,所以本文主要总结一下如何利用iframe进行POST无刷新提交。

我们知道一般提交使用form表单进行提交,但是这种提交会导致页面跳转,所以交互效果不是友好,为了实现无刷新提交,我们会使用Ajax,但是此时可能会出现一个问题—-跨域,那么如何解决这个问题呢,可以使用一个隐藏的iframe,我们将要提交的数据提交到这个隐藏的iframe,然后让这个iframe去跳转,这样就可以在视觉上实现页面无跳转刷新(实际上页面还是跳转了,只是iframe被隐藏,我们看不到)。

在提交后我们还要获取到后台给我们返回回来的数据,所以需要在iframe中进行数据的交互同时拿到返回回来的data。

为了让数据可以顺利的进行数据交互,我们通常使用document.domain将域设置到顶级域。
为了拿到返回回来的data,需要使用一个函数,函数名后台已经告知。

附实现代码

<form action="You POST Link" method="post" target="target" id="J_commenting">
 <select name="category" class="select J_filter" id="J_typeFilter">
 <option value="0" selected="selected">Select Category</option>
 <option value="1">Life</option>
 <option value="2">People</option>
 <option value="3">Landscape</option>
 <option value="4">Tech</option>
 <option value="5">Others</option>
 </select>
 <input name="title" type="text" class="misstion-title J_misstion-title">
 <textarea name="desc" class="misstion-description J_description" maxlength="200"></textarea>
 <button class="button J_button" type="submit">Submit</button>
</form>
<iframe name="target" style="display:none;"></iframe>
var $button = $('.J_button');
var $commenting = $('#J_commenting');
var $filter = $('.J_filter');
var $misstionTitle = $('.J_misstion-title');
var $description = $('.J_description');
$button.on('click', function () {
 var filterValue = $filter.val();
 var misstionTitleValue = $misstionTitle.val();
 var descriptionValue = $description.val();
 if (filterValue === '0' || misstionTitleValue === '' || descriptionValue === '') {
 alert('Check if you filled out all the fields required');
 } else {
 $commenting.submit();
 }
});
$commenting.on('submit', function () {
 document.domain = 'aa.com';
 window.addData = function (data) {
 var dataCode = data.code;
 var dataMsg = data.message;
 if (dataCode === 0) {
  alert('submit success!');
 } else {
  alert('submit failed!');
 }
 }
});

点击提交后,后台返回的数据:

document.domain = "aa.com";
var data = {"code":-2,"info":"please login first","message":"please login first"}; 
if( typeof(parent.window['addData']) == "function"){
 parent.window['addData'](data);
}else if( typeof(window.top['addData']) == "function"){
 window.top['addData'](data);
}

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
jQuery EasyUI 开源插件套装 完全替代ExtJS
Mar 24 Javascript
js实现杯子倒水问题自动求解程序
Mar 25 Javascript
自动最大化窗口的Javascript代码
May 22 Javascript
javascript实现左右控制无缝滚动
Dec 31 Javascript
javascript操作ul中li的方法
May 14 Javascript
jQuery的each循环用法简单示例
Jun 12 Javascript
JS实现DIV高度自适应窗口示例
Feb 16 Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 Javascript
vue中使用vue-cli接入融云实现即时通信
Apr 19 Javascript
使用React手写一个对话框或模态框的方法示例
Apr 25 Javascript
基于layui轮播图满屏是高度自适应的解决方法
Sep 16 Javascript
javascript 原型与原型链的理解及实例分析
Nov 23 Javascript
JavaScript中利用for循环遍历数组
Jan 15 #Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
Jan 15 #Javascript
JavaScript调试的多个必备小Tips
Jan 15 #Javascript
使用Promise链式调用解决多个异步回调的问题
Jan 15 #Javascript
js实现密码强度检验
Jan 15 #Javascript
JavaScript实现图像模糊化的方法实例
Jan 15 #Javascript
vue实现简单实时汇率计算功能
Jan 15 #Javascript
You might like
PHP中的正规表达式(一)
2006/10/09 PHP
一个简单php扩展介绍与开发教程
2010/08/19 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
NodeJS框架Express的模板视图机制分析
2011/07/19 NodeJs
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
jQuery插件Timelinr 实现时间轴特效
2015/10/04 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
python 判断一个进程是否存在
2009/04/09 Python
详细讲解Python中的文件I/O操作
2015/05/24 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
Python 转换文本编码实现解析
2019/08/27 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
房地产出纳岗位职责
2013/12/01 职场文书
微型企业创业投资计划书
2014/01/10 职场文书
学校介绍信范文
2014/01/14 职场文书
50岁生日感言
2014/01/23 职场文书
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书