On 10/4/07, Olivier Percebois-Garve <[EMAIL PROTECTED]> wrote:
> The first one highlights the item currently selected. I works pretty well,
> and could be improved to handle types sort of url.
>
>     $('.nav li a').each(function(){
>         href = $(this).attr('href').split('/');
>         href =
> $(this).attr('href').replace('http://'+document.location.hostname,
> '');
>         path = document.location.pathname;
>         if (path.charAt(path.length-1) == '/') path = path+' index.html';
>         if (href == path){
>             $(this).parent().addClass('selected');
>
> $(this).parent().parent().parent().children('a').addClass('selected');
>             $(this).addClass('selected'); /
>         }
>     });

Olivier, good to here your menu is working now.

Regarding your new code, I think your first idea is interesting and
could have some use in certain circumstances. Personally, my
preference would be to always try to have the nav path applied
server-side whilst generating the mark-up so that the indicator is
there when JS is unavailable. When that is not possible your idea is
good alternative. I noticed various ways to improve your code and was
inspired by the challenge so I created a plugin out of it for you to
use. It's called applyNavPath. I did change what elements the
'current' class gets applied to though in order to suit the Superfish
philosophy. The class is added to all parent li elements of the anchor
with the current url in its href attribute, in addition to the anchor
itself. This provides more control over the styling and means that the
resulting HTML will be compatible with Superfish's pathClass option.
If you only want to style the one final anchor, simply use a.current {
/* style it */ } rather than .current {} which would style the li
elements too.

Also, there is an optional object you can pass into the plugin
allowing you to change the name of the class you want to use and also
what file suffix to add to the string 'index'.

The plugin code:

(function($){
        $.fn.applyNavPath = function(o){
                o = $.extend({
                        currentClass : 'current',
                        suffix : 'html'
                }, o || {});
                
                var urlWithFile = function(url) {
                        return (url.charAt(url.length-1) == '/') ? 
url+'index.'+o.suffix : url;
                };
                
                $('a',this).each(function() {
                        var $$ = $(this),
                                href = 
urlWithFile($(this).attr('href').replace('http://'+document.location.hostname,''));
                                path = urlWithFile(document.location.pathname);
                        if (href == path) {
                                
$$.parents('li').add($$).addClass(o.currentClass);
                        }
                });     
                
                return this;
        };
})(jQuery);

With this written as a plugin it is chainable and you could initialise
Superfish like this, for example:

$('.nav').applyNavPath().superfish();

Or with more options, and also using the optional pathClass feature of
Superfish:

$('.nav').applyNavPath({
    currentClass : 'selected',
    suffix : 'php'
}).superfish({
    animation : {opacity:'show',height:'show'},
    delay : 1200,
    pathClass : 'selected'
});

I hope this comes in handy Olivier, and credit for the tricky stuff
goes to you, of course. I just made it work as a plugin.

I didn't have time to look at your second idea. Maybe I'll have a look
when I get chance.

Cheers
Joel Birch.

Reply via email to