Ankündigung

Einklappen
Keine Ankündigung bisher.

smartvisu mit Responsive Menu:Events bleiben aus nach Entfernen von data-ajax="false"

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    smartvisu mit Responsive Menu:Events bleiben aus nach Entfernen von data-ajax="false"

    Hallo,
    mein smartvisu-Menu ist je nach Bildschirmbreite als klassisches Menu oben horizontal angeordnet oder aufklappbar als Burgermenu links. Beide Menus haben bei Konfiguration der Links mit data-ajax="false" problemlos funktioniert.

    Zur Performance-Optimierung habe ich das data-ajax="false" entfernt/auskommentiert. Das führt erwartungsgemäß zu einer besseren Seitenumschaltzeit. Allerdings habe ich schon viele Stunden an folgendem Problem verbracht - ohne dieses lösen zu können und brauche Eure Hilfe und neue Ideen.

    Das Verhalten ist mit smartvisu V2.9 und V3.2 identisch.Das klassische, horizontale Menu funktioniert problemlos. Im Falle geringerer Bilschschirmbreite läßt sich das Burgermenu genau einmal problemlos bedienen und reagiert dann nicht mehr. Nach Neuladen der Seite über den Browser klappt es dann ein weiteres Mal. Im Folgenden Details zu den beobachteten Events dazu (chrome Entwickler-Konsole).

    sv1.png


    sv2.png

    Burger-Menu-Events bei erstmaligem Menu-Click auf „Musik“ (Funktion ok):
    - Click auf Burger-Symbol
    - Menu öffnet
    - Menueintrag selektiert
    - Menu schließt automatisch

    sv3.png
    Burger-Menu-Events bei folgendem Click auf das Burger-Symbol (Menu öffnet gar nicht mehr):

    sv4.png

    Es sieht so aus, als wenn das Burger-Menu gar nicht mehr vorhanden wäre. Habe testweise das Burger-Symbol mit einem hover-Event und einer Background-Farbe versehen => Wird dargestellt.

    Nach Neuladen der kompletten Webseite => Wieder einmalig OK
    Mit data-ajax=„false“ wird die Seite auch neu geladen, was das Verhalten bestätigt.

    Im Fehlerfall der HTML-Code im Entwicklerfenster:

    sv5.png

    Alternativ zu o.g. Burger-Menu-Ansatz hatte ich zwei weitere probiert mit Checkbox und Button => Gleiches Problem !

    Wo seht Ihr einen Ansatz, um hier weiter zu kommen ? Bin mit meinem Latein am Ende...

    Danke im Voraus,
    Jörk


    menu.html:

    HTML-Code:
    /** https://www.taniarascia.com/responsive-dropdown-navigation-bar/ */
    /** https://codepen.io/taniarascia/pen/dYvvYv/ */
    
    <header class="navigation">
      <div class="nav-container">
         <nav role="navigation">
            <div class="nav-mobile"><a id="nav-toggle" <a href="#!"><span></span></a></div>
               <ul class="nav-list">
              
               <li>
                   <a /** data-ajax="false" */ href="index.php">Home</a>
               </li>
    
                <li>
                   <a /** data-ajax="false" */ href="#">Räume</a>
                       <ul class="nav-dropdown">
                           <li>
                               <a /** data-ajax="false" */ href="index.php?page=overview_dg">DG</a>
                            </li>
                            <li>
                                <a /** data-ajax="false" */ href="index.php?page=overview_eg">EG</a>
                            </li>
                            <li>
                                 <a /** data-ajax="false" */ href="index.php?page=overview_garten">Außen</a>
                            </li>
                       </ul>
                  </li>
                   <li>
                        <a /** data-ajax="false" */ href="index.php?page=index-sonos">Musik</a>
                  </li>
                  /** restliche Menueinträge hier entfernt */
              </li>
           </ul>
        </nav>
      </div>
    </header>
    #nav-toggle sorgt dabei für die Umschaltung zwischen klassischem und Burger-Menu.


    menu.css:

    HTML-Code:
    /* Höhe des Menus korrigieren */
    .ui-page>.ui-header {
      height: 69px;
      margin: 0 0 0 0;
    }
    
    /* Menu einpassen */
    .ui-page>.ui-header .ui-left {
      margin: 0px 0 0 0px;
      float: left;
    }
    
    .navigation {
      height: 64px;
      background: #262626;
      margin-top: -5px;
    }
    
    .nav-container {
      max-width: 1000px;
      margin: 0 auto;
    }
    
    nav {
      float: right;
      /* Vertikaler Bereich unter Burger-Symbol komplett als Menu */
      background: #262626;
      opacity: 0.91;
      transition: all 300ms ease-in-out;
    }
    
    nav ul {
      list-style: none;
      margin: 0;
      padding: 0;
    }
    
    nav ul li {
      float: left;
      position: relative;
    }
    
    nav ul li a, nav ul li a:visited {
      display: block;
      padding: 0px 25px 0px 25px;
      line-height: 66px;
      background: #262626;
      color: #ffffff;
      text-decoration: none;
      text-align: left;
    }
    
    nav ul li a:hover, nav ul li a:visited:hover {
      background: #2581DC;
      color: #ffffff ! important;
    }
    
    /* Automatisch öffnende Sub-Menus */
    ul.nav-list li:hover ul {
      display: block;
    }
    
    /* Symbol für Kaskadenmenu */
    nav ul li a:not(:only-child):after, nav ul li a:visited:not(:only-child):after {
      padding-left: 4px;
      content: ' ▾';
    }
    
    nav ul li ul li {
      min-width: 190px;
    }
    
    nav ul li ul li a {
      padding: 15px;
      line-height: 20px;
      background: #262626; /* Einfarbiger Hintergrund bei Kaskadenmenu in nav-list */
    }
    
    .nav-dropdown {
      position: absolute;
      display: none;
      z-index: 1;
      box-shadow: 0 3px 12px rgba(0, 0, 0, 0.15);
      opacity:0.91;
      background: #262626; /* Einfarbiger Hintergrund bei Kaskadenmenu in Burger-Submenu */
    }
    
    .nav-mobile {
      display: none;
      position: absolute;
      top: 0;
      left: 0;
      background-image: linear-gradient(#3c3c3c,#111);
      /* Größe Burger-Icon */
      height: 68px;
      width: 70px;
    }
    
    /* Burgermenu */
    @media only screen and (max-width: 998px) {
      .nav-mobile {
        display: block;
      }
      nav {
        width: 100%;
        padding: 70px 0 15px;
        height: 1000px; /* Höhe des Menus im Burger über gesamte Höhe */
      }
      nav ul {
        display: none;
      }
      nav ul li {
        float: none;
      }
      nav ul li a {
        padding: 15px;
        line-height: 20px;
      }
      nav ul li ul li a {
        padding-left: 45px; /* Eingerückte Untermenus im Burgermenu */
      }
      .nav-dropdown {
        position: static;
      }
    }
    
    /* Klassisches horizontales Menu */
    @media screen and (min-width: 999px) {
      .nav-list {
          display: block !important;
       }
       nav ul li a {
          background-image: linear-gradient(#3c3c3c,#111);
       }
    }
    
    #nav-toggle {
      position: absolute;
      left: 18px;
      top: 22px;
      cursor: pointer;
      padding: 10px 35px 16px 0px;
    }
    
    #nav-toggle span, #nav-toggle span:before, #nav-toggle span:after {
      cursor: pointer;
      border-radius: 1px;
      height: 5px;
      width: 35px;
      background: #ffffff;
      position: absolute;
      display: block;
      content: '';
      transition: all 300ms ease-in-out;
    }
    
    /* Strich vom Burger-Symbol nach oben versetzt */
    #nav-toggle span:before {
      top: -10px;
    }
    
    /* Horiz. Strich vom Burger-Symbol nach unten versetzt */
    #nav-toggle span:after {
      bottom: -10px;
    }
    
    #nav-toggle.active span {
      background-color: transparent;
    }
    
    /* Burger-Symbol nach X wechseln */
    #nav-toggle.active span:before, #nav-toggle.active span:after {
      top: 0;
    }
    
    #nav-toggle.active span:before {
      transform: rotate(45deg);
    }
    
    #nav-toggle.active span:after {
      transform: rotate(-45deg);
    }

    menu.js:

    HTML-Code:
    $(function() { // DOM ready
      // Klicken
      $('#nav-toggle').click( function() {
         console.warn("#nav-toggle: Click");
         $('nav ul').slideToggle();
      });
    
      //Mouseover: Hier nur zum testen ohne Menu-Funktion
      $('#nav-toggle').hover(
        //Mouseenter
        function(e) {
          console.warn("#nav-toggle: Hover: Enter");
         },
         //Mouseleave
         function(e) {
           console.warn("#nav-toggle: Hover: Leave");
        }
      );
    
      // Hamburger to X toggle
      $('#nav-toggle').on('click', function() {
        console.warn("#nav-toggle: Hamburger <-> X Symbol");  
       this.classList.toggle('active');
      });
    
      // If a link has a dropdown, add sub menu toggle.
      $('nav ul li a:not(:only-child)').click(function(e) {
        console.warn("#nav-toggle: Submenu öffnen/schliessen von nav-dropdown und Event-Weiterleitung stoppen");
        $(this).siblings('.nav-dropdown').toggle();
    
        // Close one dropdown when selecting another
        $('.nav-dropdown').not($(this).siblings()).hide();
        e.stopPropagation();
       });
    
      $('html').click(function(e) {
         console.warn("#nav-toggle: Click woanders -> nav-dropdown verstecken");
         $('.nav-dropdown').hide();
       });
    }); // end DOM ready






    Angehängte Dateien
    Zuletzt geändert von wvhn; 26.08.2023, 15:18.

    #2
    Hallo Jörk,
    hast Du den Hinweis schon ausprobiert, den ich Dir in der letzten P/N gegeben habe?

    Hintergrund:
    die smartVISU-Seiten werden von jQuery mobile gesteuert. Dieses übernimmt die gesamte Navigation und hält die besuchten Seiten in einem sog. Multipage-Dokument im Speicher. Das ermöglicht den schnellen Seitenaufbau. Verglichen mit einem normalen html-Dokument sind die Visu-Seiten nur einzelne Abschnitte eines Gesamt-Dokuments. Die Navigation zu den einzelnen "Seiten" steuert jQm durch ajax. Die Option data-ajax="false" setzt diesen Mechanismus außer Kraft und erzwingt ein Neuladen der aufgerufenen Seite - auf Kosten der Performance.

    Weil die einzelnen "Seiten" nur Abschnitte eines Dokuments sind, müssen sie mit eindeutigen IDs unterscheidbar sein, damit die Navigation problemlos klappt. smartVISU hat Mechanismen, die das sicher stellen, vor allem bei den Widgets. Hier wird in der Regel eine ID aus der aufgerufenen Seite und der im Widget angegebenen ID zu einer "uid" zusammengebaut.

    Beim Header-Menü besteht die Besonderheit, dass immer wieder derselbe Code beim Rendern in jede einzelne Seite eingebunden wird. Bei Links, die nur eine statische ID haben (z.B. #nav-toggle) führt das dazu, dass man in einem Dokument doppelte IDs hat, sobald man einmal eine zweite Seite aufgerufen hat. Das geht dann natürlich schief. Deshalb muss man für einzigartige IDs sorgen. Das erreicht man, indem man die IDs wieder mit der Seite kombiniert, also z.B. "#overwiew_dg-nav-toggle". Das kann Twig automatisch machen, indem man schreibt
    Code:
    <a id={{ page }}-nav-toggle …
    Im javaScript-Code muss man dann natürlich die Selektoren anpassen. Anstatt
    Code:
    $('#nav-toggle')
    muss man jetzt nach IDs suchen, die auf "nav-toggle" enden.
    Code:
    $('[id$="nav-toggle"]')
    ist dafür der richtige Ausdruck, der auch als Selektor im CSS gültig ist.

    Gruß
    Wolfram

    Zuletzt geändert von wvhn; 05.02.2022, 09:26.

    Kommentar


      #3
      Hallo Wolfram,
      vielen Dank für Deine wieder super-schnelle Antwort. Ich hatte deine Tipps -so gut ich sie verstanden hatte- ausprobiert (allerdings ganz sicher unvollständig). Mit den letzten zusätzlichen Infos habe ich Folgendes geändert:

      menu.html:
      HTML-Code:
      <div class="nav-mobile"><a id={{ page }}-nav-toggle /**id="nav-toggle"*/ <a href="#!"><span></span></a></div>
      menu.css:
      Alle
      Code:
      #nav-toggle
      ersetzt durch
      Code:
      [id$="nav-toggle"]
      menu.js:
      Alle
      Code:
      $('#nav-toggle')
      ersetzt durch
      Code:
      $('[id$="nav-toggle"]')
      Leider war das Ergebnis exakt dasselbe, wie im ursprünglichen Post beschrieben.

      In der Entwicklerkonsole sieht man, dass die id jetzt wie erwartet zusammengesetzt wird und sich vom ursprünglichen Post unterscheidet:

      chrome.png

      Ich habe daraufhin einen weiteren Versuch gemacht, indem ich in menu.css und menu.js zusätzlich gezielt diese id mit hinterlegt habe, z.B. im js:
      Code:
      $('#index-sonos-nav-toggle').....
      Das Ergebnis bleibt leider unverändert.

      Habe ich etwas falsch interpretiert/vergessen ?

      Viele Grüsse
      Jörk

      Kommentar


        #4
        Hallo Jörk,

        in Deinen Seiten habe ich die menu.js nicht gefunden. Stattdessen ist das Skript in die menu.html eingebunden. Dann reicht es, dort die Selektoren auch in der Form
        Code:
        $('#{{ page }}-nav-toggle'
        zu schreiben. Das ist sogar noch besser, weil eindeutiger.
        Ansonsten sind die Änderungen, die Du gemacht hast, richtig.

        Ich habe dann zusätzlich in der menu.html alle IDs mit der Seite ergänzt. Bei mir im Test funktioniert das Menü nun recht gut. Ich schicke Dir mal die Dateien per P/N.

        Das Menü sieht so klasse aus, dass ich mich frage, ob wir es nicht auf github\smartvisu-newstuff zur Verfügung stellen sollen.

        Gruß
        Wolfram
        Zuletzt geändert von wvhn; 05.02.2022, 21:30.

        Kommentar


          #5
          ich muss das hier mal rauskramen

          ich frage mich ob man nicht diese Dropdown Menue (als Art Burgermenue) zumindest in der mobilen Ansicht einbauen könnte, dann wäre das durchnavigiren aufm Handy zB. deutlich einfacher

          in newstuff wurde das ja nicht veröffentlicht oder?

          Kommentar


            #6
            Moin Bonze, jksd

            ich habe das responsive menu nochmal überarbeitet und getestet. Die letzten "Hakeligkeiten" sind zumindest in meinen Tests beseitigt.
            Das Ergebnis findet sich jetzt auf smartvisu-newstuff.

            Die Datei menu.html kommt in den Ordner mit den eigenen Seiten und muss natürlich auf die eigene Menüstruktur angepasst werden. Die css-Datei kommt entweder in ./dropins oder in ./pages/DeineSeiten/css.

            Gruß
            Wolfram

            Kommentar


              #7
              Hallo Wolfram,

              super, dass das sporadische Hakeln bei den Kaskadenmenus jetzt auch Geschichte ist (lag für schlechte Winterwochenenden noch auf meiner ToDo-Liste). Funktioniert einwandfrei. Vielen Dank dafür ! Den Seitenvergleich $('[id^="{{ page }}"] hinzuzufügen ist auch plausibel.

              Viele Grüsse, Jörk

              Kommentar

              Lädt...
              X