关于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 相关文章推荐
用JS剩余字数计算的代码
Jul 03 Javascript
jQuery的一些特性和用法整理小结
Jan 13 Javascript
鼠标右击事件代码(asp.net后台)
Jan 27 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
Apr 17 Javascript
基于jquery实现控制经纬度显示地图与卫星
May 20 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
May 24 Javascript
jQuery圆形统计图开发实例
Jan 04 Javascript
完美JQuery图片切换效果的简单实现
Jul 21 Javascript
Bootstrap table简单使用总结
Feb 15 Javascript
利用JS制作万年历的方法
Aug 16 Javascript
javascript异步编程的六种方式总结
May 17 Javascript
Nuxt的路由动画效果案例
Nov 06 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网页显示各种语法错误
2013/09/23 PHP
使用php计算排列组合的方法
2013/11/13 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
php socket通信简单实现
2016/11/18 PHP
JavaScript—window对象使用示例
2013/12/09 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
python 写一个性能测试工具(一)
2020/10/24 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
澳大利亚排名第一的露营和户外设备在线零售商:Outbax
2020/05/06 全球购物
Solaris操作系统的线程机制
2012/12/23 面试题
行政助理岗位职责范文
2013/12/03 职场文书
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
家长学校实施方案
2014/03/15 职场文书
投标诚信承诺书
2014/05/26 职场文书
中学生逃课检讨书
2015/02/17 职场文书
入党群众意见范文
2015/06/02 职场文书
python实现网络五子棋
2021/04/11 Python
PHP中strval()函数实例用法
2021/06/07 PHP