(函数($){/***通过jQuery$.Ajax(异步JavaScript和XML)提供Ajax页面更新。**Ajax是一种在查看HTML时通过JavaScript发出请求的方法*第页。该请求返回一个JSON编码的命令数组,即*然后执行以对页面进行任何必要的更改。**Drupal使用此文件通过#ajax['path']和*#ajax['wrapper']属性。如果设置,此文件将自动包含在内*提供Ajax功能。*/Drupal.ajax=Drupal_ajax||{};/***将Ajax行为附加到每个Ajax表单元素。*/Drupal.behaviors公司。AJAX={附加:函数(上下文,设置){//加载设置中指定的所有Ajax行为。for(settings.ajax中的var-base){if(!$('#'+base+'.ajax-processed').length){var element_settings=settings.ajax[base];if(元素类型settings.selector==“未定义”){element_settings.selector=“#”+基数;}$(element_settings.selector).each(函数(){element_settings.element=此;Drupal.ajax[base]=新Drupal.ajax(base,this,element_settings);});$('#'+base).addClass('jax-processed');}}//将Ajax行为绑定到显示类的所有项。$('.use-ajax:not(.ajax-processed)').addClass('ax-process').each(function(){var元素设置={};//点击的链接与throbber比进度条看起来更好。element_settings.progress={“类型”:“throbber”};//对于锚点标签,这些标签将指向锚点的目标//比通常的位置。if($(this).attr('href')){element_settings.url=$(this).attr('href');element_settings.event='单击';}var base=$(this).attr('id');Drupal.ajax[base]=新Drupal.ajax(base,this,element_settings);});//此类意味着使用Ajax将表单提交给操作。$('.use-ajax-submit:not(.ajax-processed)').addClass('ajax-proxed').each(function(){var元素设置={};//Ajax以这种方式提交,自动提交给//正常形式的动作。element_settings.url=$(this.form).attr('action');//表单提交按钮的点击需要告诉表单点击了什么//它在POST请求中传递。element_settings.setClick=true;//表单按钮使用“点击”事件,而不是鼠标向下。element_settings.event='单击';//点击的表单按钮与throbber比进度条看起来更好。element_settings.progress={“类型”:“throbber”};var base=$(this).attr('id');Drupal.ajax[base]=新Drupal.ajax(base,this,element_settings);});}};/***Ajax对象。**页面上的所有Ajax对象都可以通过全局Drupal.Ajax访问*对象,并由提交按钮的ID键入。您可以从以下位置访问它们*用于覆盖属性或函数的模块JavaScript文件。**例如,如果启用Ajax的按钮具有ID“edit-submit”,则可以*重新定义调用以插入新内容的函数,如下所示*(在Drupal.behaviors连接块内):*@代码*Drupal.behaviors.myCustomAJAXStuff={*附加:函数(上下文,设置){*Drupal.ajax['edit-submit'].commands.insert=函数(ajax、响应、状态){*new_content=$(response.data);*$(“#my-wrapper”).append(new_content);*alert('新内容已附加到#my-wrapper');* }* }* };*@endcode(结束代码)*/Drupal.ajax=函数(基本、元素、元素设置){var默认值={url:“system/ajax”,事件:'mousedown',按键:true,选择器:“#”+基数,效果:'无',速度:'无',方法:“replaceWith”,进度:{type:“throbber”,消息:Drupal.t('请稍候…')},提交:{“js”:真}};$.extend(this、defaults、element_settings);this.element=元素;this.element_settings=元素设置;//将URL中的“nojs”替换为“ajax”允许使用一种简单的方法//服务器检测何时需要正常降级。//有五种情况需要检查:// 1. /无/// 2. /nojs$-URL字符串的末尾。// 3. /没有?-然后是查询(启用了干净的URL)。//例如:路径/nojs?目的地=foobar// 4. /nojs&-后面是查询(未启用干净URL)。//例如:?q=路径/nojs&destination=foobar// 5. /nojs#-后面是一个片段。//例如:path/nojs#myfragmentthis.url=element_settings.url.replace(/\/nojs(\/|$|\?|&#)/g,'/ajax$1');this.wrapper=“#”+元素设置.wrapper;//如果没有表单,则将使用jQuery.ajax(),从而允许我们//还将Ajax绑定到链接。if(this.element.form){this.form=$(this.element.form);}//设置ajaxSubmit函数的选项。//“this”变量不会在options对象内持久存在。var ajax=这个;ajax.options={url:ajax.url,数据:ajax.submit,beforeSerialize:function(element_settings,options){return ajax.beforeSerialize(element_settings,options);},beforeSubmit:函数(form_values,element_settings,options){ajax.ajaxing=真;return ajax.beforeSubmit(form_values,element_settings,options);},beforeSend:function(xmlhttprequest,选项){ajax.ajaxing=真;return ajax.beforeSend(xmlhttprequest,options);},成功:功能(响应、状态){//浏览器支持的健全性检查(需要对象)。//使用iFrame上传时,响应必须作为字符串返回。if(响应类型==“字符串”){response=$.parseJSON(响应);}返回ajax.success(响应、状态);},完成:功能(响应、状态){ajax.ajaxing=假;if(状态=='error'||status=='parserror'){返回ajax.error(响应,ajax.url);}},dataType:“json”,type:“POST”};//将ajaxSubmit函数绑定到元素事件。$(ajax.element).bind(element_settings.event,函数(事件){return ajax.eventResponse(this,event);});//如有必要,启用键盘提交,以便Ajax行为//可以通过键盘输入以及鼠标按下触发//行动。if(element_settings.keypress){$(ajax.element).按键(功能(事件){return ajax.keypressResponse(this,event);});}//如有必要,请阻止其他事件的浏览器默认操作。//例如,阻止单击的浏览器默认操作,即使//AJAX行为绑定到mousedown。if(element_settings.prevent){$(ajax.element).bind(element_settings.prevent,false);}};/***处理按键。**如果有指示,Ajax对象将绑定到按键响应。这个*将测试按键是否有效触发此事件,以及*如果是,请为我们触发它,并防止触发其他按键。*在本例中,我们处理RETURN和SPACEBAR键(事件代码13*和32。RETURN通常用于在文本字段中提交表单,并且*SPACE通常用于在不提交的情况下激活元素。*/Drupal.ajax.prototype.keypressResponse=函数(元素,事件){//为此创建同义词以减少代码混淆。var ajax=这个;//检测回车键和空格键,并允许它们的标准响应,//“text”和“textarea”类型的表单元素除外,其中//如果#ajax['keypress']是//真的。在文本型小部件上,空格应该始终是空格。if(event.which==13 | |(event.hich==32&&element.type!='text'&&element.type;='textarea')){$(ajax.element_settings.element).trigger(ajax.element_setments.event);返回false;}};/***处理触发Ajax响应的事件。**当触发Ajax响应的事件发生时,此方法将*执行实际的Ajax调用。它使用绑定到事件*bind(),它使用在*ajax对象。*/Drupal.ajax.prototype.eventResponse=函数(元素,事件){//为此创建同义词以减少代码混淆。var ajax=这个;//如果已经在执行另一个ajax命令,则不要执行该命令。if(ajax.ajaxing){返回false;}尝试{if(ajax.form){//如果设置了setClick,我们必须设置它以确保按钮//值。if(ajax.setClick){//标记单击的按钮。”form.clk是//ajaxSubmit,告诉系统点击了哪个元素//触发提交。没有它就不会有“行动”或//等效。element.form.clk=元素;}ajax.form.ajaxSubmit(ajax.options);}其他{ajax.beforeSerialize(ajax.element,ajax.options);$.ajax(ajax.options);}}捕获(e){//在此处取消设置ajax.ajaxing标志,因为在//完整的响应。ajax.ajaxing=假;警报(“尝试处理”+ajax.options.url+“时出错:”+e.message);}//对于单选/复选框,允许默认事件。在IE上,这意味着让//它实际上选中了复选框。if(typeof element.type!=“undefined”&&(element.type==“checkbox”||element.ttype==“radio”)){返回true;}其他{返回false;}};/***表单序列化的处理程序。**在beforeSend()处理程序之前运行(见下文),与该处理程序不同,运行*在收集现场数据之前。*/Drupal.ajax.prototype.beforeSerialize=函数(元素,选项){//允许分离行为在收集字段值之前更新字段值。//只有在将字段值添加到POST数据中时才需要这样做,因此只有//当存在这样的表单时,使用this.form.ajaxSubmit()代替//$.ajax()。当没有表单并且使用$.ajax()时,beforeSerialize()//不调用,但不要依赖于此:显式检查this.form。if(本表格){var settings=this.settings | | Drupal.settings;Drupal.dettachBehaviors(this.form,settings,'serialize');}//防止在返回的标记中出现重复的HTML ID。//@参见drupal_html_id()options.data['ajax_html_ids[]']=[];$(“[id]”).each(函数(){options.data['ajax_html_ids[]'].push(this.id);});//允许Drupal返回要加载的新JavaScript和CSS文件,而无需//返回已经加载的。//@参见ajax_base_page_theme()//@参见drupal_get_css()//@参见drupal_get_js()options.data['ajax_page_state[theme]']=Drupal.settings.ajaxPageState.theme;options.data[ajax_page_state[theme_token]']=Drupal.settings.ajaxPageState.theme_token;for(Drupal.settings.ajaxPageState.css中的var键){options.data['ajax_page_state[css]['+key+']']=1;}for(Drupal.settings.ajaxPageState.js中的var键){options.data['ajax_page_state[js]['+key+']']=1;}};/***在提交表单之前修改表单值。*/Drupal.ajax.prototype.beforeSubmit=函数(form_values,element,options){//此函数留空,以便为模块重写//希望在此处添加功能的。};/***在发送Ajax请求之前,请做好准备。*/Drupal.ajax.prototype.beforeSend=函数(xmlhttprequest,选项){//对于没有文件输入的表单,jQuery表单插件序列化表单//值,然后调用jQuery的$.ajax()函数,该函数调用//处理程序。在这种情况下,永远不会使用options.extraData。对于表单//对于文件输入,jQuery表单插件使用浏览器的正常表单//提交机制,但在隐藏的IFRAME中捕获响应。在这个//在这种情况下,它首先调用此处理程序,然后附加隐藏字段//提交options.extraData中的值。没有简单的//了解将使用哪个提交机制的方法,所以我们添加到extraData//不管怎样,并允许在前一种情况下忽略它。if(本表格){options.extraData=选项.extraData|{};//让服务器知道何时使用IFRAME提交机制。这个//服务器可以使用此信息将JSON响应包装在TEXTAREA中,//根据http://jquery.malsup.com/form/#文件-上传。options.extraData.ajax_iframe_upload=“1”;//触发元素即将被禁用(参见下文),但如果//包含值(例如,复选框、文本字段、选择等),确保//值包含在提交中。如上所述,使用//$.ajax()在禁用元素之前已经序列化,因此//这仅适用于IFRAME提交。var v=$.fieldValue(this.element);如果(v!==null){options.extraData[this.element.name]=v;}}//禁用接收更改的元素以阻止用户界面//Ajax请求进行时进行交互。ajax.ajaxing防止//元素不会触发新请求,但不会阻止用户//改变其值。$(this.element).addClass('progress-disabled').attr('disabled',true);//插入进度条或throbber。if(this.progress.type=='bar'){var progressBar=新Drupal.progressBar('ajax-progress-'+this.element.id,eval(this.progress.update_callback),this.prograss.method,eval[this.process.error_callback]);if(this.progress.message){progressBar.setProgress(-1,this.progress.message);}if(this.progress.url){progressBar.startMonitoring(this.progress.url,this.propress.interval||1500);}this.progress.element=$(progressBar.element).addClass('ajax-progress-ajax-prograss-bar');this.progress.object=进度栏;$(this.element).after(this.progress.element);}else if(this.progress.type==“throbber”){this.progress.element=$('
 
');if(this.progress.message){$('.throber',this.progress.element).after('
'+this.progress.message+'
');}$(this.element).after(this.progress.element);}};/***表单重定向完成的处理程序。*/Drupal.ajax.prototype.success=函数(响应,状态){//删除进度元素。if(this.progress.element){$(this.progress.element).remove();}if(this.progress.object){this.progress.object.stopMonitoring();}$(this.element).removeClass('进程禁用').removeAttr('禁用');Drupal.冻结高度();for(响应中的var i){if(response[i]['command']&&this.commands[response[i]['command']]){this.commands[响应[i][命令]](this,响应[i],状态);}}//如果在beforeSerialize()中分离了行为,请重新附加这些行为。这个//attachBehaviors()在处理响应时调用了新内容//命令是不够的,因为整个表单中的行为需要//需要重新连接。if(本表格){var settings=this.settings | | Drupal.settings;Drupal.attachBehaviors(this.form,settings);}Drupal.unfreezeHeight();//删除所有特定于响应的设置,以便它们不会在下次使用//打错电话了。this.settings=空;};/***构建一个效果对象,告诉我们如何在添加新HTML时应用效果。*/Drupal.ajax.prototype.getEffect=功能(响应){var类型=response.effect | this.effect;var速度=response.speed | this.speed;var效应={};if(类型==“无”){effect.showEffect=“show”;effect.hideEffect=“隐藏”;effect.showSpeed=“”;}else if(type==“淡出”){effect.showEffect='fadeIn';effect.hideEffect=“淡出”;effect.showSpeed=速度;}其他{effect.showEffect=type+'切换';effect.hideEffect=类型+“切换”;effect.showSpeed=速度;}回报效应;};/***表单重定向错误的处理程序。*/Drupal.ajax.prototype.error=函数(响应,uri){警报(Drupal.ajaxError(响应,uri));//删除进度元素。if(this.progress.element){$(this.progress.element).remove();}if(this.progress.object){this.progress.object.stopMonitoring();}//撤消隐藏。$(this.wrapper).show();//重新启用元素。$(this.element).removeClass('进程禁用').removeAttr('禁用');//如果在beforeSerialize()中分离了行为,则重新附加这些行为。if(本表格){var settings=响应设置||this.settings||Drupal.settings;Drupal.attachBehaviors(this.form,settings);}};/***提供服务器可以请求客户端执行的一系列命令。*/Drupal.ajax.prototype.commands={/***命令将新内容插入DOM。*/插入:功能(ajax、响应、状态){//从响应中获取信息。如果不存在,则默认为//我们的预设。var-wrapper=response.selector$(response.selector):$(ajax.wrapper);var方法=response.method | | ajax.method;var effect=ajax.getEffect(响应);//我们不知道response.data包含什么:它可能是一个文本字符串//没有HTML,所以不要正确依赖jQuery进行iterpreting//$(response.data)作为新的HTML而不是CSS选择器。此外,如果//response.data包含顶级文本节点,它们会丢失//$(response.data)或$('
').replaceWith(response.data)。var new_content_wrapped=$('
').html(response.data);var new_content=new_content_wrapped.contents();//由于遗留的原因,效果处理代码假定new_content//由单个顶级元素组成。此外,它还没有//充分测试attachBehaviors()是否可以成功调用//包含顶级文本节点的上下文对象。然而,到//让开发人员完全控制页面中出现的HTML//允许在没有DIV元素的地方插入Ajax内容//允许(例如,在TABLE、TR和SPAN父项中),我们检查新的//内容满足单个顶级元素的要求,并且//只有在不使用上面创建的容器DIV时才使用它。有关更多信息//信息,请参阅http://drupal.org/node/736066。if(new_content.length!=1|| new_content.get(0).nodeType!=1) {new_content=新内容包装;}//如果从包装器中删除内容,请首先分离行为。开关(方法){案例“html”:case“replaceWith”:case“replaceAll”:case“空”:案例“删除”:var settings=响应设置||ajax.settings||Drupal.settings;Drupal.deachBehaviors(包装器、设置);}//将新内容添加到页面。包装器[方法](new_content);//如果我们使用任何效果,请立即隐藏新内容。if(effect.showEffect!='show'){new_content.hide();}//确定要使用的效果以及将收到的内容//效果,然后显示新内容。if($('.ajax-new-content',new_content).length>0){$('.ajax-new-content',new_content).hide();new_content.show();$('.ajax-new-content',new_content)[effect.showEffect](effect.showSpeed);}else if(effect.showEffect!=“show”){new_content[effect.showEffect](effect.showSpeed);}//如果成功,将所有JavaScript行为附加到新内容//添加到页面中,这个if语句允许ajax['wrapper']//可选。if(new_content.parents('html').length>0){//如果可用,从返回的JSON应用任何设置。var settings=响应设置||ajax.settings||Drupal.settings;Drupal.attachBehaviors(new_content,settings);}},/***命令从页面中删除块。*/删除:功能(ajax、响应、状态){var settings=响应设置||ajax.settings||Drupal.settings;detachBehaviors($(response.selector),settings);$(response.selector).remove();},/***标记块更改的命令。*/更改:功能(ajax、响应、状态){if(!$(response.selector).hasClass('ajax-changed')){$(response.selector).addClass('jax-changed');if(回复.星号){$(response.selector).find(respones.asterisk).append('*');}}},/***命令以提供警报。*/警报:功能(ajax、响应、状态){警报(response.text,response.title);},/***提供jQuery css()函数的命令。*/css:功能(ajax、响应、状态){$(response.selector).css(respond.argument);},/***命令设置将用于此响应中其他命令的设置。*/设置:功能(ajax、响应、状态){if(response.merge){$.extend(true、Drupal.settings、response.settings);}其他{ajax.settings=响应设置;}},/***使用jQuery的数据API附加数据的命令。*/数据:功能(ajax、响应、状态){$(响应选择器).data(响应名称,响应值);},/***命令应用jQuery方法。*/调用:函数(ajax、响应、状态){var$element=$(response.selector);$element[response.method].apply($element,response.arguments);},/***命令重新排列表格。*/restipe:函数(ajax、响应、状态){//:偶数和:奇数颠倒,因为jQuery从0和//我们从1开始计数,所以我们不同步。//匹配父元素的直接子元素以允许嵌套。$('>tbody>tr:visible,>tr:可见',$(response.selector)).removeClass(“偶数加法”).filter(':even').addClass('add').end().filter(“:odd”).addClass(“even”);}};})(jQuery);