Hervorgehobener Menüpunkt auf Unterseite

Allgemeine Fragen
Klaus
Supporter
Supporter
Beiträge: 446
Registriert: Mi 21. Jul 2021, 00:43

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Klaus »

Du hast dann aber schon den Selector auf MR angepasst!?
.navlist -> .nav-link

Gibt das mal bei "Before </body> code:" ein (so ist das zumindest beim Witsec Editor) dann kannst Du im Consolen Log sehen ob er die Nav Elemente überhaupt findet.

(Im Skriptblock natürlich.)

Code: Alles auswählen

navlist = document.querySelectorAll('.nav-link');
console.log(navlist); 
("Meins" läuft übrigens ... so grob ...)
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

Moin,

also das geht mit so einem Script nicht - wie auch, denn egal was ich an der Navi mache, wenn diese das Mobirise-Attribut "global" trägt:

https://mobirise.com/docs/#theme-n-components-setings

... wird die Navi auf jeder Seite geändert.

Hier mal ein Beispiel als Test:

URL wurde gelöscht ...

Hier habe ich dieses Script von w3schools.com verwendet:

https://www.w3schools.com/howto/howto_j ... lement.asp

CSS:

Code: Alles auswählen

<style>
    /* Style the active class, and buttons on mouse-over */
    .active, .nav-item:hover {
        background-color: #6592e6;
    }
</style>
JavaScript:

Code: Alles auswählen

<script>
    // Add active class to the current button (highlight it)
    var header = document.getElementById("myNAV");
    var btns = header.getElementsByClassName("nav-item");
    for (var i = 0; i < btns.length; i++) {
      btns[i].addEventListener("click", function() {
      var current = document.getElementsByClassName("active");
      current[0].className = current[0].className.replace(" active", "");
      this.className += " active";
      });
    }
</script>

Das funktioniert nur, wenn ich das Attribut "global" von Mobirise lösche und dann brauche ich so ein Script nicht, denn dann muss ich nur die class="active" an den jeweiligen Menü-Link schreiben :eek:

Code: Alles auswählen

<li class="nav-item active">
  <a class="nav-link link text-white text-primary display-4" href="index.html">Startseite</a>
</li>
Das Script macht Sinn, wenn es wie bei w3schools.com auf der gleichen Seite verwendet wird. Hier habe ich es auch direkt auf der Startseite nochmals als Demo eingebaut:

URL wurde gelöscht ...
stobi_de
Moderator
Moderator
Beiträge: 780
Registriert: Di 11. Okt 2022, 06:30

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von stobi_de »

Aber es ist doch völlig egal, ob das auf Menu-Item auf allen anderen Seiten ebenfalls gesetzt wird.
Du wechselst auf eine andere Seite, alle werden zurückgesetzt und nur eines wird hervorgehoben.
Ist doch OK.

Das Problem, was in meinem Script ist, dass das Click auf der Vorseite ausgeführt wird und erst dann auf die andere Seite gewechselt wird, Ich bin noch nicht ganz wach und kann noch nicht 100% denken...also später genaues dazu!

@Tommy: wieso ALLES AUF EINER SEITE?
Der Javi González hat doch auch diverse Seiten
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

Ich habe jetzt auch noch dieses JavaScript ausprobiert, das gar keine class="active" benötigt, sondern diese mittels Schleife selbst setzen soll. Geht aber auch nicht:

https://www.w3schools.com/howto/tryit.a ... e_element2

Code: Alles auswählen

<script>
// Add active class to the current button (highlight it)
var header = document.getElementById("myDIV");
var btns = header.getElementsByClassName("btn");
for (var i = 0; i < btns.length; i++) {
  btns[i].addEventListener("click", function() {
  var current = document.getElementsByClassName("active");
  if (current.length > 0) { 
    current[0].className = current[0].className.replace(" active", "");
  }
  this.className += " active";
  });
}
</script>

Es geht eben nicht, wenn man die HTML-Seiten wechselt.

... ich verstehe auch zu wenig von JavaScript, um das genau zu begreifen.
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

das Ding vom Javi González funktioniert aber auch nur auf ein und der gleichen Seite :confused:

https://jsfiddle.net/javigonzalez/mphxw6ct/8/

... keine Ahnung, wie er das auf seiner eigentlichen Seite gezaubert hat.
stobi_de
Moderator
Moderator
Beiträge: 780
Registriert: Di 11. Okt 2022, 06:30

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von stobi_de »

So ganz klappt das noch nicht.
Das Item wird schwarz, aber dann doch falsch und wird danach von Mobi wieder durchsichtig...
MobiNavi.jpg
so klappt das, aber Mobi entfernt das active umgehend wieder. :confused:

Code: Alles auswählen

<script>
let navlist = document.querySelectorAll('.mynavlist');

for (let i = 0; i < navlist.length; i++) {
	navlist[i].addEventListener('click', function() {
  	"use strict";
    
		for (let x = 1; x <= navlist.length; x++) {
                
			if (navlist[x] == this) {
                alert (x);  
                alert ("found");          
				navlist[x].classList.add('active');                
			} else {
            alert (x);
            alert ("reset");
				navlist[x].classList.remove('active');
			}
		}
	});
}
</script>
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

... also Dein modifiziertes Script macht doch gar nichts, außer x hochzuzählen. Das Problem ist doch das die class="active" eben nicht gesetzt wird.
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

Hier mal der Beweis.

Wenn wir nach einem Script arbeiten, das überhaupt nicht funktioniert, brauchen wir uns nicht zu wundern :aufsmaul:

Habe dieses Script hier:

https://jsfiddle.net/javigonzalez/mphxw6ct/8/

... nun händisch nachgebaut.


Dieser Nachbau ist also 1:1 übernommen und nur auf einer einzelnen Seite mit dem Raute-Zeichen # (nach oben):

Hier ist die nachgebaute "Schummelseite":

URL wurde gelöscht ...

Code: Alles auswählen

<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>Testseite</title>
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">


  <style>
     #nav {
        position: relative;
        float: left;
        background: #8B0000;
        width: 100%;
    }

    .topnav {
        margin: 0;
        padding: 0;
    }

    .topnav li {
        display: inline-block;
        list-style: none;
    }

    .topnav li a {
        color: #fff;
        text-decoration: none;
        font-size: 16px;
        height: 40px;
        line-height: 40px;
        padding: 15px 20px;
    }

    .topnav li a:hover,
    .topnav li a:focus,
    .topnav li a.active {
        background: #000;
    }
  </style>

 </head>
<body>

<h3>Schummelseite</h3>

<nav id="nav" role="navigation">
	<ul class="topnav">
		<li><a href="#" class="navlist">Startseite</a></li>
		<li><a href="#" class="navlist">Seite 1</a></li>
		<li><a href="#" class="navlist">Seite 2</a></li>
		<li><a href="#" class="navlist">Seite 3</a></li>
	</ul>
</nav>

<script>
let navlist = document.querySelectorAll('.navlist');

for (let i = 0; i < navlist.length; i++) {
    navlist[i].addEventListener('click', function() {
    "use strict";
        for (let x = 0; x < navlist.length; x++) {
            if (navlist[x] == this) {
                navlist[x].classList.add('active');
            } else {
                navlist[x].classList.remove('active');
            }
        }
    });
}
</script>

</body>

</html>

Hier dann exakt die gleiche Seite mit echten Links auf andere Seiten und dann geht es eben nicht - genau wie natürlich auch beim korrekten Einbau in Mobirise :(

Es gibt hier also folgende Seiten:

index.html
seite1.html
seite2.html
seite3.html

URL wurde gelöscht ...

Code: Alles auswählen

<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>Testseite</title>
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">


  <style>
     #nav {
        position: relative;
        float: left;
        background: #8B0000;
        width: 100%;
    }

    .topnav {
        margin: 0;
        padding: 0;
    }

    .topnav li {
        display: inline-block;
        list-style: none;
    }

    .topnav li a {
        color: #fff;
        text-decoration: none;
        font-size: 16px;
        height: 40px;
        line-height: 40px;
        padding: 15px 20px;
    }

    .topnav li a:hover,
    .topnav li a:focus,
    .topnav li a.active {
        background: #000;
    }
  </style>

 </head>
<body>

<h3>Seite 1</h3>

<nav id="nav" role="navigation">
	<ul class="topnav">
		<li><a href="index.html" class="navlist">Startseite</a></li>
		<li><a href="seite1.html" class="navlist">Seite 1</a></li>
		<li><a href="seite2.html" class="navlist">Seite 2</a></li>
		<li><a href="seite3.html" class="navlist">Seite 3</a></li>
	</ul>
</nav>

<script>
let navlist = document.querySelectorAll('.navlist');

for (let i = 0; i < navlist.length; i++) {
    navlist[i].addEventListener('click', function() {
    "use strict";
        for (let x = 0; x < navlist.length; x++) {
            if (navlist[x] == this) {
                navlist[x].classList.add('active');
            } else {
                navlist[x].classList.remove('active');
            }
        }
    });
}
</script>

</body>

</html>
Ebenso ist es mit allen anderen Scripts, die ich bisher finden konnte, denn die beziehen sich alle immer auf die gleiche Seite - und dann geht das natürlich auch, wie z.B. auf der Seite von w3schools.com mit den Buttons:

https://www.w3schools.com/howto/howto_j ... lement.asp
stobi_de
Moderator
Moderator
Beiträge: 780
Registriert: Di 11. Okt 2022, 06:30

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von stobi_de »

Ich verstehe gerade nicht, warum Du immer von EINER Seite sprichst
Er hier hat doch verschiedene Seiten.
https://javigonzalez.ch/blog/einen-akti ... ervorheben

Das "Active "wird schon gesetzt, aber dann wird die Seite neu geladen und es wird sofort wieder überbügelt.
Das Event "Click" ist nicht korrekt.
Eher ein "onPageLoad" - aber das ist natürlich auch nicht korrekt.

Schau mal hier
www.tanja-hilgeland.de/test

Wenn Du auf KONTAKT drückst, wird das Ding kurz aktiv, aber dann wird ja erst die Seite geladen.

Vielleicht hast Du ja doch recht, und es kann so nicht funktionieren.
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

Du, ich habe damit jetzt aufgegeben. Das alles macht ja nur Sinn, wenn man die Menüleiste eben auf "global" stehen lassen kann, damit Änderungen an der Navigation nicht an jeder Seite vorgenommen werden müssen.

Ich verstehe nicht genug von JavaScript, um diese Scripts durch und durch zu begreifen.

Mein Menschenverstand sagt mir aber, dass das so gar nicht funktionieren kann, denn mit jedem Aufruf einer neuen Seite wird ja auch das JavaScript wieder neu geladen. Genau das passiert eben auch und daher kann das mit dem Click und der class="active" erst dann gesetzt werden, wenn die Seite bereits geladen wurde.

Solltest Du irgendwann eine Lösung finden - dann wäre das natürlich großes Kino.

Vielleicht hat ja Klaus noch etwas in der Schublade für uns ...
Klaus
Supporter
Supporter
Beiträge: 446
Registriert: Mi 21. Jul 2021, 00:43

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Klaus »

Tommy Herrmann hat geschrieben: Di 7. Nov 2023, 07:22 ... keine Ahnung, wie er das auf seiner eigentlichen Seite gezaubert hat.
Auf seiner eigenen Seite verwendet er (vermutlich) je Seite einen eigenes Menü in dem der entsprechende Punkt dann schon aktiv ist.
Kann man ganz leicht sehen mit z.B. curl ... das holt die Seite nur und führt kein JS aus:
curl https://javigonzalez.ch/ueber-mich
Dann einfach nach

Code: Alles auswählen

<li class="active"><a href="https://javigonzalez.ch/ueber-mich" title="Über mich" >Über mich</a></li>
suchen.
Wobei es aber nicht ganz auszuschließen ist dass das active passend durch PHP o.Ä. beim Aufruf durch die URL "eingesteuert" wird.
(Jetzt rein von den Response Headers sieht es aber nicht danach aus.)

Sein Bsp. ist wie schon mehrfach richtig geschriben nur immer auf der gleichen Seite ...
https://jsfiddle.net/javigonzalez/mphxw6ct/8/

Sieht man ja im HTML bei der NAV:

Code: Alles auswählen

		<li><a href="#" class="navlist">Menü</a></li>
		<li><a href="#" class="navlist">Menü</a></li>
Klaus
Supporter
Supporter
Beiträge: 446
Registriert: Mi 21. Jul 2021, 00:43

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Klaus »

Na ja und was kann jetzt die Lösung sein?

Wie geschrieben oben ist das Menü immer gleich auf jeder Seite.
Nehmen wir das mal von Tommy von der Testseite:

Code: Alles auswählen

		<li><a href="index.html" class="navlist">Startseite</a></li>
		<li><a href="seite1.html" class="navlist">Seite 1</a></li>
		<li><a href="seite2.html" class="navlist">Seite 2</a></li>
Der Rest der Seite ist individuell ... heiß auch dass ich unten in der (jeder) Seite per JavaScript oben einen Menüpunkt ändern kann.

Im "billigstem Fall" Codiere ich unten auf der seite2.html fix rein dass der Menüpunkt mit dem href="seite2.html" eine "Aktivklasse" bekommt.
document.querySelector("a[href='seite2.html']").classList = "active";

Haben wir dann überhaupt einen Vorteil?
Ja, macht wendig Arbeit je Seite und wenn die Menüleiste erweitert wird dann haben sie sofort alle Seiten und es muss je Seite nix (neu) angepasst werden.

Noch was zu Beachten?
Ja ... es hängen vom Bootstrap und noch einer JS (navbar-dropdown.js) ggf. schon Handler (click, keydown) dran die die Klassen & Co ändern, das muss alles abgestimmt sein.
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

Moin Klaus,

danke, dass Du Dir darüber auch Gedanken machst.

Ich habe das ausprobiert - genau an dieser Testseite. So passiert aber noch gar nichts. Wie gesagt, mir fehlt da die Kenntnis von JavaScript, um das richtig anzupassen.

Was genau müsste ich denn dann auf dieser Seite einfügen:

URL wurde gelöscht ...

Das anstelle des anderen JavaScripts bewirkt nichts:

Code: Alles auswählen

<script>
 document.querySelector("a[href='seite-2.html']").classList = "active";
</script>
Die class="active" hatte ich so bschrieben:

Code: Alles auswählen

<style>
    /* Style the active class, and buttons on mouse-over */
    .active, .nav-item:hover {
        background-color: #6592e6;
        border-radius: 30px;
</style>

Ich finde nämlich prinzipiell die Idee sehr gut ein JavaScript zu entwickeln, das man dann so anpasst, dass alle vorhandenen Seiten darin angesprochen werden, also sobald die URL aufgerufen wird eine Class aktiv wird. Dann müsste man nur bei zusätzlichen Seiten auch das JavaScript einmalig anpassen.
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

Ich glaube mir ist da etwas gelungen :freude:

https://www.mobirise-tutorials.com/High ... index.html

... nun mal weiter gucken mit Mobirise :kaffee:

Hier mit Mobirise - es geht wunderbar, nur tue ich mich sehr schwer mit der Class - da alles with mit der Navi und dem <a> Tag zu tun hat, irgendwie kaum zu gesatlten geht :eek:

... auch der "Hamburger" Button funktioniert gerade noch nicht :confused:

https://www.mobirise-tutorials.com/High ... index.html

Tutorial folgt im Laufe des Tages ...
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

Es lag an der "for" Schleife, die ich jetzt von 0 auf 2 gesetzt habe. Keine Ahnung, ob das richtig ist - Klaus ???

Denn sonst würde mein Logo und der Link daneben auch diese CSS erhalten und das darf nicht sein. Setze ich die id="mynav" außerhalb des Hamburger-Buttons funktioniert dieser nicht mehr.

Kann mal jemand gucken, ob das JavaScript korrekt ist - funktionieren tut es jetzt an allen Geräten.

Code: Alles auswählen

  <!-- JavaScript to change active menu link -->
  <script>
    function setActive() {
      linkObj = document.getElementById('mynav').getElementsByTagName('a');
      for(i=2;i<linkObj.length;i++) { 
        if(document.location.href.indexOf(linkObj[i].href)>=0) {
          linkObj[i].classList.add("active");
        }
      }
    }
    window.onload = setActive;
  </script>
Benutzeravatar
struggle
Mitglied (Level 10)
Mitglied (Level 10)
Beiträge: 438
Registriert: So 4. Dez 2022, 11:55
Wohnort: Brandenburg

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von struggle »

Tommy Herrmann hat geschrieben: Di 7. Nov 2023, 12:55 Du, ich habe damit jetzt aufgegeben.
Das hab' ich sowieso nicht geglaubt 😁
Gruss
Reinhard
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

jupp - lange genug habe ich auch daran geschraubt :eek:

Mein Tutorial ist fertig, wer mag kann das ja mal ausprobieren. Auf jeden Fall ist das eine bisher noch nicht erfolgte Erungenschaft zum Highlighting der Navi.

https://www.mobirise-tutorials.com/High ... orial.html
Klaus
Supporter
Supporter
Beiträge: 446
Registriert: Mi 21. Jul 2021, 00:43

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Klaus »

+1

Sehr schöne (automatische) Lösung! :-)

Hast Du das mal mit Menülinks auf Anker wie auf der Seite von Frank ausprobiert?
https://www.tanja-hilgeland.de/test/ang ... akupunktur
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Tommy Herrmann »

Hallo Klaus,

ja - ich habe sehr viel Zeit investiert das überhaupt zu finden. So ganz langsam verstehe ich das Script auch.

... am längsten dauert es immer die Tutorial-Seiten auch so aufzubauen, dass diese in Englisch verständlich übersetzt werden. Das macht sehr viel Arbeit und ich muss mit vielen Tricks arbeiten, damit Google da alles richtig macht.

Kannst Du mir einen Tipp geben warum das nur über die ID klappt? Mit "getElementsByClassName" funktioniert es nicht (oder ich mache was falsch) :crying:

Das wäre dann einfacher zu setzen, denn die Navi von Mobirise ist verdammt kompliziert.

Das mit den Anker-Links wäre dann wohl eher eine Aufgabe für das andere Skript, das ich auf der Startseite eingebaut habe. Klar das geht genauso:

https://www.mobirise-tutorials.com/High ... iel-Script

Mit dem Skript für die Navi werden halt alle Links in einer Schleife der Reihe nach abgearbeitet - das passt dann nicht immer und überall.
Klaus
Supporter
Supporter
Beiträge: 446
Registriert: Mi 21. Jul 2021, 00:43

Re: Hervorgehobener Menüpunkt auf Unterseite

Ungelesener Beitrag von Klaus »

getElementsByClassName:

Die Frage ist immer wie selektiere ich am einfachsten das was ich "verarbeiten" will wenn das "Verarbeiten" dabei noch am Bequemsten per Schleife geschehen soll.

Das mit der ID ist halt eine sehr optimale Lösung weil man damit nur genau die eine Nav (mit der ID) erwischt und dann von der nur alle <a> s und das hat man in einer Collection die man per for/foreach einfach verarbeiten kann.

getElementsByClassName liefert erst mal alles (Collection ... wegen dem s in getElementsByClassName ) mit der Klasse ... sind das schon passend die <a> s oder müsstest Du dann noch was suchen ... oder kannst Du genau nur die Nav erwischen?
Falls die Nav (und nur die eine Nav) eine eigene Klasse hat dann würde ein getElementsByClassName('eindeutigeKlasse')[0].getElementsByTagName('a') gehen.

Ob das so immer geht weiß ich nicht, dazu kenne ich MR zu wenig ... sieht aber erst mal gut aus, entweder Id oder Class ... solange das eindeutig ist:
nav.JPG

Noch n bisschen Infomaterial:
https://developer.mozilla.org/en-US/doc ... yClassName
https://www.w3schools.com/jsref/tryit.a ... ef_foreach
https://masteringjs.io/tutorials/fundam ... l-contains
Antworten

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 151 Gäste