HTML Was haltet ihr von diesem Code?

Techniktype

Cadet 4th Year
Registriert
Jan. 2020
Beiträge
121
Code:
<style>
/* Searchbox + Searchcontent */
input, 
button{
    outline: none;
}
.search-box{
    font-family: Arial;
    position: relative;
    margin: 7px;
    display: block;
    float: left;
}
.search-input{
    padding: 11px;
    border: none;
    background-color: #fff;
    border: 1px solid #c62828;
}
.search-btn{
    padding: 12px;
    margin-left: -6px;
    background-color: #c62828;
    border: none;
    color: #fff;
    cursor: pointer;
}
.search-content{
    position: absolute;
    top: 100%;
    background-color: #fff;
    width: 100%;
    height: 150px;
    max-height: 0px;
    overflow: hidden;
    z-index: 0;
    transition: max-height .25s ease;
    box-shadow: 0px 1px 5px 0px #333;
    height: auto;
    border-radius: 0px 0px 5px 5px;
}
.search-input:focus ~ .search-content, 
.search-content:hover{
    max-height: 150px;
}
.search-con1{
    /* damit oben ein Border entsteht und der 
    Inhalt nicht am Hintergrund der Seite klebt */
    padding: 5px 0px;
}
.search-con2{
    max-height: 140px;
    /*Nochmal ein Border damit der Hintergrund 
    von Link:hover nicht am Rand klebt */
    padding: 0px 5px;
    overflow: auto;
}
.search-content a{
    display: block;
    padding: 8px 20px;
    font-size: 15px;
    font-weight: 100;
    border-radius: 5px;
    text-decoration: none;
    cursor: pointer;
    color: #c62828;
}
.search-content a:hover{
    background-color: #c62828;
    color: #fff;
    box-shadow: inset 0px 0px 10px 2px #851414;
}
.not-found{
    color: #b71c1c;
    display: none;
    padding: 10px 20px;
    font-weight: 700;
}
</style>
<form class="search-box">
    <input class="search-input" id="search-input" type="search" oninput="search();" onkeyup="search();" autocomplete="off">
    <button class="search-btn">Suchen</button>
    <div class="search-content">
        <div class="search-con1">
            <div class="search-con2">
                <a href="">Link 1</a>
                <a href="">Link 2</a>
                <a href="">Link 3</a>
                <a href="">Link 4</a>
                <a href="">Link 5</a>
                <a href="">Link 6</a>
                <a href="">Link 7</a>
                <a href="">Link 8</a>
                <a href="">Link 9</a>
                <a href="">Link 10</a>
                
                <p id="not-found" class="not-found">nichts gefunden</p>
            </div>
        </div>
    </div>
</form>
<script>
    var searchinput = document.getElementById("search-input");
    var items = document.querySelectorAll(".search-content a");
    var array = [];
    var itemslen = items.length;
    var notfound = document.getElementById("not-found");
    
    for(var i = 0; i < itemslen; i++)
        array.push(items[i].innerHTML.toLowerCase());

    function search() {
        var integer = 0;
        var string = searchinput.value.toLowerCase();
        for(var i = 0; i < itemslen; i++) {
            if(array[i].indexOf(string) == -1)
                items[i].setAttribute('style', 'display:none');
            else{
                items[i].setAttribute('style', 'display:block');
                integer++;
            }
        }
        if(integer == 0)
            notfound.setAttribute('style', 'display:block');
        else
            notfound.setAttribute('style', 'display:none');
    }
</script>
Ich hoffe es ist verständlich was der Code macht, sonst mal in ne HTMLdatei packen un anschauen.

Ich möchte wissen wie ihr den Code bezüglich Geschwindigkeit, Aussehen und Scriptgröße findet.

Ich wüsste ehrlich gesagt nicht wie ich ihn verbessern könnte ohne den Effekt den ich möchte zu erhalten. Aber die Verschachtelung mit search-con1 und -2 gefällt mir nicht so wirklich...
Bin ich ein ziemlich schlechter Entwickler?
Ich wollte vielleicht ein Webprojekt starten...

Liebe Grüße :)
 
Junge vieleicht wäre es hilfreich zu erklären was du vorhast bevor ich das jetzt abspeichere und du danach alle Daten von mir hast eventuell mit Vorschaubild
 
  • Gefällt mir
Reaktionen: Madman1209
Du könntest den "Such-Items" auch einfach Klassen gemäß dem Inhalt geben und dann einfach alles ausblenden, anhand der Klasse selektieren (statt mit der for-Schleife) und dann dieses spezielle Item einblenden.

Wenn die Leerzeichen in der Suche (z. B. "Link 8") nötig sind, kannste statt einer Klasse z. B. auch ein data-Attribut verwenden und darauf selektieren. Wäre auf jeden Fall alles einfacher, wartbarer und besser, als die Schleifen.

Geht mit Plain-JS, noch einfacher mit jQuery.
 
  • Gefällt mir
Reaktionen: Techniktype
Matze051185 schrieb:
Junge vieleicht wäre es hilfreich zu erklären was du vorhast bevor ich das jetzt abspeichere und du danach alle Daten von mir hast eventuell mit Vorschaubild
Es ist ein Script welches eine Suchbox darstellt mit 10 Items die darunter angezeigt werden und jenachdem was man eingibt unsichtbar bzw. sichtbar gemacht werden.
 
Exterior schrieb:
Du könntest den "Such-Items" auch einfach Klassen gemäß dem Inhalt geben und dann einfach alles ausblenden, anhand der Klasse selektieren (statt mit der for-Schleife) und dann dieses spezielle Item einblenden.

Wenn die Leerzeichen in der Suche (z. B. "Link 8") nötig sind, kannste statt einer Klasse z. B. auch ein data-Attribut verwenden und darauf selektieren. Wäre auf jeden Fall alles einfacher, wartbarer und besser, als die Schleifen.

Geht mit Plain-JS, noch einfacher mit jQuery.
Wie soll man denn eine Abfrage ohne Schleife machen? Das verstehe ich irgendwie nicht 🤔

Danke für deine Antwort :)
 
Nur überflogen und ein paar JS Code-Style Empfehlungen. Es gibt 100 Wege etwas zu bauen. Man könnte das ganze auch funktionaler programmieren, oder mehr kleinere Funktionen schreiben. Es gibt nicht DEN besten weg nur Pro und Contra. Auf dem Erfahrungslevel würde ich einfach erstmal weiter machen und Erfahrungen sammeln und immer dabei Fragen. Welche Wege gibt es noch? Welche Lösung ist besser lesbar bzw. verständlich. Und welche ist performanter. Gerade Verständlichkeit und Lesbarkeit wird massiv unterschätzt von Anfängern.

  • Bei jeden if/Schleife { } verwenden, auch wenn es in JS kein muss ist. Es führt einfach immer wieder zu Fehlern wenn doch mal falsch ungebrochen wird.
  • Immer === benutzen und nicht ==, den == führt implizit Typ-Wandlungen, was auch immer wieder zu fehlern führt.
  • Event-Handler direkt im JS und nicht an HTML Elemente. Warum suchst du auf 'input' und 'keyup'? Empfehlung wäre sonst mal debounce nachzulesen. Es kommt immer auf das gewünschte Resultat an, aber oft ist das für Input-Events hilfreich um die Funktion nicht unnötig oft bei vielen Events auszuführen.
  • Variablen besser benennen. Integer und String sagt erstmal nicht viel ausser der gewünschten Typ. Was ist die Aufgabe?

Wenn du Spass hast, starte unbedingt etwas. Nur so lernt man dazu. Und schlecht ist nur wer nicht hinterfragt und nicht dazu lernen will.
 
  • Gefällt mir
Reaktionen: Techniktype
Techniktype schrieb:
Ich möchte wissen wie ihr den Code bezüglich Geschwindigkeit, Aussehen und Scriptgröße findet.
Größe und Geschwindigkeit: Das Beispiel ist viel zu klein um da irgendwo sinnvoll zu optimieren.

Rein vom Konzept würde ich die Daten die selektiert werden sollen bei sowas in eine extra json- oder xml-Datei zu packen anstatt ins HTML. Einfach damit Daten, Logik und Darstellung getrennt sind.
 
  • Gefällt mir
Reaktionen: Techniktype
Piktogramm schrieb:
Größe und Geschwindigkeit: Das Beispiel ist viel zu klein um da irgendwo sinnvoll zu optimieren.

Rein vom Konzept würde ich die Daten die selektiert werden sollen bei sowas in eine extra json- oder xml-Datei zu packen anstatt ins HTML. Einfach damit Daten, Logik und Darstellung getrennt sind.
naja es ist nicht der orinigal Code ich habe ihn einigermaßen lesbar gemacht. Es ist eigentlich sowohl css als auch js nicht in dieser Datei.
Ergänzung ()

askling schrieb:
  • Event-Handler direkt im JS und nicht an HTML Elemente. Warum suchst du auf 'input' und 'keyup'? Empfehlung wäre sonst mal debounce nachzulesen. Es kommt immer auf das gewünschte Resultat an, aber oft ist das für Input-Events hilfreich um die Funktion nicht unnötig oft bei vielen Events auszuführen.
  • Variablen besser benennen. Integer und String sagt erstmal nicht viel ausser der gewünschten Typ. Was ist die Aufgabe?
Das erste Verstehe nicht so ganz, Wird die Funktion zweimal ausgeführt? Was genau ist der Vorteil das mit Javascript die Funktion zu "verbinden"?

Mit den Variablen namen bin ich sehr unkreativ da mir eigentlich nie der Name einfällt der passen würden, daher kommt -bestensfalls- sowas bei raus. Meisten nenne ich die Variablen ganz anders , dummerweise für andere schwer nachvollziehbar, lange Namen kosten ja auch mehr Leistung? 🤔
 
@Techniktype
Genau so, wie du eben auf Klassen selektierst, z. B. hier:

Code:
var items = document.querySelectorAll(".search-content a");

Damit kannste genauso gut auf eine Klasse oder ein attribut selektieren, das deiner Suche entspricht.
Wie gesagt, geht besser mit jQuery, geht aber auch ohne.
 
  • Gefällt mir
Reaktionen: Techniktype
Exterior schrieb:
@Techniktype
Genau so, wie du eben auf Klassen selektierst, z. B. hier:

Code:
var items = document.querySelectorAll(".search-content a");

Damit kannste genauso gut auf eine Klasse oder ein attribut selektieren, das deiner Suche entspricht.
Wie gesagt, geht besser mit jQuery, geht aber auch ohne.
Achsoo jetzt verstehe ich, darauf bin ich garnicht gekommen! :)

also querySelectorAll("[attributname="+suchbegriff+"]"); sozusagen? Das Problem wäre dann aber doch das wenn ich nicht genau den vollständigen Namen des Attributes Treffe nichts kommt?

Ach zum CSS habt ihr noch nichts gesagt was ihr von den Verschachtelungen haltet :)
 
Hier, das ist nur mal fix hin gehackt: https://jsfiddle.net/ukL9xhrz/

mit [attribut*=] macht man ein "enthält".
Wenn man jQuery bemühen würde, könnte man sich sogar die Schleifen sparen (ich will nicht sagen, das man für jeden Mist jQuery einbinden soll, nur zeigen, was möglich wäre).
Ergänzung ()

So könnte das ganze mit jQuery aussehen:

https://jsfiddle.net/ey69q7n2/
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Techniktype
Exterior schrieb:
Hier, das ist nur mal fix hin gehackt: https://jsfiddle.net/ukL9xhrz/

mit [attribut*=] macht man ein "enthält".
Wenn man jQuery bemühen würde, könnte man sich sogar die Schleifen sparen (ich will nicht sagen, das man für jeden Mist jQuery einbinden soll, nur zeigen, was möglich wäre).
Ergänzung ()

So könnte das ganze mit jQuery aussehen:

https://jsfiddle.net/ey69q7n2/
Ich verstehe den Ifabsatz nicht, der müsste doch in die forschleife hineinkommen sonst wird es nur einmal ausgeführt?
Die Webseite lässt leider nicht zu das ich einen Teil des Codes kopieren das du genau weißt wo ich nicht verstehe
 
@Techniktype
Nicht nur Style, script auslagern sondern auch data ;)
Wenn das Projekt größer ist, wäre auch die Frage wie viel größer und was es genau für Daten sind. Man erreicht schnell den Punkt wo die Datenverarbeitung über einen Datenbankserver und nicht beim Clienten stattfinden sollte.

Was Exterior gemacht hat, ist das Durchsuchen in der Schleife durch Funktionen von jQuery zu ersetzen. In der Funktion der Bibliothek werden dann fröhlich Schleifen durchlaufen.
 
  • Gefällt mir
Reaktionen: Techniktype
Piktogramm schrieb:
@Techniktype
Nicht nur Style, script auslagern sondern auch data ;)
Wenn das Projekt größer ist, wäre auch die Frage wie viel größer und was es genau für Daten sind. Man erreicht schnell den Punkt wo die Datenverarbeitung über einen Datenbankserver und nicht beim Clienten stattfinden sollte.

Was Exterior gemacht hat, ist das Durchsuchen in der Schleife durch Funktionen von jQuery zu ersetzen. In der Funktion der Bibliothek werden dann fröhlich Schleifen durchlaufen.
Du meinst MySQL oder externe .html oder .txt Dateien?
Wie meinst du das man sollte es nicht beim Clienten verarbeiten Javascript anfragen an eine Datenbank, wie Ajax?

Naja mit jQuery hab ich früher auch mal gearbeitet aber naja da hat man direkt ne Menge Code der geladen werden muss...ich hatte ehrlich gesagt weniger Fehler ohne jQuery :)

Ich weiß ehrlich gesagt nichtmal genau wozu es gut ist außer vereinfachter Code?

Tut mir Leid das ich so viele Fragen stelle ich steh immer schnell auf dem Schlauch
 
außer vereinfachter Code?

Das trifft es eigentlich schon ziemlich genau. jQuery ist eben eine Bibliothek, die das arbeiten mit Javascript durch viele Sachen vereinfacht.

Ich weiß leider nicht, welches if du meinst. Aber prinzipiell hat Piktogramm recht, ich selektiere da alle betroffenen Items und statt die dann in einer Schleife auszublenden, kann ich die - dank jQuery - eben alle auf einmal ausblenden / einblenden.
 
  • Gefällt mir
Reaktionen: Techniktype
ok der einzige Vorteil wenn ich richtig verstehe ist dann das jQuery alles in einem ausblendet also das css nur einmal aktualisiert und mit meinem Script würde es so oft aktualisiert wie die Schleife laufen muss oder läuft im Browser im Grunde genommen dasselbe ab?

Ich finde jQuerycode eigentlich überhaupt nicht einfach :)
 
Techniktype schrieb:
naja es ist nicht der orinigal Code ich habe ihn einigermaßen lesbar gemacht. Es ist eigentlich sowohl css als auch js nicht in dieser Datei.
Ergänzung ()


Das erste Verstehe nicht so ganz, Wird die Funktion zweimal ausgeführt? Was genau ist der Vorteil das mit Javascript die Funktion zu "verbinden"?

Mit den Variablen namen bin ich sehr unkreativ da mir eigentlich nie der Name einfällt der passen würden, daher kommt -bestensfalls- sowas bei raus. Meisten nenne ich die Variablen ganz anders , dummerweise für andere schwer nachvollziehbar, lange Namen kosten ja auch mehr Leistung? 🤔


Schreib mal ein 'console.log("Search"); in deine search funktion und schau beim tippen in die Browserconsole.
Es gibt ein event beim 'change' und beim 'keydown', d.h. beim tippen wird search z.t. öfter als 1 mal pro eingefügtem Zeichen ausgeführt. Das scheint mir unnötig.

Vorteil Eventlistener direkt im JS zu nutzen ist einfach Trennung von Markup und Code. Und man ist deutlich flexibler. https://wiki.selfhtml.org/wiki/JavaScript/DOM/EventTarget/addEventListener

Genau die Frage auf die Antwort "was beschreibt die Variable denn eigentlich am besten?" ist eben so hilfreich. Es schult das Denken und macht den Code lesbarer. Die länge der Variablen ist wirklich 100% egal für die Performance. Es kostet höchstens wenige Byte mehr Speicher. Solange du nicht irgendwelche Embedded Systeme mit 50kb Ram Programmierst ist es echt total egal. :-)

JQuery halte ich heute für absolut kein muss mehr. Wir immer weniger benutzt und ist z.T. langsam. Ich finde es auch sehr angenehm zu schreiben, aber plain JS ist auf keinen Fall schlechter und meist sogar schneller. Gerade zum lernen, weil einem nicht alles abgenommen wird. Lieber mit dem Basics "denken" lernen. Biblioteken kann man später immer einfach dazu nehmen. Ist aber auch nur meine Meinung. Gibt kein falsch und richtig.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Exterior und Techniktype
askling schrieb:
Schreib mal ein 'console.log("Search"); in deine search funktion und schau beim tippen in die Browserconsole.
Es gibt ein event beim 'change' und beim 'keydown', d.h. beim tippen wird search z.t. öfter als 1 mal pro eingefügtem Zeichen ausgeführt. Das scheint mir unnötig.

Vorteil Eventlistener direkt im JS zu nutzen ist einfach Trennung von Markup und Code. Und man ist deutlich flexibler. https://wiki.selfhtml.org/wiki/JavaScript/DOM/EventTarget/addEventListener

Genau die Frage auf die Antwort "was beschreibt die Variable denn eigentlich am besten?" ist eben so hilfreich. Es schult das Denken und macht den Code lesbarer. Die länge der Variablen ist wirklich 100% egal für die Performance. Es kostet höchstens wenige Byte mehr Speicher. Solange du nicht irgendwelche Embedded Systeme mit 50kb Ram Programmierst ist es echt total egal. :-)

JQuery halte ich heute für absolut kein muss mehr. Wir immer weniger benutzt und ist z.T. langsam. Ich finde es auch sehr angenehm zu schreiben, aber plain JS ist auf keinen Fall schlechter und meist sogar schneller. Gerade zum lernen, weil einem nicht alles abgenommen wird. Lieber mit dem Basics "denken" lernen. Biblioteken kann man später immer einfach dazu nehmen. Ist aber auch nur meine Meinung. Gibt kein falsch und richtig.
50kb sind im Datentransfer zB. aber schon ziemlich viel, der Download braucht bei mr ungefähr 10Sekunden Upload meist ein Timeout bei der Größe ^^
Also es kommt drauf an was man als Standart betrachtet ;)
Es gibt aber glaube ich auch Tools die Variablen, Klassen und Funktionsnamen verkürzen. Mit Hand habe ich das mal versucht, lieber nicht nachmachen 😆 sehr Fehleranfällig und mühselig. Außerdem wird man um den Verstand gebracht wenn man nur noch a1, bf, c0d usw. sieht 😂

Von PlainJS habe ich noch nie gehört. Muss man diese ganzen Frameworks kennen? Ich habe hauptsächlich nur mit "Vanilla"-Code gearbeitet.

und welches Event würdest du empfehlen damit es während dem Tippen sich ändert und nicht erst (wie bei change) wenn man den Focus verlässt. Also schon Live.

Wisst ihr eigentlich wie man korrekt ::backdrop nutzt? Es scheint nicht so recht zu funktionieren bei mir.
 
plain js = vanilla js

wenn es dir um kleine größe bei der übertragung geht, vom code der auf dem server lieg wo leute drauf zugreifen sollen, dann jagt man den eigentlich eh durch 'minifier' wenn man an der stelle optimieren möchte. das wird dadruch maximal kurz. das solltest du nicht von hand machen. das macht man natürlich nicht zum entwickeln sondern erst danach. :-) halte ich bei deiner programmgröße aber erstmal für nicht so wichtig, bau lieber erstmal was dir spass macht. diese optimierungen kann man immer noch machen und sind nicht das spannende am coden.

spontan, das 'change' event sollte eigentlich reichen. das wird doch auch beim tippen gefeuert, oder was klappt damit nicht?
 
  • Gefällt mir
Reaktionen: Techniktype
Zurück
Oben