我创建了一个抓取JSON提要(本例中为YouTube)的jQuery插件。然后它将结果显示在DIV中 - 一切正常,直到:我想在两个或多个容器中显示结果(使用不同设置:即更多视频,其他频道) - 我如何实现这一点?带AJAX的jQuery:多输出
btw ...这是我的问题的正确标题?我远远不是一个jQuery/JS专家:)
这里是我到目前为止的代码 - 我把它缩短到基本动作和一个基本的输出:
(function($){
// Default settings
var settings = {
author: 'ARD',
results: 3
};
// Append to Container
var append_to_container;
// The Methods
var methods = {
// Initate
init: function(options){
append_to_container = $(this);
$.extend(settings, options);
methods.grabFeed();
},
// Grab feed
grabFeed: function(){
$.ajax({
url: 'http://gdata.youtube.com/feeds/api/videos',
data: {
author: settings.author,
v: '2',
alt: 'jsonc',
'max-results': settings.results
},
dataType: 'jsonp',
success: function(data){
methods.gotResults(data);
}
});
},
// Placeholder for results
gotResults: function(data){
console.log(data);
$("<h1>Success!</h1>").appendTo(append_to_container);
}
};
$.fn.youtubeVideos = function(method){
// Method calling logic
if (methods[method]) {
return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || ! method) {
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery.youtubeVideos');
}
}
})(jQuery);
现在,当我打电话$('#main').youtubeVideos();
它按预期工作。
但现在我想在多个DOM元素中显示结果。所以当我打电话举例:
$('#main').youtubeVideos();
$('#same_videos').youtubeVideos();
它显示成功!消息在第二次调用中使用的容器中两次。
我试着用stackoveflow和web的几个答案 - 但我找不到一种方法来使用我的函数不止一次。 如何在多个容器上多次使用我的插件?
编辑/解决方案
这里是Codemonkey尖端后,我的解决方案:
(function($){
$.fn.youtubeVideos = function(method){
// Default settings
var settings = {
author: 'ARD',
results: 3
};
// Append to Container
var append_to_container;
// The Methods
var methods = {
// Initate
init: function(options){
append_to_container = $(this);
$.extend(settings, options);
methods.grabFeed();
},
// Grab feed
grabFeed: function(){
$.ajax({
url: 'http://gdata.youtube.com/feeds/api/videos',
data: {
author: settings.author,
v: '2',
alt: 'jsonc',
'max-results': settings.results
},
dataType: 'jsonp',
success: function(data){
methods.gotResults(data);
}
});
},
// Placeholder for results
gotResults: function(data){
console.log(data);
$("<h1>Success!</h1>").appendTo(append_to_container);
}
};
// Method calling logic
if (methods[method]) {
return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || ! method) {
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery.youtubeVideos');
}
}
})(jQuery);
$('#main').youtubeVideos();
$('#same_videos').youtubeVideos();
因此,没有办法将封装的方法保留在主函数之外?这对结构没有好处:/ – 2012-01-31 16:03:16
这不是不可能**,但它确实是最简单的方法。我不明白为什么它是一个问题。这将是'grabFeed:function(){...'到'function grabFeed(){...'或甚至'var grabFeed = function(){...'的简单重写,并将它们移动到您的插件中功能。如果你愿意,你甚至可以把整个方法对象移动到那里。所有这一切意味着你将不得不使用一个额外的缩进 – Hubro 2012-01-31 16:18:23
arghs - got'ya :)只需要第二次尝试!谢谢! – 2012-01-31 16:36:04