Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有$getJSON的jQuery插件返回未定义?_Javascript_Jquery_Json_Jquery Plugins_Undefined - Fatal编程技术网

Javascript 带有$getJSON的jQuery插件返回未定义?

Javascript 带有$getJSON的jQuery插件返回未定义?,javascript,jquery,json,jquery-plugins,undefined,Javascript,Jquery,Json,Jquery Plugins,Undefined,在我制作的jQuery插件中,我有: $.getJSON(base_url,{ agenda_id:defaults.id, action:defaults.action+defaults.type, output:defaults.output },function(json){ return json; }); 在一个单独的JS文件中(是的,它位于插件之后): 如果我执行上面的$.getJSON并在$.getJSON中放置一个警报,它将工作并返回“3”,这是

在我制作的jQuery插件中,我有:

$.getJSON(base_url,{
    agenda_id:defaults.id,
    action:defaults.action+defaults.type,
    output:defaults.output
},function(json){
    return json;
});
在一个单独的JS文件中(是的,它位于插件之后):

如果我执行上面的$.getJSON并在$.getJSON中放置一个警报,它将工作并返回“3”,这是正确的。如果我像
json=$(“#议程实时预览”).agenda(…)…
那样操作,它将返回undefined


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

因为AJAX请求默认是异步的,所以在收到AJAX请求之前,
警报()
正在运行,因此,
json
变量没有被赋值

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

或者,您可以将函数作为参数传递给插件,并让
$.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-Sure。不知道你的插件是如何构造的,但我会用一个简单的例子更新我的答案。太棒了!非常感谢你。我从来不知道如何进行回调,这非常有效!事实上一个小问题。。。在回调中使用$(this)时,如何返回所使用的选择器,即agenda live preview,而不是JSON/XML/HTML?e、 成功推杆的内部:警报($(this.attr('id'));应该说'agenda live preview',而不是3?@Oscar-我不太熟悉javascript的
.call()
方法,但在插件中尝试调用回调:
defaults.success.call(这是json)然后您应该能够执行
警报($(this).selector)我很确定这是对的。我更新了我的答案。让我知道进展如何。
$.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 );
    }
});