Ajax应用之表单提交

Ajax中提交表单,实际上是手动获取表单的数据,然后对数据进行封装,再通过异步请求对象提交到服务端的过程。

Ajax异步请求对象的创建(可参考http://blog.youkuaiyun.com/lixianlin/archive/2009/12/14/5001923.aspx),需要考虑一下浏览器兼容性,IE和非IE浏览器下创建方式不同。返回结果的处理,其实也就是异步请求对象的回调函数的构建。这两步操作只要明白了异步请求对象的工作原理,实现起来都不难,难的是如何获取表单的数据并对数据进行封装。

获取表单数据的思路:对表单中的所有元素(当然是能够提交数据的元素,不能提交数据的元素无须考虑)进行遍历,获取每个元素的name属性和value值,这其中就需要考虑怎样获取value值,比如象select元素,并不是所有option的value值都有效,只有被选中的option才是有效的,这个不用多说,因为select元素的作用就是那样的。

表单数据封装:换种方法说也说是编码,凡提到数据传输,必然会提到编码,因为只有编码和解码采用同一种机制(或者说协议),才能保证传输数据的正确性。正常情况下的表单提交,如GET方式,默认是采用“application/x-www-form-urlencoded“编码方式对数据封装的,得到的结果是以&连接的键值对的形式,其中的键和值需要进行编码处理,结果形如:key1=val1&key2=val2&key3=val3。可以用encodeURIComponent方法对键和值进行编码,也可以自定义编码方式,只要让服务器操作方便就行。

需要注意的事,对于file文件上传类型,是无法直接通过Ajax来处理的,因为在设计JS的时候,出于安全性考虑,网页中的JS被设计成不能访问文件的。网上所说的Ajax上传文件(严格意义上这种说法是不正确的),都是通过其他方式来上传文件的。

提供一个简单遍历表单数据的方法:

function GetRequestString(frm) { frm=$(frm); var e; var arr=[]; for(var i=0;i<frm.length;++i) { e=frm[i]; if(!e.name || e.disabled) { continue; } if(e.type=='select-one') { arr.push(encodeURIComponent(e.name)+'='+encodeURIComponent(e.options[e.selectedIndex].value)); } else if(e.type=='select-multiple') { for(var j=0;j<e.length;++j) { if(e.options[j].selected) { arr.push(encodeURIComponent(e.name)+'='+encodeURIComponent(e.options[j].value)); } } } else if(e.type=='checkbox' || e.type=='radio') { if(e.checked) { arr.push(encodeURIComponent(e.name)+'='+encodeURIComponent(e.value)); } } else if(typeof(e.value)!='undefined') { arr.push(encodeURIComponent(e.name)+'='+encodeURIComponent(e.value)); } } return arr.join('&'); }

参数为表单对象,或表单的id。

代码中用到的$()函数的定义:

function $(s) { if(typeof(s)=="string") { return document.getElementById(s); } else if(typeof(s)=="object") { return s; } else { return document; } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值