Javascript异步表单提交,图片上传,兼容异步模拟ajax技术


Posted in Javascript onMay 10, 2010

前言:
咋一看标题还挺长的呢,还有这么多功能,其实简化一点就是一个功能,异步表单提交,只是在异步表单提交这个大功能下,可以实现图片上传,模拟ajax技术(其实很早以前就是通过这个方式来实现多浏览器的兼容ajax,这里只是怀怀旧,作为一个技术来玩玩),下面的内容需要有一定的js基础,要不然理解起来会比较困难。
注意事项:
这是我bBank里面的一个方法,现在我把他提取出来成一个通用方法来讲解。
bBank 框架介绍:http://www.cnblogs.com/bruceli/archive/2010/04/15/bBank.html
为什么要提到bBank,因为在下面的方法中,会使用到bBank的数组的判断,字符串html转换标准dom(我上一篇文章就介绍了这个,点击见详情),移除自己方法,css选择器,所以大家看到不要陌生,你可以自己写方法来替换这些方法,也可以直接用bBank的方法,可以下载bBank看源代码。
b$.type.isArray(args) 判断是否是数组
b$.parseDom(strs) 字符串直接转换为标准的dom对象
b$('#bBankAsynFormSubmit_form_1b').removeSelf() 移除自己
b$() css选择器
原理:
核心是通过iframe来完成异步。在页面放入一个隐藏的iframe,表单有个属性target,设置target为你要来进行异步提交的iframe,那么当你在提交表单的时候,其实是在使用iframe来作为提交显示载体,页面其它内容是无刷新的。
其实原理很简单,既然iframe是作为显示载体的,那么我们扩展下,如果提交的页面是有返回值的,那么返回值会成为iframe的body里面的内容,在通过iframe来取得body里面的内容来,是不是和ajax有点像,这就是以前最早用来实现异步的方法了。
ajax是时间触发制的,既然要模拟ajax,那么我们也要触发事件,其实也很简单,只要使用iframe的onload装载完成事件就可以了。
实现:
code:

var asyn = { 
formSubmit: function (args, action, func) { 
this.clearContext(); 
this.callBack = null; 
var subArr = []; 
var subArrT = []; 
if (b$.type.isArray(args)) { 
subArr = args; 
} else { 
var tag = args.tagName.toLowerCase(); 
if (tag == "form") { for (var i = 0, num = args.childNodes.length; i < num; i++) { subArr.push(args.childNodes[i]); } } 
else { subArr = [args]; } 
} 
//create asyn form and ifroma 
var objForm = document.createElement("form"); 
objForm.action = action; 
objForm.target = "bBankAsynFormSubmit_iframe_1b"; 
objForm.encoding = "multipart/form-data"; 
objForm.method = "post"; 
objForm.id = "bBankAsynFormSubmit_form_1b"; 
objForm.style.display = "none"; 
var objIframe = b$.parseDom('<iframe id="bBankAsynFormSubmit_iframe_1b" name="bBankAsynFormSubmit_iframe_1b" src="about:blank" style="display:none;" onload="javascript:setTimeout(\'asyn.complete()\',100)"></iframe>')[0]; 
//add submit value in form 
for (var i = 0, num = subArr.length; i < num; i++) { 
if (!subArr[i].name && subArr[i].nodeType == 1 && subArr[i].tagName.toLowerCase() == "input") subArr[i].name = "bBankAsynFormSubmit_input_1b_" + i; 
var input = subArr[i].cloneNode(true); 
subArrT.push(input); 
subArr[i].parentNode.replaceChild(input, subArr[i]); 
objForm.appendChild(subArr[i]); 
} 
//submit 
document.body.appendChild(objIframe); 
document.body.appendChild(objForm); 
objForm.submit(); 
//dispose 
for (var i = 0, num = subArrT.length; i < num; i++) { subArrT[i].parentNode.replaceChild(subArr[i], subArrT[i]); } 
if (func) this.callBack = func; 
}, 
complete: function () { 
var responseText = ""; 
try { 
var objIframe = document.getElementById("bBankAsynFormSubmit_iframe_1b"); 
if (objIframe.contentWindow) { responseText = objIframe.contentWindow.document.body.innerHTML; } 
else { responseText = objIframe.contentDocument.document.body.innerHTML; } 
} catch (err) { } 
this.clearContext(); 
if (this.callBack) this.callBack(responseText); 
}, 
clearContext: function () { 
if (b$('#bBankAsynFormSubmit_form_1b')) b$('#bBankAsynFormSubmit_form_1b').removeSelf(); 
if (b$('#bBankAsynFormSubmit_iframe_1b')) b$('#bBankAsynFormSubmit_iframe_1b').removeSelf(); 
}, 
callBack: null 
};

简单讲解:


其实里面比较麻烦的应该是处理iframe的多浏览器兼容问题了,其实我们也不用去钻牛角尖来讨论iframe的这个兼容问题,我们把兼容交给浏览器自己来解析和解决,这里使用了字符串转dom。

首先我创建了一个form表单和iframe,都是隐藏的,把表单的内容都转到我创建的隐藏表单中,在把创建的隐藏表单提交。全部完成后在移除创建的表单和iframe。

使用:

asyn.formSubmit(args, action [, func]) arg:可以为一个form表单,一个input表单元素,input表单元素数组。 action:提交的url。 func:回调函数
例:asyn.formSubmit(inputArr, 'xxx.aspx', function(d){

alert(d);
});
END
到这里就结束了,在这里向大家推荐一个我自己写的js框架,上面的这个方法集成在框架里面了
使用:

b$.asyn.formSubmit(inputArr, 'xxx.aspx', function(d){ 
  alert(d); 
});
Javascript 相关文章推荐
用js重建星际争霸
Dec 22 Javascript
JS分页效果示例
Oct 11 Javascript
iframe的onreadystatechange事件在firefox下的使用
Apr 16 Javascript
javascript对中文按照拼音排序代码
Aug 20 Javascript
jquery实现简单合拢与展开网页面板的方法
Sep 01 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
Sep 08 Javascript
基于Jquery和html5的7款个性化地图插件
Nov 17 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
Sep 25 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
Sep 18 Javascript
es6中使用map简化复杂条件判断操作实例详解
Feb 19 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
Feb 24 Javascript
vue和小程序项目中使用iconfont的方法
May 19 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
May 10 #Javascript
JavaScript几种形式的树结构菜单
May 10 #Javascript
js function使用心得
May 10 #Javascript
javascript 模式设计之工厂模式详细说明
May 10 #Javascript
javascript 精粹笔记
May 09 #Javascript
javascript之通用简单的table选项卡实现(二)
May 09 #Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
May 08 #Javascript
You might like
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
xss防御之php利用httponly防xss攻击
2014/03/21 PHP
PHP SplObjectStorage使用实例
2015/05/12 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
python基于opencv 实现图像时钟
2021/01/04 Python
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
毕业自我评价范文
2013/11/17 职场文书
计算机专业职业规划
2014/02/28 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
优秀团员事迹材料
2014/12/25 职场文书
Python提取PDF指定内容并生成新文件
2021/06/09 Python
Python四款GUI图形界面库介绍
2022/06/05 Python