关于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 相关文章推荐
做网页的一些技巧(续)
Feb 01 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 Javascript
js使用正则实现ReplaceAll全部替换的方法
Jul 18 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
Dec 17 Javascript
简单谈谈JS数组中的indexOf方法
Oct 13 Javascript
基于ajax和jsonp的原生封装(实例)
Oct 16 Javascript
浅析从vue源码看观察者模式
Jan 29 Javascript
详解angular如何调用HTML字符串的方法
Jun 30 Javascript
vue插槽slot的理解和使用方法
Apr 03 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
Sep 06 Javascript
小程序接口的promise化的实现方法
Dec 11 Javascript
JavaScript的一些小技巧分享
Jan 06 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
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
Mac地址验证的javascript代码
2013/11/09 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
微信小程序 input输入框详解及简单实例
2017/01/10 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
基于vue组件实现猜数字游戏
2020/05/28 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
python 性能提升的几种方法
2016/07/15 Python
python绘制圆柱体的方法
2018/07/02 Python
Python元组常见操作示例
2019/02/19 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
python连接mysql有哪些方法
2020/06/24 Python
python如何支持并发方法详解
2020/07/25 Python
python中random模块详解
2021/03/01 Python
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
我读书我快乐演讲稿
2014/05/07 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
培根随笔读书笔记
2015/07/01 职场文书
详解Redis瘦身指南
2021/05/26 Redis
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL