Ondersteuning » Code oplossingen gezocht » wp_nav_menu one page design menu highlights

  • Ik heb een one page design template, die prima werkt op 1 probleem na.

    De template gebruikt een (door de maker) eigen gemaakte menu manager, maar omdat deze nogal wat beperkingen met zich mee bracht heb ik besloten het menu te vervangen door wordpress eigen menu (door gebruik te maken van wp_nav_menu. Dit werkt prima, behalve dan het highlighten van het actieve menu item.

    Het probleem is, omdat de website uit 1 pagina bestaat, het menu gebruikt maakt van hashtags om naar de verschillende pagina’s te linken. Volgens wordpress zit je dan de hele tijd op 1 pagina, waar door de current-menu-item en current_page_item classes niet werken. Die worden namelijk automatisch aan elk menu item gegeven.

    De oplossing zou zijn om een custom class te geven aan het actieve menu item. Ik heb hier wel oplossingen voor gevonden, maar die werkten niet goed. Die gaven namelijk elk menu item de custom class (waarschijnlijk omdat er gekeken werd naar de pagina, net zoals wordpress dat doet. En ik kan hier verder helaas geen oplossing voor vinden.

    Hieronder de html output van het menu:

    <div class="menu-hoofdmenu-container">
    <ul id="menu-hoofdmenu" class="menu">
    <li id="menu-item-621" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-621"><a href="http://www.3dinyourhands.com/wp_new/#home">Home</a></li>
    <li id="menu-item-592" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-592"><a href="http://www.3dinyourhands.com/wp_new/#portfolio">Portfolio</a></li>
    <li id="menu-item-594" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-594"><a href="http://www.3dinyourhands.com/wp_new/#contact">Contact</a></li>
    </ul>
    </div>

    Alvast bedankt.

10 reacties aan het bekijken - 16 tot 25 (van in totaal 25)
  • Thread starter MrMartinH

    (@mrmartinh)

    Huh? Hebben we het hier nog over hetzelfde?
    De website werkt prima, het highlighten van het laatst geklikte menu-item niet, op windows onder zowel IE, FF en Opera. Nouja, tenzij ik een refresh doe dus.

    O jee, daar ging effe iets mis in m’n bovenkamer 🙂

    Het werkt idd enkel bij refresh, zie window.onload in je script

    Je kan volgens mij gewoon terug naar jQuery:

    var $j = jQuery.noConflict();
    $j(document).ready(function() {
    $j('ul#menu-hoofdmenu li a').click(
        function(e) {
            e.preventDefault();
            e.stopPropagation();
            $j(this).closest('ul').find('.actief').removeClass('actief');
            $j(this).parent().addClass('actief');
        });
    });
    Thread starter MrMartinH

    (@mrmartinh)

    Hey bedankt, dat werkt. Tenminste, als ik e.preventDefault();er tussen weg haal. Anders kan ik wel op een item klikken, en dan highlight hij ook, maar dan gaat hij niet naar een andere pagina. Zonder dat werkt het echter wel.

    Waar staan

    e.preventDefault();
    e.stopPropagation();

    voor?

    Het enigste wat ik nu nog moet uitzoeken is dat als je op “nieuws” klikt (menu in footer) en dan weer op een item in het menu, dat het menu item niet actief word. Waarschijnlijk omdat “nieuws” een externe pagina is, en de rest van de site dus opnieuw inlaad. Mss dat ik dat wel met een onload event kan oplossen?

    Thread starter MrMartinH

    (@mrmartinh)

    En een oplossing dat de “home” standaard actief is als de website voor het eerst geladen word (aangezien dat de landingspagina is).

    Ik kijk hier morgen wel verder naar. Ik moet eerst maar eens op bed. Als 3D’er heb ik voor vandaag wel weer genoeg code gezien :).

    In ieder geval bedankt voor het werkend krijgen van de klik.

    preventDefault moest er inderdaad uit, want dat houdt de default actie tegen. Laatste probleempje valt misschien op te lossen door één item (home) standaard de class “actief” mee te geven.

    Thread starter MrMartinH

    (@mrmartinh)

    Dat laatste heb ik geprobeerd, alleen dan blijft de “home” de hele tijd actief. Ook als ik op een andere knop klik (die dan ook actief word). Is het mogelijk om via javascript de “home” actief te maken bij de eerste keer laden van de site?

    Thread starter MrMartinH

    (@mrmartinh)

    Hm. Deze code:

    function extractPageName(hrefString)
    {
    	var arr = hrefString.split('/');
    	return  (arr.length < 2) ? hrefString : arr[arr.length-2].toLowerCase() + arr[arr.length-1].toLowerCase();
    }
    
    function setActiveMenu(arr, crtPage)
    {
    	for (var i=0; i < arr.length; i++)
    	{
    		if(extractPageName(arr[i].href) == crtPage)
    		{
    			if (arr[i].parentNode.tagName != "DIV")
    			{
    				arr[i].className = "actief";
    				arr[i].parentNode.className = "actief";
    			}
    		}
    	}
    }
    
    function setPage()
    {
    	hrefString = document.location.href ? document.location.href : document.location;
    
    	if (document.getElementById("menu-hoofdmenu") !=null )
    	setActiveMenu(document.getElementById("menu-hoofdmenu").getElementsByTagName("a"), extractPageName(hrefString));
    }
    
    window.onload=function()
    {
    	setPage();
    }

    Werkt zoals het moet (ook met reloaden van de pagina als je van “nieuws” klikt op 1 van de items in het hoofdmenu), maar werkt dus alleen als de pagina refreshed.

    Deze code:

    var $j = jQuery.noConflict();
    $j(document).ready(function() {
    $j('ul#menu-hoofdmenu li a').click(
        function(e) {
            e.stopPropagation();
            $j(this).closest('ul').find('.actief').removeClass('actief');
            $j(this).parent().addClass('actief');
        });
    });

    Doet wat het moet doen, maar werkt dan weer niet als de pagina herlaadt (wat dus gebeurd als je van “nieuws” switched naar een andere pagina).

    Het werkt wel als ik deze twee scripts samen gebruik, maar het zorgt wel voor een hele boel code. Is er een manier om dat op te schonen? Zo niet dan is deze oplossing beter dan geen oplossing.

    Het stukje jQuery zou in principe voldoende moeten zijn. Hoe heb je die standaard class voor home meegegeven? Check http://codex.wordpress.org/Plugin_API/Filter_Reference/nav_menu_css_class

    Thread starter MrMartinH

    (@mrmartinh)

    Volgens mij heb ik een foutje gemaakt bij het meegeven van de class aan “home”. Ik heb nu gewoon via wordpress menu manager “home” een custom class mee gegeven en nu werkt het wel.

    In principe werkt de code ook wel, het probleem doet zich echter voor zodra ik op het item “nieuws” klik (in het footer menu). De nieuws sectie bevind zich extern van de “one page” en laad de site dus opnieuw in. Gevolg is dat “home” weer op actief word gezet, maar bij “nieuws” zou geen van de hoofd-menu items actief moeten zijn.

    Een volgend probleem doet zich voor als je dan van “nieuws” op 1 van de items in het hoofd-menu klikt. Bijvoorbeeld portfolio. Als je dat doet word de pagina opnieuw ingeladen en word de knop “portfolio” niet actief. Wel word “home” dan weer actief gemaakt (de pagina word immers opnieuw geladen).

    Dit is met alleen jouw stukje code. Als ik dan het andere stuk code er ook bij gebruik dan word “portfolio” wel actief, omdat dat script (na verversen) volgens mij kijkt naar de overeenkomst in de attribuut en de url. Probleem van de eeuwige actieve “home” knop blijft dan overigens ook bestaan.

    Thread starter MrMartinH

    (@mrmartinh)

    Ik heb hier helaas nog steeds geen passende oplossing voor gevonden. Als iemand mij in de juiste richting kan wijzen dan hoor ik het heel graag.

    Het stukje code van donutz werkt in principe goed, maar ik vermoed dat er iets van een check in moet zitten die de href attribute vergelijkt met wat er in de url staat (of andersom?). Ik vermoed dat dat het probleem van het verversen op kan lossen, en dat de “home” knop niet steeds standaard actief blijft bij het switchen van pagina’s.

10 reacties aan het bekijken - 16 tot 25 (van in totaal 25)
  • Het onderwerp ‘wp_nav_menu one page design menu highlights’ is gesloten voor nieuwe reacties.