【问题标题】:jQuery Plugin with $.getJSON Returning undefined?带有 $.getJSON 的 jQuery 插件返回未定义?
【发布时间】:2010-06-15 17:16:22
【问题描述】:

在我制作的 jQuery 插件内部:

$.getJSON(base_url,{
    agenda_id:defaults.id,
    action:defaults.action+defaults.type,
    output:defaults.output
},function(json){
    return json;
});

在一个单独的 JS 文件中(是​​的,它在插件之后):

json = $('#agenda-live-preview').agenda({action:'get',type:'agenda',output:'json'});
alert(json[0].agenda_id);

如果我执行上述 $.getJSON 并在 $.getJSON 中放置一个警报,它会起作用并返回“3”,这是正确的。如果我像 json=$('#agenda-live-preview').agenda(...)... 那样做,它会返回 undefined。

我的 JSON 是有效的,并且 json[0].agenda_id 也是正确的,我知道它在回调中,那么如何在函数返回中获取回调中的内容?

【问题讨论】:

    标签: javascript jquery json jquery-plugins undefined


    【解决方案1】:

    因为 AJAX 请求默认是异步的,alert() 在收到 AJAX 请求之前就已经运行,因此 json 变量没有被赋值。

    您想要的任何功能(例如警报)都需要在 AJAX 请求的回调中,或者需要在从回调中调用的函数中,或者可能使用 .ajaxSuccess() 调用。

    或者您可以将函数作为参数传递给您的插件,并让$.getJSON() 回调调用它。


    编辑:

    $.getJSON() 请求成功时传递回调以运行的示例:

    $.fn.agenda = function(opts) {
    
        var defaults = {...} // your defaults
    
        $.extend(defaults, opts); // Extend your defaults with the opts received
    
        $.getJSON(base_url,{
            agenda_id:defaults.id,
            action:defaults.action+defaults.type,
            output:defaults.output
        },function(json){
            defaults.success.call(this,json);  // Call the 'success' method passing in the json received
        });
    };
    
    $('#agenda-live-preview').agenda({
        action:'get',
        type:'agenda',
        output:'json',
        success:function(data) {  // Pass a function to the plugin's 'success' property
            alert(data[0].agenda_id);
            alert( $(this).selector );
        }
    });
    

    【讨论】:

    • 是的,我知道这是异步的,我只是想不出这样做。你能给我举个例子,说明你在传递函数时的最后一个建议吗?
    • @Oscar - 当然。不确定您的插件的结构,但我会用一个简单的例子来更新我的答案。
    • 太棒了!太感谢了。我从来不知道怎么做回调,效果很好!
    • 其实……一个小问题……在回调中使用 $(this) 时,如何返回使用的选择器,议程实时预览而不是 JSON/XML/HTML?例如在成功的内部: alert($(this).attr('id'));应该说“议程现场预览”,而不是 3?
    • @Oscar - 我对javascript的.call()方法不是很熟悉,但是在插件中尝试这个来调用回调:defaults.success.call(this,json);然后你应该可以做到alert( $(this).selector );我'我很确定这是对的。我更新了我的答案。告诉我进展如何。
    猜你喜欢
    • 2010-11-29
    • 2020-06-30
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多