
Die Verwendung eines Dropdown-Menüs <select> zur Navigation ist heutzutage nicht mehr so üblich wie früher, aber es ist immer noch vorhanden. Es wurde ziemlich stark dafür kritisiert, unzugänglich / aufdringlich zu sein. Tatsächlich sind viele der Skripte, die Sie dafür finden, so. Schade. Machen wir eines, das mit oder ohne JavaScript funktioniert!
Der AUFDINGLICHE Weg
<form>
<select onchange="window.open(this.options[this.selectedIndex].value)">
<option value="">Go to page...</option>
<option value="https://css-tricks.de/">CSS-Tricks</option>
<option value="http://digwp.com/">Digging Into WordPress</option>
<option value="http://quotesondesign.com/">Quotes on Design</option>
</select>
</form>
Inline JavaScript… es funktioniert, aber nur, wenn JavaScript aktiviert ist. Ohne JavaScript haben Sie ein Dropdown-Menü, das absolut nichts tut.
Der UNaufdringliche Weg
<form id="page-changer" action="" method="post">
<select name="nav">
<option value="">Go to page...</option>
<option value="https://css-tricks.de/">CSS-Tricks</option>
<option value="http://digwp.com/">Digging Into WordPress</option>
<option value="http://quotesondesign.com/">Quotes on Design</option>
</select>
<input type="submit" value="Go" id="submit" />
</form>
Ziemlich ähnlich, aber kein Inline-JavaScript. Stattdessen geben wir dem Formular eine ID, die wir später zum Zielen verwenden werden. Das Formular POSTet jetzt an sich selbst, und wir haben einen Submit-Button hinzugefügt, sodass das Formular funktionsfähig ist. Das Select hat jetzt einen Namenswert, sodass beim Drücken des Submit-Buttons ein Wert POSTet wird.
Ganz oben auf unserer Seite prüfen wir auf einen POST-Wert aus diesem Formular. Wenn er vorhanden ist, leiten wir die Seite zu diesem Wert um.
<?php
if (isset($_POST['nav'])) {
header("Location: $_POST[nav]");
}
?>
Kein JavaScript erforderlich, die Seitenumleitung wird vollständig über serverseitiges PHP abgewickelt. **HINWEIS**: Dies ist nur die vereinfachte PHP-Methode. Sie sollten den übermittelten Wert wahrscheinlich bereinigen, bevor Sie ihn an die Header-Funktion übergeben (insbesondere wenn Sie PHP vor 4.4.2 oder 5.1.2 ausführen), um „Header-Injection“-Angriffe zu verhindern.
Mit nur wenigen Zeilen jQuery können wir es jedoch genauso verhalten lassen wie die aufdringliche Methode.
- Verstecken Sie den Submit-Button.
- Wenn das Select geändert wird…
- Umleitung zum Wert der Option
$(function() {
$("#submit").hide();
$("#page-changer select").change(function() {
window.location = $("#page-changer select option:selected").val();
})
});
Update
Leser David Vandenbroek schreibt
Ich habe festgestellt, dass die Verwendung von
<select onChange="window.open(this.options[this.selectedIndex].value)">
ein Popup-Warnungsdialog öffnet und, wenn erlaubt, ein neues Fenster auf dem iPhone/iPad, wenn iOS Safari die Einstellung „Pop-ups blockieren“ auf AUS hat. Wenn die Einstellung auf EIN steht, passiert nichts.
Um beide unerwünschten Verhaltensweisen zu vermeiden, habe ich verwendet
<select onChange="window.location.replace(this.options[this.selectedIndex].value)">
stattdessen.
Ich bin ausflippen, ich suche seit einer Stunde nach genau diesem! Ich sagte mir: „Ich weiß, dass CSS-TRICKS es haben wird, lass es mich mal ansehen.“ Keine Suche nötig. Vielen Dank für eine so umfassende Seite.
Auch schön zu bemerken, dass der unaufdringliche Weg kein neues Fenster erzwingt.
Oder ist das eine andere Ursache :D
Ist es nicht schlau, eine Art Validierung vor der Header-Funktion zu haben? Oder übersehe ich hier etwas?
Dies wäre eine Möglichkeit
Es ist lustig. Meistens bekomme ich Projekte, bei denen der Kunde etwas verlangt. Das erste, was ich tue, ist, css-tricks zu überprüfen, und jedes Mal bin ich überrascht, ja, es gibt einen neuen Beitrag und es ist genau das, wonach ich gesucht habe. Es ist, als ob dieser Typ meine Gedanken liest!
Das werde ich wahrscheinlich nicht nützlich finden, aber sehr nett trotzdem :P
Eine andere Sache, es gab einmal einen Artikel über No-CSS-No-Images-Lösungen, und er scheint verschwunden zu sein. Wo ist er? Danke :P
Ich mag das neue Design von CSS Tricks!
Gute Arbeit, Chris! ..
Kuss (K)
Ich würde gerne sehen, wie man diese stylt
Schön… Vor weniger als einer Woche dachte ich, eine Funktion wie diese wäre eine nette Ergänzung für meine benutzerdefinierte Startseite bei der Arbeit, habe mir nur noch nicht die Zeit genommen, nachzusehen, wie es gemacht wird. Ihre Zeitplanung könnte kaum besser sein.
Danke.
Das ist cool. Funktioniert gut, wenn Javascript deaktiviert ist. Ich stimme Kristoffer zu, die URL sollte validiert/geprüft werden, bevor sie in header() geht.
Sie sollten auch ein exit; nach header() einfügen, um zu verhindern, dass der Code unterhalb des header()-Aufrufs ausgeführt wird.
Siehe die PHP-Handbuchseite für die Informationen: http://nl.php.net/manual/en/function.header.php
Ich mochte Dropdown-Navigationsmenüs nie wirklich, aber ich könnte mir vorstellen, etwas wie dies zu implementieren, unter den richtigen Umständen. Guter Beitrag!
Chris, ich muss zugeben, dass ich den Trick, wie das Unaufdringliche funktioniert, nicht wirklich verstehe. Ein neuer Podcast könnte helfen :)
Die Verwendung von Comboboxen zur Seitenauswahl ist ein sehr schlechtes UI-Design. Verwenden Sie immer Anker für diesen Zweck und denken Sie an PDA/Mobile-Benutzer.
Der Nachteil ist, dass diese Art von Navigation überhaupt nicht zugänglich ist. Was ich getan habe, war HTML wie
Und ein Javascript, das das HTML in eine Select-Box umgewandelt hat.
Das liegt daran, dass unser Designer Select-Boxen als Navigationsmittel liebte, was meiner Meinung nach einfach falsch ist, da es eine missbräuchliche Verwendung eines Formularelements ist.
Ich bevorzuge es, einfach die ul zu verwenden und sie als eine Art Menü zu stylen, entweder mit Suckerfish oder mit raffinierten JavaScript-Effekten.
Das ist in Ordnung, wenn Sie nur 3 Auswahlen zur Auswahl haben.
Ich plane jedoch, dies für den Verkauf von Tickets für Konzerte/Veranstaltungen über Brown Paper Tickets zu verwenden. Und wir haben 20 Veranstaltungen im Monat. Das wird in einer Liste etwas unhandlich.
Das ist eine gute Lösung.
Mein Punkt ist, dass Sie entweder die Liste über Javascript in eine Select-Box umschreiben (was Benutzern ohne Javascript und Suchmaschinen ermöglicht) oder CSS verwenden, um eine Liste wie eine Select-Box zu stylen (indem Sie sie auf position:absolute setzen, ihre Höhe auf eine Zeile und einen Hover, um sie zu erweitern (optional über scriptaculous)).
So können Sie das Beste aus beiden Welten haben.
Ich bin bei Dmitry. Ich kämpfe darum, den Sinn darin zu sehen, ein Formularelement für die Navigation zu verwenden – es ist meiner Meinung nach nicht semantisch und schlechte Benutzerfreundlichkeit. Warum nicht eine gestylte Liste und, wenn Sie unbedingt müssen, ein bisschen JS verwenden.
Ich mag diese Lösungen normalerweise nicht, aber sie sind perfekt für eine Submenü-Mobile-Navigation für kleinere Websites!
Ich muss also alle meine Seiten in PHP schreiben, nur um eine halb unzugängliche Navigation zu haben, die von den Suchmaschinen ignoriert wird?
Wo ist der Vorteil?
JA. SIE MÜSSEN SOFORT ALLES UMSCHREIBEN.
Ähm. Nein. WENN Sie bereits ein Dropdown-Menü wie dieses haben, ist DIES eine Möglichkeit, es weniger aufdringlich zu machen. Und PHP ist keine Voraussetzung, Sie können jede serverseitige Technologie verwenden, die Formulardaten akzeptieren und eine Umleitung durchführen kann.
James, wenn die Links im Formular von Suchmaschinen ignoriert würden, wären Millionen von Websites nicht im Index. Das Durchsuchen einer von Dreamweaver erstellten Seite ist schwieriger als die Herrschaft über Afghanistan. Sie enthält kaum etwas, was wir HTML nennen. Es sind unzählige Klick-Ereignisse. Was ich sagen will
Wenn es einen Link gibt, bekommt Google ihn.
nette Art, es zu tun, danke fürs Teilen :)
Ihr Blog ist so cool! Ich suche nach Wegen, meinen Blog zu bewerben. Das ist besonders hilfreich. Bitte besuchen Sie meinen Blog.
http://www.ishtihari.blogspot.com
Gute Arbeit, Chris. Danke
Das ist eine falsche Verwendung von POST; es sollte stattdessen GET verwendet werden.
Ja... dieser Typ kann wirklich unsere Gedanken lesen... danke Typ...
Gesendet von Hendrik Walter
Dies ist eine Möglichkeit, die aufdringliche Methode mit dem PHP-Zeug zu kombinieren, damit sie auf die gleiche Weise funktioniert, nur ohne jQuery
<form action="" method="post"> <select name="nav" onchange="window.open(this.options[this.selectedIndex].value)"> <option value="">Go to page...</option> <option value="https://css-tricks.de/">CSS-Tricks</option> <option value="http://digwp.com/">Digging Into WordPress</option> <option value="http://quotesondesign.com/">Quotes on Design</option> </select> <noscript> <input type="submit" value="Go" id="submit" /> </noscript> </form> <?php if (isset($_POST['nav'])) { // you should validate $_POST[nav] here header("Location: $_POST[nav]"); } ?>Danke Chris!
Entschuldigung Chris, ich persönlich halte das für den schlechtesten Artikel, den ich auf CSS Tricks gelesen habe.
Sie scheinen eine sehr schlechte Praxis am Beispiel zu befürworten.
Entfernen Sie zumindest das onchange-Verhalten und nehmen Sie diesen „Go“-Button aus dem noscript.
Das würde es zumindest für die meisten Leute benutzbar machen.
Es ist besser zu verwenden
location.assign(this.options[this.selectedIndex].value)anstelle von
window.location.replace(this.options[this.selectedIndex].value)weil location.replace nicht im Browserverlauf ist und die Zurück-Taste deaktiviert.