Javascript 带有$getJSON的jQuery插件返回未定义?
在我制作的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”,这是
$.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 );
}
});