关于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 相关文章推荐
容易造成JavaScript内存泄露几个方面
Sep 04 Javascript
浅谈javascript构造函数与实例化对象
Jun 22 Javascript
原生JavaScript实现异步多文件上传
Dec 02 Javascript
Window.Open打开窗体和if嵌套代码
Apr 15 Javascript
javascript鼠标滑过显示二级菜单特效
Nov 18 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
Dec 15 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
Jul 24 Javascript
JavaScript数据类型的存储方法详解
Aug 25 Javascript
angular 实时监听input框value值的变化触发函数方法
Aug 31 Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 Javascript
浅谈React之状态(State)
Sep 19 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
Aug 20 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/04/30 PHP
laravel5.6实现数值转换
2019/10/23 PHP
js常用代码段收集
2011/10/28 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
Python闭包实现计数器的方法
2015/05/05 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
Python tkinter常用操作代码实例
2020/01/03 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
在python中求分布函数相关的包实例
2020/04/15 Python
Python虚拟环境venv用法详解
2020/05/25 Python
CSS3 实现弹幕的示例代码
2017/08/07 HTML / CSS
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
团队精神演讲稿
2013/12/31 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
MySQL触发器的使用
2021/05/24 MySQL
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers