关于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 form 隐藏的input 选择
Apr 29 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
Jun 26 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
Feb 20 Javascript
基于javascript实现彩票随机数生成(简单版)
Apr 17 Javascript
AngularJS 实现弹性盒子布局的方法
Aug 30 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
Jan 04 Javascript
canvas绘图不清晰的解决方案
Feb 28 Javascript
jQuery正则验证注册页面经典实例
Jun 10 jQuery
JavaScript中arguments和this对象用法分析
Aug 08 Javascript
Vue开发之封装上传文件组件与用法示例
Apr 25 Javascript
泛谈JS逻辑判断选择器 || &amp;&amp;
May 24 Javascript
javascript中call,apply,callee,caller用法实例分析
Jul 24 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
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
php程序之die调试法 快速解决错误
2009/09/17 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
Python中operator模块的操作符使用示例总结
2016/06/28 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
pygame实现弹球游戏
2020/04/14 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
python自动化办公操作PPT的实现
2021/02/05 Python
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
社区志愿者心得体会
2014/01/03 职场文书
租房合同协议书
2014/04/09 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
公司证明怎么写
2014/09/22 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
五一晚会主持词
2015/07/01 职场文书