关于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 存在陷阱 删除某一区域所有节点
May 10 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
Jul 17 Javascript
javascript动态加载二
Aug 22 Javascript
js倒计时小程序
Nov 05 Javascript
浅析JavaScript基本类型与引用类型
May 28 Javascript
jQuery判断多个input file 都不能为空的例子
Jun 23 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
Aug 27 Javascript
基于javascript实现右下角浮动广告效果
Jan 08 Javascript
利用Angular.js限制textarea输入的字数
Oct 20 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
Oct 24 Javascript
vue cli升级webapck4总结
Apr 04 Javascript
vue中的provide/inject的学习使用
May 09 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 清除网页病毒的方法
2008/12/05 PHP
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
JQuery 常用操作代码
2010/03/14 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
浅析js实现网页截图的两种方式
2019/11/01 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python读取YUV文件,并显示的方法
2018/12/04 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
运行python提示no module named sklearn的解决方法
2020/11/29 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
SQL SERVER面试资料
2013/03/30 面试题
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
英语专业毕业生自荐信范文
2013/12/31 职场文书
酒店总经理助理职责
2014/02/12 职场文书
三严三实对照检查材料
2014/09/22 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
提档介绍信范文
2015/10/22 职场文书
JavaScript实现班级抽签小程序
2021/05/19 Javascript
python flask开发的简单基金查询工具
2021/06/02 Python
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android