我創建了一個抓取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