麻烦将jQuery脚本转换为插件
我正在尝试转换一个非常简单的脚本,该脚本从Twitter获取搜索结果并将其输出到无序列表中。 这是我第一次尝试编写一个插件,当我调用它时似乎没有触发所有代码。 脚本由iteself工作正常,这是我为插件编写的代码:
(function($) { $.fn.tweetGet = function(options) { var defaults = { query: 'from:twitter&rpp=10', url: 'http://search.twitter.com/search.json?callback=?&q=' }; var options = $.extend(defaults, options); return this.each(function() { // Get tweets from user query $.getJSON(options.url + options.query, function(data) { var tweets = []; $.each(data.results, function(i, tweet) { tweets.push('' + tweet.text.parseURL().parseUsername().parseHashtag() + ' '); }); $('#target').append('' + tweets.join('') + '
'); }); // Parse tweets for URLs and convert to links String.prototype.parseURL = function() { return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&~\?\/.=]+/g, function(url) { return url.link(url); }); }; // Parse tweets for twitter usernames and convert to links String.prototype.parseUsername = function() { return this.replace(/(?:^|\s)@[a-zA-Z0-9_.-]+\b/, function(user) { var username = user.replace("@","") return user.link("http://twitter.com/"+username); }); }; // Parse tweets for hashtags and convert to links String.prototype.parseHashtag = function() { return this.replace(/[#]+[A-Za-z0-9-_]+/g, function(hash) { var hashtag = hash.replace("#","%23") return hash.link("http://search.twitter.com/search?q="+hashtag); }); }; }); }; })(jQuery);
该函数被调用:
$('#target').tweetGet({query: 'from:twitter&rpp:10'});
除了返回this.each(function(){}之外的所有内容都正常工作,但是没有任何内容可以解雇或给我任何错误。我读过的所有教程似乎都使用了相同的基本格式,但我似乎无法理解弄清楚我做错了什么……
这是一个工作版本: http : //jsfiddle.net/JAAulde/QK35D/3/
( function( global ) { var String, $; if( global.jQuery ) { String = global.String; $ = window.jQuery; String.prototype = $.extend( String.prototype, { // Parse tweets for URLs and convert to links parseURL: function() { return this.replace( /[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&~\?\/.=]+/g, function( url ) { return url.link( url ); } ); }, // Parse tweets for twitter usernames and convert to links parseUsername: function() { return this.replace( /@[a-zA-Z0-9_.-]+\b/g, function( user ) { return user.link( 'http://twitter.com/' + user.replace( '@', '' ) ); } ); }, // Parse tweets for hashtags and convert to links parseHashtag: function() { return this.replace( /[#]+[A-Za-z0-9-_]+/g, function( hash ) { return hash.link( 'http://search.twitter.com/search?q=' + hash.replace( '#', '%23' ) ); } ); } } ); $.fn.tweetGet = function( options ) { var defaults = { query: 'from:twitter&rpp=10', url: 'http://search.twitter.com/search.json?callback=?&q=' }; options = $.extend( defaults, options ); return this.each( function() { var target = this; // Get tweets from user query $.getJSON( options.url + options.query, function( data ) { var tweets = []; $.each( data.results, function( i, tweet ) { tweets.push( '' + tweet.text.parseURL().parseUsername().parseHashtag() + ' ' ); } ); $( target ).append( '' + tweets.join('') + '
' ); } ); } ); }; } }( window ) );
当我解释我的修改时,请观看此答案以获取更新。
编辑:
- 从插件中删除了字符串原型的所有修改 – 它们不应该存在,因为它们不是插件代码的一部分,并且它们将在每次调用插件时重新定义。
- 从插件中删除
#target
选择器,因为它专门针对一个元素,而不是使用调用该插件的集合(由于getJSON回调而调整范围)。 - 从
options = $.extend( defaults, options );
前面删除了var
声明options = $.extend( defaults, options );
因为它不需要,并且有可能擦除执行时传入插件的内容。 - 另外,修复了
parseUsername
函数以停止在用户名URL中的用户名前面添加空格 - 使用我首选的语法来本地化代码