如何将事件对象从函数传递给AJAX调用并在其成功处理程序中使用它?

时间:2012-05-20 09:14:52

标签: jquery ajax events jquery-mobile coldfusion

我有一个多语言的Jquery Mobile站点(Backend是Coldfusion8 / MySQL)。

我正在使用一个通用的Ajax-form-poster将数据“传递”到服务器,我在整个脚本中调用它传递相应的AJAX参数,如下所示:

我的一个 Ajax来电者

$(document).on( "pagebeforechange.lang", function( e, data ) {
    if (typeof data.toPage === "string") {
        if (data.toPage.indexOf("?sprachwechsel=") > -1) {
            // stop
            e.preventDefault();
            // get the language from clicked link
            var viewSwitch  = $.mobile.path.parseUrl( data.toPage ).hash.replace( /.*sprachwechsel=/, "" ),
               service = "services/form_service_user.cfc",
               method = "process",
               returnformat = "JSON",
               targetUrl = "",
               // fake a form
               formdata = "form_submitted=lang&viewSwitch="+viewSwitch+"&method="+method+"&returnformat="+returnformat,
               // create the success handler
               successHandler = function(e, data) {
                   data.options.reloadPage = true;    
                   data.options.allowSamePageTransition = true;
                   data.options.transition = "fade";
                   // reload page with new language
                   $.mobile.changePage( window.location.href, data.options);    
                   };
            // hand over to Ajax
            ajaxFormSubmit( form, service, formdata, targetUrl, successHandler );
            }
         } 
    });
};

所有来电者都会进入中央 AJAX表单提交,如下所示:

var ajaxFormSubmit = function ( form, service, formdata, targetUrl, successHandler ){
    $.ajax({
        async: false,
        type: "post",
        url: service,
        data: formdata,
        dataType: "json",
        success: function( objResponse ){
            if (objResponse.SUCCESS){
                alert("success");
                successHandler;
            } else { }
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) { 
        }
    });
}

我不是一直提交表单,而是尝试使用这种方式更新会话设置,例如要显示的语言。

我的问题:
如果我在pagebeforechange事件上捕获Jquery Mobile changePage,则使用preventDefault,执行AJAX调用并希望使用原始事件和数据对象从成功处理程序触发新的changePage转换... 如何通过他们通过成功处理程序

方面问题:这种方法是否可行,还是应该以更简单的方式完成?我需要重置视图和语言,我想保持应用程序运行,而不是一直硬重新加载页面,只是为了将单个coldfusion变量设置为“EN”到“DE”。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

除非我误解了您的问题,否则您的成功处理程序已经可以访问data对象和e事件对象,因为它已“关闭”该函数。唯一的问题是您将它们作为预期参数添加到成功处理函数中。将它们带走,您将可以访问从ajax调用返回的数据以及这两个其他变量。像这样......

$(document).on( "pagebeforechange.lang", function( e, data ) {
    if (typeof data.toPage === "string") {
        if (data.toPage.indexOf("?sprachwechsel=") > -1) {
            // stop
            e.preventDefault();
            // get the language from clicked link
            var viewSwitch  = $.mobile.path.parseUrl( data.toPage ).hash.replace( /.*sprachwechsel=/, "" ),
               service = "services/form_service_user.cfc",
               method = "process",
               returnformat = "JSON",
               targetUrl = "",
               // fake a form
               formdata = "form_submitted=lang&viewSwitch="+viewSwitch+"&method="+method+"&returnformat="+returnformat,
               // create the success handler
               successHandler = function(response) { // response is data from server
                   data.options.reloadPage = true; // data is from outer function
                   data.options.allowSamePageTransition = true;
                   data.options.transition = "fade";
                   // reload page with new language
                   $.mobile.changePage( window.location.href, data.options);    
                   };
            // hand over to Ajax
            ajaxFormSubmit( form, service, formdata, targetUrl, successHandler );
            }
         } 
    });
};

现在您可以将处理函数传递给ajax调用。

var ajaxFormSubmit = function ( form, service, formdata, targetUrl, successHandler ){
    $.ajax({
        async: false,
        type: "post",
        url: service,
        data: formdata,
        dataType: "json",
        success: successHandler,
        error: function (XMLHttpRequest, textStatus, errorThrown) { 
        }
    });
}