关于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中的apply()方法和call()方法使用介绍
Jul 25 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
Jan 08 Javascript
使用plupload自定义参数实现多文件上传
Jul 19 Javascript
浅谈JavaScript中变量和函数声明的提升
Aug 09 Javascript
微信小程序模板之分页滑动栏
Feb 10 Javascript
微信小程序“摇一摇”的实例代码
Jul 20 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
微信小程序基于本地缓存实现点赞功能的方法
Dec 18 Javascript
layui之select的option叠加问题的解决方法
Mar 08 Javascript
iconfont的三种使用方式详解
Aug 05 Javascript
JavaScript模块管理的简单实现方式详解
Jun 15 Javascript
前端canvas中物体边框和控制点的实现示例
Aug 05 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
linux下为php添加curl扩展的方法
2011/07/29 PHP
php汉字转拼音的示例
2014/02/27 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
在Django的视图中使用form对象的方法
2015/07/18 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
python学生管理系统
2019/01/30 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
机关财务管理制度
2014/01/17 职场文书
商务助理求职信范文
2014/04/20 职场文书
2014年店长工作总结
2014/11/17 职场文书
创业计划书之美甲店
2019/09/20 职场文书
六年级作文之关于梦
2019/10/22 职场文书
MySQL之select、distinct、limit的使用
2021/11/11 MySQL