关于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 相关文章推荐
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
Dec 22 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
May 13 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
Jan 23 Javascript
去除字符串左右两边的空格(实现代码)
May 12 Javascript
js获取新浪天气接口的实现代码
Jun 06 Javascript
浅谈js内置对象Math的属性和方法(推荐)
Sep 19 Javascript
浅谈JS如何实现真正的对象常量
Jun 25 Javascript
Vue组件通信实践记录(推荐)
Aug 15 Javascript
js实现简单数字变动效果
Nov 06 Javascript
微信小程序实现下拉刷新动画
Jun 21 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
Sep 18 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
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
利用PHP扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
PHP函数积累总结
2019/03/19 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
基于JQuery的密码强度验证代码
2010/03/01 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
2018/11/09 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
python处理Excel xlrd的简单使用
2017/09/12 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
python SVD压缩图像的实现代码
2019/11/05 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
元旦联欢会策划方案
2014/06/11 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
工商局调档介绍信
2015/10/22 职场文书
八年级历史教学反思
2016/02/19 职场文书
2019年最新借条范本!
2019/07/08 职场文书
Python一些基本的图像操作和处理总结
2021/06/23 Python
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android
js前端图片加载异常兜底方案
2022/06/21 Javascript