2017-11-28 3 views
-1

ich ein Webprojekt mit Node/Express/Lenker habejQuery Click-Ereignis, nachdem neue Seite geladen

ich eine klebrige Navigation auf der Seite habe, die teilweise durch einen handel gemacht wird.

Wenn ein Link angeklickt wird und die Seite geladen wird, möchte ich den aktiven Status zu dem Element ändern, auf das geklickt wurde. Ich habe sowohl .click() als auch .on('click', child, callback) ausprobiert. Es funktioniert, wenn ich darauf klicke, aber es wird zurückgesetzt, nachdem das DOM neu geladen wurde.

Vielen Dank für Ihre Hilfe Stackoverflow.

Hier ist meine jQuery:

//NAVIGATION ACTIVES 
$('.stickynav').on('click', '.platform-nav', 
    function() { 
    $('.main-hand').removeClass("nav-active"); 
    $('.sticky-hand').removeClass("nav-active"); 
    $(this).addClass("nav-active"); 

    }); 
$('.stickynav').on('click', '.tools-nav', 
    function() { 
    $('.main-hand').removeClass("nav-active"); 
    $('.sticky-hand').removeClass("nav-active"); 
    $(this).addClass("nav-active"); 
    }); 
$('.stickynav').on('click', '.diensten-nav', 
    function() { 
    $('.main-hand').removeClass("nav-active"); 
    $('.sticky-hand').removeClass("nav-active"); 
    $(this).addClass("nav-active"); 
    }); 
$('.stickynav').on('click', '.blog-nav', 
    function() { 
    $('.main-hand').removeClass("nav-active"); 
    $('.sticky-hand').removeClass("nav-active"); 
    $(this).addClass("nav-active"); 
    }); 

und HTML (.hbs):

<div class="stickynav" data-spy="affix"> 
    <div class="hands-connector"> 
     <img src='/img/connector-sticky.png' /> 
    </div> 


<div class="hands-sticky"> 
    <div class="sticky-hand platform-nav nav-active" id="platform-sticky"> 
    <a href="/">  <img src="/img/platform-sticky.png" alt="Naar kennisplatform" /> 
      <p>Kennisplatform</p></a> 

    </div> 
    <div class="sticky-hand tools-nav" id="tools-sticky"> 
    <a href="/tools"> 
     <img src="/img/tools-sticky.png" alt="Naar gratis tools" /> 
     <p> 
      Tools 
     </p> 
     </a> 
    </div> 
    <div class="sticky-hand diensten-nav" id="diensten-sticky"> 
    <a href="/diensten"> 
     <img src="/img/diensten-sticky.png" alt="Naar diensten" /> 
     <p> 
      Diensten 
     </p> 
    </a> 
    </div> 
    <div class="sticky-hand blog-nav" id="blog-sticky"> 
    <a href="/blog?page=1"> 
     <img src="/img/blog-sticky.png" alt="Naar blog" /> 
     <p> 
     Blog 
     </p> 
    </a> 
    </div> 
</div> 
</div> 

und die CSS-Klasse als Referenz (deaktiviert den Link):

.nav-active { 
    text-decoration:none; 
    color:black; 
    -webkit-filter: drop-shadow(1px 1px 0 blue) drop-shadow(-1px -1px 0 blue); 
    -ms-filter: drop-shadow(1px 1px 0 blue) drop-shadow(-1px -1px 0 blue); 
    filter: drop-shadow(1px 1px 0 blue) drop-shadow(-1px -1px 0 blue); 
    pointer-events:none; 
    cursor:default; 
} 
+0

Sollte die Klasse beim Laden der Seite ... basierend auf der aktuellen URL geladen werden. Nach einem Klick auf einen Link ist das aktuelle Seitenskript verschwunden und es beginnt wieder auf der neuen Seite – charlietfl

+0

Ich dachte gerade darüber nach, aber um 6:15 Uhr habe ich keine Ahnung, wie ich das machen soll. Alle Hinweise würden sehr geschätzt werden. Natürlich könnte ich immer nur die stickynav ohne eine teilweise in ihren jeweiligen Vorlagen hinzufügen und manuell die Klasse dort. Aber ich dachte, dass jQuery mir hier helfen könnte und die Wiederverwendung von Code verhindern würde. – Kyriediculous

+0

Es gibt viele, viele ähnliche Fragen dazu, wie dies beim Laden der Seite zu tun ist. Sie vergleichen im Grunde nur die 'href' der Nav-Links mit der' location' ... wenn alle 'href' relativ sind, vergleichen Sie sie mit' location.pathname' – charlietfl

Antwort

1

I‘ Ich bin mir nicht sicher, ob das, was Sie versuchen zu tun, möglich ist oder nicht.

Wenn die Seite neu geladen wird, verlieren Sie jeden Status, der nicht irgendwie gesichert wurde. Sie benötigen also eine Art von Datenquelle oder Sitzung.

Wenn Sie die Seite nicht benötigen, um neu zu laden, können Sie "false zurückgeben"; Am Ende Ihrer Klick-Funktionen sollte dies verhindern, dass die Seite neu geladen wird und Sie die gewünschten Klassenänderungen erhalten.

wenn Ihr Click-Ereignis die Route ändert, würde ich einen Skript empfehlen, läuft nach dem Laden der Seite abgeschlossen ist (auf Dokument bereit)

$(function() { your code here }) 

, das die aktuelle Route überprüft und setzt die CSS-Klassen gibt basierend auf der Route. (Statt auf das, was geklickt wurde, da Sie diese Informationen auf einer Seite zu laden verlieren werde, aber Sie werden immer noch die Strecke haben.)

location.href 
+0

Die Links verweisen direkt auf verschiedene Routen, die auf ihrer Runde Lenker-Vorlagen rendern . Würde ein Standardlayout verhindern, dass die Navigation bei einer Routenänderung neu geladen wird? Kann ich .click (function() {$ (document) .load (Rückruf)};? – Kyriediculous

+0

Es gibt Single Page Anwendungen (SPA), die die Route ändern können, ohne eine Seite zu laden, aber in Ihrem Fall von a Beim erneuten Laden der Seite würde ich ein Skript empfehlen, das ausgeführt wird, nachdem der Ladevorgang abgeschlossen ist (auf dem Dokument bereit) $ (function() {Ihr Code hier}), der die aktuelle Route prüft und dort die css-Klassen basierend auf der Route festlegt basierend auf dem, was geklickt wurde, da Sie diese Informationen beim Laden einer Seite verlieren, aber Sie werden immer noch die Route haben) – Jesse

+0

Danke für die Bearbeitung, und die Hilfe natürlich! Mit einigen googeln herum fand ich diese Regex zu teile die URL und erhalte die Strings für die Pfade, die ich brauche, um einfach zu arbeiten. var pfad = window.location.href.split (/^(([^: \ /? #) +):)? (\/\/([^ \ /? #] *))? ([^? #] *) (\? ([^ #] *))? (# (. *))? /); var path = Pfad [5] gibt das erste Verzeichnis ohne Abfragen an. – Kyriediculous

1

HTTP is stateless.

Jedes Mal, wenn eine Seite aktualisiert wird, ist ihr Status verloren und Ihre Seite weiß nicht, wo sie war. Also müssen Sie herausfinden, wie Sie den Status auf Ihren Seiten beibehalten können.

Beispielsweise können Sie this API des Browsers verwenden, um den Status im lokalen Speicher beizubehalten. Lokaler Speicher ist für einen Hostnamen persistent. Wenn Sie also auf einen Link klicken, können Sie seine Details im lokalen Speicher speichern. Wenn Ihr DOM wieder bereit ist, können Sie den gleichen Wert aus dem lokalen Speicher lesen und diesen Link aktivieren.

Weitere Möglichkeiten finden Sie in this discussion.

+0

Verwenden Sie localStorage, um die Navigation zu verfolgen ist hässlich .... verwenden Sie einfach die 'location' – charlietfl

1

Sie können es nicht so machen, denn wenn die Seite neu geladen wird, ist es eine komplett neue HTTP-Anfrage und sie verliert die letzte, die auf der vorherigen Seite ausgeführt wurde.was Sie tun, auf die URL basiert können Sie die class = „nav-aktiv“ mit Server-Side-Scripting so etwas wie Sie können, sagen Sie mit PHP dann versuchen

Einstellung $ page = „Plattform“

einstellen

und beim Schreiben von HTML können Sie hinzufügen

<div class="sticky-hand tools-nav" id="tools-sticky" class="<?php ($page=='tools')?"active":"" ?>" > 
<div class="sticky-hand platform-nav" id="tools-sticky" class="<?php ($page=='platform')?"active":"" ?>" > 
+0

Was ist mit dem PHP? Kein PHP-Tag zu dieser Frage. OP führt Node/Express auf dem Server – charlietfl

+0

aus, was nur ein Beispiel für das Hinzufügen dynamischer Klassen über PHP ist. Ich bin sicher, dass Node etwas Ähnliches haben wird. – Arpita

Verwandte Themen