jQuery plugin to catch image load errors and re-direct src urls. Allows for multiple fallback options.
Author: Dan Woodson
jQuery plugin to catch image load errors and re-direct src urls. Allows for multiple fallback options.
Author: Dan Woodson
<!DOCTYPE HTML> | |
<html> | |
<head> | |
<meta http-equiv="content-type" content="text/html; charset=utf-8"0> | |
<title>srcFailback example</title> | |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" type="text/javascript"></script> | |
<script src="jquery.srcFailback.js" type="text/javascript"></script> | |
<script type="text/javascript" charset="utf-8"> | |
$('document').ready(function(){ | |
$('img').srcFailback({ | |
sources: [ | |
{prepend: 'http://fc04.deviantart.net/fs21/i/2008/146/4/e/', | |
append: '.jpg' | |
} | |
] | |
}); | |
}); | |
</script> | |
</head> | |
<body> | |
<div id="content"> | |
<img id="img_0" src="http://i.imgur.com/YQ9sK.jpg" /> | |
<img id="img_1" src="http://imgur.com/gallery/Jungle_2_0_Wallpaper_by_moiret" /> | |
</div> | |
</body> | |
</html> |
/* | |
* jQuery srcFailback plugin | |
* Description: Alters an elements src attribute on error event | |
* Author: Dan Woodson | |
*/ | |
(function($){ | |
$.fn.srcFailback = function(options) { | |
// Set default options | |
var defaults = { | |
sources: [ | |
{ prepend: "testPre/", | |
append: "/testApp" | |
} | |
] | |
}; | |
options = $.extend(defaults, options); | |
// Setup regular expression to grab the end of the url and our class tags | |
var urlRe = new RegExp("([a-zA-Z0-9-_])+$"); | |
var classRe = new RegExp("src_load_error_"); | |
// Operate on objects | |
return this.each(function() { | |
// Get reference to current object | |
obj = $(this); | |
// Watch for errors loading | |
obj.error(function() { | |
// Make sure we haven't already tried all the sources | |
var new_length = options.sources.length-1; | |
if(!obj.hasClass('src_load_error_'+new_length)){ | |
// local vars | |
var prevAttempt = -1; | |
// See if we've tried any sources previously | |
var prevAttemptArr = (obj.attr('class') !== undefined?obj.attr('class').match(classRe):[false]); | |
if (prevAttemptArr !== null && prevAttemptArr[0]) { | |
prevAttemptArr = prevAttemptArr[0].split('_'); | |
prevAttempt = parseInt(prevAttemptArr[1], 10); | |
} | |
// Set current source index | |
curSourceIndex = prevAttempt + 1; | |
// Get desired section of url | |
var matchArr = obj.attr('src').match(urlRe); | |
var key = matchArr[0]; | |
// change the src attribute of the image (if no append value given, add empty string) | |
obj.attr("src", options.sources[curSourceIndex].prepend + | |
key + | |
(options.sources[curSourceIndex].append?options.sources[curSourceIndex].append:"") | |
); | |
// Add/Update classes (this prevents looping, and allows us to try multiple sources | |
obj.addClass('src_load_error_'+curSourceIndex); | |
} | |
// Default return value | |
return true; | |
}); | |
}); | |
}; | |
})(jQuery); |