首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自己的回调在jQuery中,不能调用分段回调函数

自己的回调在jQuery中,不能调用分段回调函数
EN

Stack Overflow用户
提问于 2015-10-15 08:05:13
回答 1查看 34关注 0票数 0

我已经为jQuery创建了一个插件,现在我在这个插件中发现了一个问题,当我使用它的to或更多次时,我的回调函数每次只使用最后一个回调函数,我所有的ajax调用都是作为它的关闭做的,这是非常完美的。

现在,当我想调用一个成功的回调函数或错误回调函数时,我遇到了问题。

代码语言:javascript
复制
(function ( $ ) {
var setSettings = function(options,attrId) {
    var settings = $.extend({
        dataType: 'json',
        timeout: 600,
        alertToolbar: true,
        alertId : attrId,
        alertClass : 'dialogToolbar',
        callback_error : null,
        callback_success : null
    }, options );

    return settings;
}

var getToolbar = function(header, content, mode) {
    if ( mode == 'error' )
    {
        $( document.createElement('div') )
        .addClass('alertTopNav alertTopNav-error')
        .append(
            $( document.createElement('div') )
            .append(
                $( document.createElement('strong') )
                .html( header )
            )
            .append(
                $( document.createElement('br') )
            )
            .append( content )
        )
        .appendTo('#'+ settings.alertId )
        .slideDown()
        .delay(3000)
        .slideUp(800, function()
        {
            $(this).remove();
        });
    }
    else if ( mode == 'success' )
    {
        $( document.createElement('div') )
        .addClass('alertTopNav alertTopNav-success')
        .append(
            $( document.createElement('div') )
            .append(
                $( document.createElement('strong') )
                .html( header )
            )
            .append(
                $( document.createElement('br') )
            )
            .append( content )
        )
        .appendTo('#'+ settings.alertId )
        .slideDown()
        .delay(3000)
        .slideUp(800, function()
        {
            $(this).remove();
        });
    }
}
var functionId = 0;

$.fn.ajax_callback = function(call_url, call_data_array,call_settings) {
    settings = setSettings(call_settings,$(this).attr('id'));

    if (!$(this).hasClass("dialogToolbar")) {
        $(this).addClass('dialogToolbar');
    }

    $.ajax({
        type: 'POST',
        url: call_url,
        crossDomain: true,
        xhrFields: {withCredentials: true},
        data: call_data_array,
        dataType: settings.dataType,
        timeout: settings.timeout,
        beforeSend: function(data) {
            // do somthing before sending
        },
        success: function(data) {
            if(data.status==200) {
                if ( settings.callback_success != null ) {
                    settings.callback_success(data);
                }

                if (settings.alertToolbar == true ) {
                    getToolbar(data.success.header,data.success.msg,'success');
                }
            } else {

                if(settings.callback_error != null) {
                    settings.callback_error(data);
                }

                if (settings.alertToolbar == true ) {
                    getToolbar(data.error.header,data.error.msg,'error');
                }
            }
        },
        error: function(jqXHR, textStatus, errorThrown) {
            // do somthing on error
        }
    });
}

}( jQuery ));

我使用这段代码来调用这个插件:

代码语言:javascript
复制
$('#dialogToolbar').ajax_callback('json-path-1',{
    'parms' : 'value'
}, {
    alertToolbar: false,
    callback_success: $.testObj.callback.getAll.success,
    callback_error: $.testObj.callback.getAll.error
});

如果我再使用这一次,但更改成功和错误回调和json路径ofc。

代码语言:javascript
复制
$('#dialogToolbar').ajax_callback('json-path-2',{
    'parms' : 'value'
}, {
    alertToolbar: false,
    callback_success: $.testObj.callback.getAllSecound.success,
    callback_error: $.testObj.callback.getAllSecound.error
});

只有塞克函数的成功和错误回调才会产生效果,所以现在我试着调试我的代码,但找不到上帝解释为什么会发生这种情况。

希望这里有一个,可以解释我的问题,以及为什么我的插件不起作用的关闭。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-15 08:07:42

您已经将设置创建为插件中的全局变量,因此每次对插件的调用都会覆盖它。

代码语言:javascript
复制
var settings = setSettings(call_settings,$(this).attr('id'));

相反,您需要有对当前设置对象的本地引用,因此按照上面给出的函数创建变量为本地变量。

此外,还必须将设置引用传递给getToolbar

代码语言:javascript
复制
var getToolbar = function(settings, header, content, mode) {
}
.....
getToolbar(settings, data.success.header,data.success.msg,'success');
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33143111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档