(This is not very jQuery-like)
function longUrl( elem ) { var href = elem.attr( "href" ), api = "http://www.longurlplease.com/api/v1.1?callback=?"; // Fetch JSON data. jQuery.getJSON( api, { q: href }, function(data){ if ( data[ href ] ) { // Update the element's title attribute. elem.attr( "title", data[ href ] ); } }); }; // This is no fun! longUrl( $("a") ); // Wouldn't you much rather do this? $("a").longUrl();
(Implicit iteration, chaining, amazing!)
jQuery.fn.longUrl = function() { return this.each(function(){ var elem = jQuery(this), href = elem.attr( "href" ), api = "http://www.longurlplease.com/api/v1.1?callback=?"; // Fetch JSON data. jQuery.getJSON( api, { q: href }, function(data){ if ( data[ href ] ) { // If the data is valid, update the element's title attribute. elem.attr( "title", data[ href ] ); } }); }); }; // So much better! $("a").longUrl().addClass( "yay-i-am-totally-chainable" );
(Don't over-optimize, just optimize)
// Store fetched long URLs here. var cache = {}; jQuery.fn.longUrl = function() { return this.each(function(){ var elem = jQuery(this), href = elem.attr( "href" ), api = "http://www.longurlplease.com/api/v1.1?callback=?"; if ( cache[ href ] ) { // URL exists in cache, so use it. elem.attr( "title", cache[ href ] ); } else { // Fetch JSON data. jQuery.getJSON( api, { q: href }, function(data){ if ( data[ href ] ) { // If the data is valid, update the cache. cache[ href ] = data[ href ]; // Update the element's title attribute. elem.attr( "title", cache[ href ] ); } }); } }); };
(Less global vars == less compatibility headaches)
(function($){ // Store fetched long URLs here. var cache = {}; $.fn.longUrl = function() { return this.each(function(){ var elem = $(this), href = elem.attr( "href" ), api = "http://www.longurlplease.com/api/v1.1?callback=?"; if ( cache[ href ] ) { // URL exists in cache, so use it. elem.attr( "title", cache[ href ] ); } else { // Fetch JSON data. $.getJSON( api, { q: href }, function(data){ if ( data[ href ] ) { // If the data is valid, update the cache. cache[ href ] = data[ href ]; // Update the element's title attribute. elem.attr( "title", cache[ href ] ); } }); } }); }; })(jQuery);
(Why write something twice, when you can write it once?)
(function($){ // Store fetched long URLs here. var cache = {}; $.fn.longUrl = function() { return this.each(function(){ var elem = $(this), href = elem.attr( "href" ), api = "http://www.longurlplease.com/api/v1.1?callback=?"; // Lengthen the element's URL. function lengthen( url ) { elem.attr( "title", url ); }; if ( cache[ href ] ) { // URL exists in cache, so use it. lengthen( cache[ href ] ); } else { // Fetch JSON data. $.getJSON( api, { q: href }, function(data){ if ( data[ href ] ) { // If the data is valid, update the cache. cache[ href ] = data[ href ]; // Update the element's title attribute. lengthen( cache[ href ] ); } }); } }); }; })(jQuery);
(Sensible parameterization == less editing, down the road)
(function($){ // Store fetched long URLs here. var cache = {}; $.fn.longUrl = function( attr ) { return this.each(function(){ var elem = $(this), url = elem.attr( attr || "href" ), api = "http://www.longurlplease.com/api/v1.1?callback=?"; // Lengthen the element's URL. function lengthen( url ) { elem.attr( "title", url ); }; if ( cache[ url ] ) { // URL exists in cache, so use it. lengthen( cache[ url ] ); } else { // Fetch JSON data. $.getJSON( api, { q: url }, function(data){ if ( data[ url ] ) { // If the data is valid, update the cache. cache[ url ] = data[ url ]; // Update the element's title attribute. lengthen( cache[ url ] ); } }); } }); }; })(jQuery);
(There must be a better way than this)
(function($){ // Store fetched long URLs here. var cache = {}; $.fn.longUrl = function( attr, lengthen ) { // If only one argument is passed, and that argument is a function, // it must be `lengthen, so `attr` must have been omitted. if ( $.isFunction( attr ) ) { lengthen = attr; attr = null; } // If lengthen is not set, use a default function. lengthen = lengthen || function( elem, url ) { elem.attr( "title", url ); }; return this.each(function(){ var elem = $(this), url = elem.attr( attr || "href" ), api = "http://www.longurlplease.com/api/v1.1?callback=?"; if ( cache[ url ] ) { // URL exists in cache, so use it. lengthen( elem, cache[ url ] ); } else { // Fetch JSON data. $.getJSON( api, { q: url }, function(data){ if ( data[ url ] ) { // If the data is valid, update the cache. cache[ url ] = data[ url ]; // Update the element's title attribute. lengthen( elem, cache[ url ] ); } }); } }); }; })(jQuery);
(This is the better way)
(function($){ // Store fetched long URLs here. var cache = {}; $.fn.longUrl = function( options ) { // Some sensible defaults. var defaults = { attr: "href", lengthen: function( elem, url ) { elem.attr( "title", url ); } }; // Override defaults with specified options. options = $.extend( {}, defaults, options ); return this.each(function(){ var elem = $(this), url = elem.attr( options.attr ), api = "http://www.longurlplease.com/api/v1.1?callback=?"; if ( cache[ url ] ) { // URL exists in cache, so use it. options.lengthen( elem, cache[ url ] ); } else { // Fetch JSON data. $.getJSON( api, { q: url }, function(data){ if ( data[ url ] ) { // If the data is valid, update the cache. cache[ url ] = data[ url ]; // Update the element's title attribute. options.lengthen( elem, cache[ url ] ); } }); } }); }; })(jQuery);
(Options can be overriden both globally and per-call)
(function($){ // Store fetched long URLs here. var cache = {}; $.fn.longUrl = function( options ) { // Override defaults with specified options. options = $.extend( {}, $.fn.longUrl.options, options ); return this.each(function(){ var elem = $(this), url = elem.attr( options.attr ), api = "http://www.longurlplease.com/api/v1.1?callback=?"; if ( cache[ url ] ) { // URL exists in cache, so use it. options.lengthen( elem, cache[ url ] ); } else { // Fetch JSON data. $.getJSON( api, { q: url }, function(data){ if ( data[ url ] ) { // If the data is valid, update the cache. cache[ url ] = data[ url ]; // Update the element's title attribute. options.lengthen( elem, cache[ url ] ); } }); } }); }; // Some sensible defaults. $.fn.longUrl.options = { attr: "href", lengthen: function( elem, url ) { elem.attr( "title", url ); } }; })(jQuery);
(How can the lengthen callback be improved?)
(function($){ // Store fetched long URLs here. var cache = {}; $.fn.longUrl = function( options ) { // Override defaults with specified options. options = $.extend( {}, $.fn.longUrl.options, options ); return this.each(function(){ var that = this, url = $(this).attr( options.attr ), api = "http://www.longurlplease.com/api/v1.1?callback=?"; if ( cache[ url ] ) { // URL exists in cache, so use it. options.lengthen.call( that, cache[ url ] ); } else { // Fetch JSON data. $.getJSON( api, { q: url }, function(data){ if ( data[ url ] ) { // If the data is valid, update the cache. cache[ url ] = data[ url ]; // Update the element's title attribute. options.lengthen.call( that, cache[ url ] ); } }); } }); }; // Some sensible defaults. $.fn.longUrl.options = { attr: "href", lengthen: function( url ) { $(this).attr( "title", url ); } }; })(jQuery);
(The only thing left out is $.kitchenSink
)
(function($){ // Store fetched long URLs here. var cache = {}; $.longUrl = function( url, callback ) { var api = "http://www.longurlplease.com/api/v1.1?callback=?"; if ( cache[ url ] ) { // URL exists in cache, so use it. callback( cache[ url ] ); } else { // Fetch JSON data. $.getJSON( api, { q: url }, function(data){ if ( data[ url ] ) { // If the data is valid, update the cache. cache[ url ] = data[ url ]; // Call `callback` for this element + long url. callback( cache[ url ] ); } }); } } $.fn.longUrl = function( options ) { // Override defaults with specified options. options = $.extend( {}, $.fn.longUrl.options, options ); return this.each(function(){ var that = this, url = $(this).attr( options.attr ); // Fetch long URL and call `lengthen` when done. $.longUrl( url, function( long_url ){ options.lengthen.call( that, long_url ); }); }); }; // Some sensible defaults. $.fn.longUrl.options = { attr: "href", lengthen: function( url ) { $(this).attr( "title", url ); } }; })(jQuery);
$.extend()
and an options object