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 相关文章推荐
javascript 拖动表格行实现代码
May 05 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
Aug 05 Javascript
动态加载JS文件的三种方法
Nov 08 Javascript
jQuery的live()方法对hover事件的处理示例
Feb 27 Javascript
Node.js实现简单聊天服务器
Jun 20 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
jQuery ajax分页插件实例代码
Jan 27 Javascript
vue双向数据绑定原理探究(附demo)
Jan 17 Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 Javascript
微信小程序支付及退款流程详解
Nov 30 Javascript
详解Vue项目部署遇到的问题及解决方案
Jan 11 Javascript
vue+canvas实现拼图小游戏
Sep 18 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
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
Vue-input框checkbox强制刷新问题
2019/04/18 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
用Python进行行为驱动开发的入门教程
2015/04/23 Python
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
python生成圆形图片的方法
2020/03/25 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
Python 列表反转显示的四种方法
2020/11/16 Python
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
大学团支书的自我评价分享
2013/12/14 职场文书
网络专业学生个人的自我评价
2013/12/16 职场文书
农民入党思想汇报
2014/01/03 职场文书
小学生新学期寄语
2014/01/19 职场文书
一年级学生评语大全
2014/04/21 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
千手观音观后感
2015/06/03 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android