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 相关文章推荐
window.showModalDialog使用手册
Jan 11 Javascript
Javascript字符串浏览器兼容问题分析
Dec 01 Javascript
使用jQuery在对象中缓存选择器的简单方法
Jun 30 Javascript
分享两款带遮罩的jQuery弹出框
Dec 30 Javascript
学习JavaScript设计模式之观察者模式
Apr 22 Javascript
php基于redis处理session的方法
Mar 14 Javascript
Angular 应用技巧总结
Sep 14 Javascript
使用Math.max,Math.min获取数组中的最值实例
Apr 25 Javascript
JQuery 选择器、DOM节点操作练习实例
Sep 28 jQuery
Angular浏览器插件Batarang介绍及使用
Feb 07 Javascript
通过vue刷新左侧菜单栏操作
Aug 06 Javascript
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 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修改时间格式的代码
2011/05/29 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
可输入的下拉框
2006/06/19 Javascript
javascript 函数式编程
2007/08/16 Javascript
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
Django视图和URL配置详解
2018/01/31 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
python实现矩阵打印
2019/03/02 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
会计顶岗实习心得
2014/01/25 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
保证书格式
2015/01/16 职场文书
最感人的道歉情书
2015/05/12 职场文书
使用css样式设计一个简单的html登陆界面的实现
2021/03/30 HTML / CSS
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技