Here is what I imagine your trying to achieve:
var img = $('img'),
div = $(img.data('target')),
caption = img.attr('caption'),
someLink = $('a');
someLink.one('click', function() {
div.append(caption).hide().slideDown();
$(this).remove();
return false;
});
UPDATE
captionToggle.init({
container: '.img_caption_container',
loader: 'div.loader',
link: 'a.link',
slideDownFx: 'slideDown',
slideUpFx: 'slideUp',
showText: 'Hide Caption!',
hideText: 'Show Caption!'
});
var captionToggle = {
init: function(config) {
$.each($(config.container), function() {
var $this = $(this),
$caption = $this.children('img').eq(0).attr('caption'),
$loader = $this.children(config.loader).hide(),
$link = $this.children(config.link);
$link.on('click', function() {
if ( $loader.text().length == 0 ) $loader.append($caption);
if ( $(this).text() == 'Show Caption!' ) {
$loader[config.slideDownFx]();
$(this).text(config.showText);
} else {
$(this).text(config.hideText);
$loader[config.slideUpFx]();
}
return false;
});
});
}
}