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 相关文章推荐
利用谷歌地图API获取点与点的距离的js代码
Oct 11 Javascript
javascript数组快速打乱重排的方法
Jan 02 Javascript
jQuery实现的背景动态变化导航菜单效果
Aug 24 Javascript
jQuery实现下拉框功能实例代码
May 06 Javascript
Node.js+Express配置入门教程详解
May 19 Javascript
AngularJS国际化详解及示例代码
Aug 18 Javascript
基于Javascript倒计时效果
Dec 22 Javascript
jQuery图片轮播功能实例代码
Jan 29 Javascript
JS验证码实现代码
Sep 14 Javascript
JavaScript中的一些实用小技巧总结
Apr 07 Javascript
vue项目中使用rem,在入口文件添加内容操作
Nov 11 Javascript
JavaScript高级程序设计之变量与作用域
Nov 17 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里得到前天和昨天的日期的代码
2007/08/16 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
jquery 滚动条事件简单实例
2013/07/12 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
python判断输入日期为第几天的实例
2018/11/13 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
2014年药房工作总结
2014/11/22 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
考试没考好检讨书
2015/05/06 职场文书
大学体育课感想
2015/08/10 职场文书