[jQuery] spritemenu customise
hello everyone,
i found quite interesting the spritemenu (http://
www.distinctcorp.com.au/jquery/spritemenu.html) idea and used it on my
website. It works quite fine, but i'd like to ad some functionality:
when the user click on a menu element, i want it to remain selected
(in hover state completed). So, here's the function:
<code>
(function($){
$.fn.spritemenu = function(settings) {
var settings = $.extend({}, $.fn.spritemenu.defaults, settings);
return this.each(function() {
var aniParamsOrig = {};
var aniParamsBack = {};
$(this).children(settings.buttonselector).each(function(index) {
var $mainlink = $(this).children('a');
$mainlink.parent().children('ul').css('opacity',0).hide();
$mainlink
.css('display','block')
.css('position','relative')
.css('width',settings.buttonwidth)
.css('height',settings.buttonheight)
.css('background-image','url('+settings.grid+')')
.css('background-repeat','no-repeat')
.css('background-position',((0-index) * settings.buttonwidth)+'px
0px')
.css('z-index',settings.zindex)
.append('<span></span>').children('span')
.css('display','block')
.css('position','absolute')
.css('top',0)
.css('left',0)
.css('width',settings.buttonwidth)
.css('height',settings.buttonheight)
.css('background-image','url('+settings.grid+')')
.css('background-repeat','no-repeat')
.css('background-position',((0-index) * settings.buttonwidth)+'px
' + (-1*settings.buttonheight) + 'px')
.css('z-index',(settings.zindex+1));
aniParamsOrig[settings.animate] = $mainlink.children('span').css
(settings.animate);
aniParamsBack[settings.animate] = 0;
$mainlink.children('span').css(settings.animate,0).hide();
}).hover(function () {
$(this).children('a').children('span').stop().show().animate
(aniParamsOrig, {queue: true, duration: settings.speed, easing:
settings.easing, complete: function() {
$(this).parent().parent().children('ul').stop().show().animate
({opacity: 1}, {queue: true, duration: 'slow'});
}});
},
function () {
$(this).children('a').children('span').stop().animate
(aniParamsBack, {queue: true, duration: settings.speed, easing:
settings.easing, complete: function() {
$(this).hide().parent().parent().children('ul').stop().animate
({opacity: 0}, {queue: true, duration: 'slow'}).hide();
}});
}
).click(function(){
/*alert("pop");*/
$(this).parent().children('li').children('a').children('span').stop
().animate(aniParamsBack, {queue: true, duration: settings.speed,
easing: settings.easing});
$(this).children('a').children('span').stop().show().animate
(aniParamsOrig, {queue: true, duration: settings.speed, easing:
settings.easing});
});
});
}
$.fn.spritemenu.defaults = {
grid: 'menugrid.png',
buttonwidth: 100,
buttonheight: 100,
buttonselector: 'li',
zindex: 10,
speed: 'slow',
easing: 'swing',
animate: 'opacity'
};
function abort() {
arguments[0] = 'spritemenu: ' + arguments[0];
throw format.apply(null, arguments);
}
function format(str) {
for (var i = 1; i < arguments.length; i++)
str = str.replace(new RegExp('\\{' + (i-1) + '}', 'g'), arguments
[i]);
return str;
}
})(jQuery);</code>
My add is relative to the .click section i report here:
<code>
.click(function(){
/*alert("pop");*/
$(this).parent().children('li').children('a').children('span').stop
().animate(aniParamsBack, {queue: true, duration: settings.speed,
easing: settings.easing});
$(this).children('a').children('span').stop().show().animate
(aniParamsOrig, {queue: true, duration: settings.speed, easing:
settings.easing});
});
</code>
and i get a weird behavior: when i use the alert, it works exactly as
i'd like it to: the animation completes fine and the element remains
in hover state. When i remove the alert, nothing happens and when the
mouse leaves the item after the click, it comes back to the original
state.
can anyone help me, please?
thanks a lot,
joey