/*!*jQuery表单插件*版本:3.18(2012年9月28日)*@需要jQuery v1.5或更高版本**示例和文档位于:http://malsup.com/jquery/form/*项目存储库:https://github.com/malsup/form网站*MIT和GPL许可证下的双重许可:* http://malsup.github.com/mit-license.txt* http://malsup.github.com/gpl-license-v2.txt*//*全局ActiveXObject警报*/;(函数($){“使用严格”;/*使用说明:-----------不要在同一个表单上同时使用ajaxSubmit和ajaxForm功能是相互排斥的。如果需要,请使用ajaxSubmit将自己的提交处理程序绑定到表单。例如,$(document).ready(function()){$('#myForm').on('submit',函数(e){e.预防违约();//<--重要的$(this).ajaxSubmit({目标:“#output”});});});如果希望插件管理所有事件绑定,请使用ajaxForm为你。例如,$(document).ready(function()){$(“#myForm”).ajaxForm({目标:“#output”});});您还可以将ajaxForm与委托一起使用(需要jQuery v1.7+),因此调用ajaxForm时,表单不必存在:$('#myForm').ajaxForm({委托:真的,目标:“#output”});使用ajaxForm时,将为您调用ajaxSubmit函数在适当的时间。*//***特征检测*/var特征={};feature.fileapi=$(““).get(0).files!==未定义;feature.formdata=窗口。表单数据!==未定义;/***ajaxSubmit()提供了一种立即提交的机制*使用AJAX的HTML表单。*/$.fn.ajaxSubmit=函数(选项){/*jshint脚本url:true*///如果未选择任何内容,则快速失败(http://dev.jquery.com/ticket/2752)if(!this.length){log('ajaxSubmit:跳过提交过程-未选择任何元素');返回此;}var方法、操作、url、$form=此;if(选项类型==“函数”){options={success:options};}方法=this.attr('method');action=this.attr('action');url=(操作类型===“字符串”)?$。修剪(操作):“”;url=url||window.location.href||'';if(url){//清除url(不包括哈希值)url=(url.match(/^([^#]+)/)|[])[1];}options=$.extend(true{url:url,成功:$.ajaxSettings.success,type:方法||“GET”,iframeSrc:/^https/i.test(window.location.href|'')?'javascript:false“:”关于:空白“},选项);//钩子,用于在提取表单数据之前对其进行操作;//方便与tinyMCE或FCKEditor等丰富的编辑器一起使用var否决={};this.trigger('form-preserialize',[this,options,vort]);if(否决。否决){log('jaxSubmit:通过form-pre-serialize触发器提交被否决');返回此;}//提供在序列化表单数据之前更改表单数据的机会if(options.beforeSerialize&&options.beforeSerialize(this,options)===false){log('ajaxSubmit:通过beforeSerialize回调中止提交');返回此;}var传统=选项传统;if(传统===未定义){traditional=$.ajaxSettings.traditional;}var元素=[];var qx,a=this.formToArray(options.semantic,elements);if(选项.data){options.extraData=选项.data;qx=$.param(options.data,传统);}//给预提交回调一个中止提交的机会if(options.beforeSubmit和options.BeforeSubit(a,this,options)===false){log('ajaxSubmit:通过beforeSubmit回调中止提交');返回此;}//fire vetoable“validate”事件this.trigger('form-submit-validate',[a,this,options,否决权]);if(否决。否决){log('ajaxSubmit:通过form-submit-validate触发器提交被否决的文件');返回此;}var q=$.param(a,传统);如果(qx){q=(q?(q+‘&’+qx):qx);} if(options.type.toUpperCase()==“GET”){options.url+=(options.url.indexOf(“?”)>=0?“&”:“?”q;options.data=空;//“get”的数据为空}其他{options.data=q;//数据是“post”的查询字符串}var回调=[];if(options.resetForm){callbacks.push(function(){$form.resetForm();});}if(options.clearForm){callbacks.push(function(){$form.clearForm(options.includeHidden);});}//仅在未提供dataType的情况下对目标执行加载if(!options.dataType&&options.target){var oldSuccess=options.success||function(){};回调推送(函数(数据){var fn=options.replaceTarget?'replaceWith“:”html“;”;$(options.target)[fn](data).each(oldSuccess,arguments);});}else if(options.success){callbacks.push(选项.成功);}options.success=函数(数据、状态、xhr){//jQuery 1.4+将xhr作为第三个参数传递var context=options.context | | this;//jQuery 1.4+支持范围上下文for(var i=0,max=callback.length;i<max;i++){回调[i].apply(上下文,[data,status,xhr|$form,$form]);}};//有要上传的文件吗?var fileInputs=$('input:file:enabled[value],this);//[价值](第113期)var hasFileInputs=fileInputs.length>0;var mp='multipart/form-data';var multipart=($form.attr('encype')==mp | |$form.att('encoding')==mp);var fileAPI=特征.fileAPI&&feature.formdata;日志(“fileAPI:”+文件API);var shouldUseFrame=(hasFileInputs||multipart)&&!文件API;var jqxhr;//options.iframe允许用户强制使用iframe模式//06-NOV-09:如果检测到文件输入,现在默认为iframe模式if(options.iframe!==false&&(options.iframe | | shouldUseFrame)){//修复Safari悬挂(感谢Tim Molendijk)//请参见:http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5dif(options.closeKeepAlive){$.get(options.closeKeepAlive,function()){jqxhr=文件上传I帧(a);});}其他{jqxhr=文件上传I帧(a);}}else if((hasFileInputs||multipart)&&fileAPI){jqxhr=文件上传Xhr(a);}其他{jqxhr=$.ajax(选项);}$form.removeData('jqxhr').data('jqxhr',jqxhr);//清除元素阵列for(var k=0;k<elements.length;k++)元素[k]=空;//火灾“通知”事件this.trigger('form-submit-notify',[this,options]);返回此;//用于深度序列化的实用程序fn函数deepSerialize(extraData){var序列化=$.param(extraData).split('&');var len=序列化长度;var结果={};var i,部分;对于(i=0;i<len;i++){part=序列化的[i].split('=');result[decodeURIComponent(part[0])]=decodeURI组件(part[1]);}返回结果;}//XMLHttpRequest Level 2文件上传(大帽子提示到francois2metz)函数文件UploadXhr(a){var formdata=新formdata();对于(var i=0;i<a.length;i++){formdata.append([i].name,[i].value);}if(options.extraData){var serializedData=deepSerialize(options.extraData);for(serializedData中的var p)if(serializedData.hasOwnProperty(p))formdata.append(p,序列化数据[p]);}options.data=空;vars=$.extend(true,{},$.ajaxSettings,选项{contentType:false,processData:错误,缓存:false,type:方法||“POST”});if(options.uploadProgress){//解决方法,因为jqXHR不公开上传属性s.xhr=函数(){var xhr=jQuery.ajaxSettings.xrr();if(xhr.上传){xhr.upload.onprogress=函数(事件){var百分比=0;var position=事件加载||event.position/*event.position已弃用*/var总数=事件总数;if(event.lengthComputable){百分比=数学细胞(位置/总数*100);}options.uploadProgress(事件、位置、总计、百分比);};}返回xhr;};}s.data=空;var beforeEnd=s.beforeEnd;s.beforeSend=函数(xhr,o){o.data=表格数据;if(beforeSend)beforeSend.call(this,xhr,o);};返回$.ajax;}//处理文件上传的私有功能(向YAHOO致敬!)函数文件上传帧(a){var form=$form[0],el,i,s,g,id,$io,io,xhr,sub,n,timedOut,timeoutHandle;var useProp=!!$。fn.prop;var递延=$。延期();if($(':input[name=submit],:input[id=submit]',form).length){//如果输入的名称或id为“submit”,则我们不会//能够调用表单上的提交fn(至少不是x浏览器)alert('错误:表单元素的名称或id不能为“submit”。');deferred.reject();递延收益;}如果(a){//确保每个序列化输入仍处于启用状态对于(i=0;i<元素长度;i++){el=$(元素[i]);if(useProp)el.prop(“禁用”,false);其他的el.removeAttr(“禁用”);}}s=$.extend(true,{},$.ajaxSettings,选项);s.context=s.context;id='jqFormIO'+(new Date().getTime());if(s.iframe目标){$io=$(s.iframe目标);n=$io.attr(“名称”);如果(!n)$io.attr(“名称”,id);其他的id=n;}其他{$io=$('