关于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 相关文章推荐
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
Dec 02 Javascript
js中的cookie的读写操作示例详解
Apr 17 Javascript
JavaScript DOM基础
Apr 13 Javascript
jQuery实现可展开合拢的手风琴面板菜单
Sep 15 Javascript
浅谈JavaScript中小数和大整数的精度丢失
May 31 Javascript
深入理解JQuery循环绑定事件
Jun 02 Javascript
AngularJS 工作原理详解
Aug 18 Javascript
Bootstrap 响应式实用工具实例详解
Mar 29 Javascript
JavaScript实现滑动导航栏效果
Aug 30 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
Oct 11 Javascript
node通过npm写一个cli命令行工具
Oct 12 Javascript
利用不到200行代码写一款属于你自己的js类库
Jul 08 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面向对象概念
2011/11/06 PHP
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
2016/11/30 PHP
PHP面向对象程序设计类的定义与用法简单示例
2016/12/27 PHP
php创建图像具体步骤
2017/03/13 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
csdn 博客的css样式 v3
2009/02/24 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
图解javascript作用域链
2019/05/27 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
python实现发送和获取手机短信验证码
2016/01/15 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
python 使用OpenCV进行简单的人像分割与合成
2021/02/02 Python
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
房地产促销活动方案
2014/03/01 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
终止劳动合同协议书
2014/04/14 职场文书
感恩教育活动总结
2014/05/05 职场文书
中学生打架检讨书
2014/10/13 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书