Das Denken hinter der Vereinfachung von Ereignishandlern
Apr 21, 2025 am 10:31 AMEreignisse werden verwendet, um auf Benutzerklicks, Tastaturfokus -Links und den Text zu ?ndern. Als ich anfing, JavaScript zu lernen, schrieb ich komplexe Event -H?rer. Vor kurzem habe ich gelernt, wie man die Menge an Code und die Anzahl der Zuh?rer reduziert.
Beginnen wir mit einem einfachen Beispiel: ein paar draggierbare Bl?cke. Wir m?chten dem Benutzer die farbigen Quadrate zeigen, die er gezogen hat.
<div draggable="true"> R </div> <div draggable="true"> Y </div> <div draggable="true"> G </div> <p>Ziehen Sie einen Block</p>
Intuitiver Ansatz
Als ich anfing, JavaScript -Ereignisse zu lernen, schrieb ich für jedes Element eine separate Ereignish?rerfunktion. Dies ist ein gemeinsames Muster, da es der einfachste Weg ist, loszulegen. Wir m?chten, dass jedes Element ein bestimmtes Verhalten hat, damit wir für jedes Element einen bestimmten Code verwenden k?nnen.
document.querySelector ('#red'). addEventListener ('DragStart', evt => { document.querySelector ('#gezogen'). textContent = 'gezogen rot'; }); document.querySelector ('#Yellow'). AddEventListener ('DragStart', evt => { document.querySelector ('#gezogen'). textContent = 'gezogen gelb'; }); Document.querySelector ('#Green'). AddEventListener ('Dragstart', EVT => { document.querySelector ('#gezogen'). textContent = 'gezogen grün'; });
Reduzieren Sie den doppelten Code
Die Ereignish?rer in diesem Beispiel sind sehr ?hnlich: Jede Funktion zeigt einen Text an. Dieser doppelte Code kann in eine Helferfunktion zusammengefasst werden.
Funktion Vorschau (Farbe) { document.querySelector ('#gedrückt'). textContent = `schleppte $ {color}`; } dokumentieren .querySelector ('#red') .AdDeVentListener ('DragStart', EVT => Preview ('rot')); dokumentieren .querySelector ('#Yellow') .AddeventListener ('DragStart', evt => preview ('gelb'); dokumentieren .querySelector ('#Green') .AddeventListener ('DragStart', EVT => Preview ('Green'));
Dies ist pr?gnanter, erfordert aber immer noch mehrere Funktionen und Event -H?rer.
Nutzen Sie Ereignisobjekte
Ereignisobjekte sind der Schlüssel zur Vereinfachung der Zuh?rer. Wenn der Ereignish?rer aufgerufen wird, sendet er das Ereignisobjekt auch als erster Parameter. Dieses Objekt enth?lt einige Daten, um das aufgetretene Ereignis zu beschreiben, beispielsweise bei der Ereignis. Um unseren Code zu vereinfachen, k?nnen wir die Eigenschaft evt.currentTarget
verwenden, in der currentTarget
auf das Element bezieht, das den Ereignish?rer angeschlossen hat. In unserem Beispiel wird es eines von drei farbigen Quadraten sein.
const preview = evt => { const color = evt.currentTarget.id; document.querySelector ('#gedrückt'). textContent = `schleppte $ {color}`; }; document.querySelector ('#red'). addEventListener ('DragStart', Vorschau); Document.querySelector ('#Yellow'). AddEventListener ('Dragstart', Vorschau); document.querySelector ('#green'). addEventListener ('Dragstart', Vorschau);
Jetzt gibt es nur eine Funktion anstelle von vier Funktionen. Wir k?nnen genau die gleiche Funktion wie ein Ereignish?rer wiederverwenden, w?hrend evt.currentTarget.id
je nach Element, das das Ereignis ausgel?st hat, unterschiedliche Werte aufweist.
Verwenden Sie die Ereignisblase
Die letzte ?nderung besteht darin, die Anzahl der Zeilen im Code zu reduzieren. Anstatt einen Ereignish?rer an jeden Block anzubringen, fügen Sie einen einzelnen Ereignish?rer an ein Element mit, das alle farbigen Bl?cke enth?lt.
Bei Ausl?ser beginnt ein Ereignis mit dem Element (einem der Quadrate) des Ereignisses. Es wird jedoch hier nicht aufh?ren. Der Browser geht zu jedem übergeordneten Element des Elements und ruft jeden Ereignish?rer darauf auf. Dies wird bis zum Stammelement des Dokuments fortgesetzt (in HTML Etikett). Dieser Vorgang wird als "Bubble" bezeichnet, da Ereignisse wie Blasen in den Dokumentbaum aufsteigen. Durch das Anbringen eines Ereignish?rers an das Abschnittselement wird das Fokusereignis vom geschleppten farbigen Quadrat zum übergeordneten Element sprudeln. Wir k?nnen auch die
evt.target
-Eigenschaft nutzen, die das Element enth?lt, das das Ereignis (eines der Quadrate) anstelle des Elements ausl?st, das den Ereignish?rer ( section
) angeh?ngt hat.
const preview = evt => { const color = evt.target.id; document.querySelector ('#gedrückt'). textContent = `schleppte $ {color}`; }; Document.querySelector ('Abschnitt'). AddEventListener ('Dragstart', Vorschau);
Jetzt haben wir viele Event -H?rer auf nur einen reduziert! Für komplexeren Code funktioniert es besser. Durch die Nutzung von Ereignisobjekten und Bubeln k?nnen wir JavaScript -Ereignisse steuern und den Code der Ereignishandler vereinfachen.
Was ist mit Click -Ereignissen?
evt.target
ist sehr effektiv mit Ereignissen wie dragstart
und change
, bei denen nur wenige Elemente Fokus erhalten oder die Eingabe ?ndern k?nnen.
Normalerweise m?chten wir jedoch auf Klickereignisse anh?ren, damit wir auf den Benutzer reagieren k?nnen, der auf eine Schaltfl?che in der Anwendung klickt. Das Klickereignis wird für jedes Element im Dokument ausgel?st, von einer gro?en Div bis zu einer kleinen Zeitspanne.
Lassen Sie uns unsere draggierbaren farbigen Quadrate in Klickable ?ndern.
<div draggable="true"> R </div> <div draggable="true"> Y </div> <div draggable="true"> G </div> <p>Klicken Sie auf ein Quadrat</p>
const preview = evt => { const color = evt.target.id; document.querySelector ('#klickte'). textContent = `klickte $ {color}`; }; document.querySelector ('Abschnitt'). AddEventListener ('Click', Vorschau);
Beachten Sie beim Testen dieses Codes, dass manchmal "Klicken" nicht angeh?ngt ist, nicht beim Klicken auf ein Quadrat. Der Grund, warum es nicht funktioniert, ist, dass jeder Block einen klickbaren enth?lt<span></span>
Elemente, nicht draggierbar<div> Element. Da Span keine ID -Set hat, ist die Eigenschaft <code>evt.target.id
eine leere Zeichenfolge. Wir kümmern uns nur um die farbigen Quadrate im Code. Wenn wir irgendwo im Quadrat klicken, müssen wir das übergeordnete Quadratelement finden. Wir k?nnen element.closest()
verwenden, um das übergeordnete Element zu finden, das dem angeklickten Element am n?chsten liegt.
const preview = evt => { const element = evt.target.closest ('div [draggable]'); if (element! = null) { const color = element.id; document.querySelector ('#klickte'). textContent = `klickte $ {color}`; } };
Jetzt k?nnen wir einen einzelnen Listener für Klickereignisse verwenden! Wenn element.closest()
NULL zurückgibt, bedeutet dies, dass der Benutzer irgendwo au?erhalb des farbigen Quadrats klickt, und wir sollten das Ereignis ignorieren.
Weitere Beispiele
Hier sind einige andere Beispiele, die zeigen, wie man einen einzelnen Ereignish?rer nutzt.
Liste
Ein gemeinsames Muster ist eine interaktive Liste von Projekten, bei denen neue Projekte mit JavaScript dynamisch eingefügt werden. Wenn wir jedem Projekt einen Ereignish?rer anschlie?en, muss der Code den Ereignish?rer jedes Mal verarbeiten, wenn ein neues Element generiert wird.
<div id="buttons-container"></div> <button id="add">Fügen Sie eine neue Schaltfl?che hinzu</button>
Lassen Sie ButtonCounter = 0; document.querySelector ('#add'). addEventListener ('klick', evt => { const newbutton = document.createelement ('button'); newbutton.textContent = buttonCounter; // Erstellen Sie jedes Mal einen neuen Ereignish?rer, wenn Sie auf "Neue Schaltfl?che hinzufügen" klicken. // Notieren Sie beim Klicken die Anzahl der Klicken der Schaltfl?che. document.querySelector (' #klickte'). textContent = `klickte Schaltfl?che #$ {newbutton.textContent}`; }); Buttoncounter; const container = document.querySelector ('#buttons-container'); Container.AppendChild (Neuling); });
Durch die Nutzung von Blasen k?nnen wir einen einzelnen Ereignish?rer im Container verwenden. Wenn wir in der Anwendung viele Elemente erstellen, reduziert dies die Anzahl der H?rer von N auf zwei.
Lassen Sie ButtonCounter = 0; const container = document.querySelector ('#buttons-container'); document.querySelector ('#add'). addEventListener ('klick', evt => { const newbutton = document.createelement ('button'); newbutton.dataset.number = buttoncounter; Buttoncounter; Container.AppendChild (Neuling); }); Container.AdDeVentListener ('Click', evt => { const klicktedbutton = evt.target.closest ('Schaltfl?che'); if (klicktebutton! = null) { // Notieren Sie beim Klicken die Anzahl der Klicken der Schaltfl?che. document.querySelector (' #klickte'). textContent = `klickte Schaltfl?che #$ {klicktedbutton.dataset.number}`; } });
Bilden
Vielleicht gibt es ein Formular mit vielen Eingaben und wir m?chten alle Benutzerantworten in ein einzelnes Objekt sammeln.
Sei Antworten = {{ Name: '', E -Mail: '', Passwort: '' }; dokumentieren .querySelector ('input [name = "name"]') .addeventListener ('change', evt => { const InputElement = document.querySelector ('input [name = "name"]'); Antworten.Name = InputElement.Value; document.querySelector ('#preview'). textContent = json.stringify (Antworten); }); dokumentieren .querySelector ('input [name = "E -Mail"]') .addeventListener ('change', evt => { const InputElement = document.querySelector ('input [name = "E -Mail"]'); Antworten.Email = InputElement.Value; document.querySelector ('#preview'). textContent = json.stringify (Antworten); }); dokumentieren .querySelector ('input [name = "password"]') .addeventListener ('change', evt => { const InputElement = document.querySelector ('Eingabe [name = "password"]'); Antworten.Password = InputElement.Value; document.querySelector ('#preview'). textContent = json.stringify (Antworten); });
Verwenden wir stattdessen den Elternteil<form></form>
Ein einzelner H?rer auf dem Element.
Sei Antworten = {{ Name: '', E -Mail: '', Passwort: '' }; document.querySelector ('Formular'). AddEventListener ('Change', evt => { Antworten [evt.target.name] = evt.target.Value; document.querySelector ('#preview'). textContent = json.stringify (Antworten); });
abschlie?end
Jetzt wissen wir, wie man Ereignisblasen und Ereignisobjekte nutzt, um das komplexe Event -Handler -Chaos auf mehrere zu vereinfachen ... und manchmal sogar auf einen zu reduzieren! Ich hoffe, dieser Artikel hilft Ihnen, über Event -Handler aus einer neuen Perspektive nachzudenken. Ich wei?, dass es für mich eine Offenbarung war, nachdem ich viel Zeit damit verbracht habe, doppelten Code zu schreiben, um dasselbe in meiner Karriere als frühe Entwicklung zu tun.
Das obige ist der detaillierte Inhalt vonDas Denken hinter der Vereinfachung von Ereignishandlern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Es gibt drei M?glichkeiten, einen CSS -Laderotator zu erstellen: 1. Verwenden Sie den Basisrotator der Grenzen, um eine einfache Animation durch HTML und CSS zu erreichen. 2. Verwenden Sie einen benutzerdefinierten Rotator mit mehreren Punkten, um den Sprungeffekt durch verschiedene Verz?gerungszeiten zu erreichen. 3. Fügen Sie einen Rotator in die Taste hinzu und wechseln Sie den Klassen über JavaScript, um den Ladestatus anzuzeigen. Jeder Ansatz betont die Bedeutung von Entwurfsdetails wie Farbe, Gr??e, Zug?nglichkeit und Leistungsoptimierung, um die Benutzererfahrung zu verbessern.

Um mit CSS -Browser -Kompatibilit?t und Pr?fixproblemen umzugehen, müssen Sie die Unterschiede im Browser -Support verstehen und Anbieterpr?fixe vernünftigerweise verwenden. 1. Verstehen Sie gemeinsame Probleme wie Flexbox und Grid -Unterstützung, Position: Sticky Invaly und Animationsleistung ist unterschiedlich. 2. überprüfen Sie den Best?tigungsunterstützungsstatus von Caniuse. 3. Verwenden Sie korrekt -webkit-, -moz-, -ms-, -o- und andere Herstellerpr?fixe; 4. Es wird empfohlen, Autoprefixer zu verwenden, um automatisch Pr?fixe hinzuzufügen. 5. Postcss installieren und Browserlist konfigurieren, um den Zielbrowser anzugeben. 6. automatisch die Kompatibilit?t w?hrend des Baus bew?ltigen; 7. Modernizr -Erkennungsmerkmale k?nnen für alte Projekte verwendet werden; 8. Keine Notwendigkeit, die Konsistenz aller Browser zu verfolgen,

Verwenden Sie das Clip-Pfad-Attribut von CSS, um Elemente in benutzerdefinierte Formen wie Dreiecke, kreisf?rmige Kerben, Polygone usw. zu erregen, ohne sich auf Bilder oder SVGs zu verlassen. Zu den Vorteilen geh?ren: 1.. Unterstützt eine Vielzahl von Grundformen wie Circle, Ellipse, Polygon usw.; 2. reagierende Anpassung und anpassbar an mobile Terminals; 3. Einfach zu animation und kann mit Hover oder JavaScript kombiniert werden, um dynamische Effekte zu erzielen. 4. Es wirkt sich nicht auf den Layoutfluss aus und erfüllt nur den Anzeigebereich. H?ufige Verwendungen sind z. B. kreisf?rmiger Clip-Pfad: Kreis (50pxatcenter) und Dreieck-Clip-Pfad: Polygon (50%0%, 100 0%, 0 0%). Beachten

ThemaNDiffercesbetweenplay: Inline, Block, Andinline-Blockinhtml/CsSarelayoutBehavior, Spaceusage und Stylingcontrol.1.inlineelementsflowwithtext, Don'tstartonNewlines, Ignorewidth/HeighthThorchingstyhorching-/idelthorchorching/ardaldhordhortaliTalding/ardaldhordelthortex

Durch das Festlegen des von Ihnen besuchten Links k?nnen Sie die Benutzererfahrung verbessern, insbesondere in inhaltsintensiven Websites, um den Benutzern dabei zu helfen, sich besser zu navigieren. 1. Verwenden Sie CSS: Besuchte Pseudoklasse, um den Stil des besuchten Links wie Farb?nderungen zu definieren. 2. Beachten Sie, dass der Browser nur eine ?nderung einiger Attribute aufgrund von Datenschutzbeschr?nkungen erm?glicht. 3. Die Farbauswahl sollte mit dem Gesamtstil koordiniert werden, um abrupte abrupt zu werden. 4. Das mobile Terminal zeigt diesen Effekt m?glicherweise nicht an. Es wird empfohlen, ihn mit anderen visuellen Eingabeaufforderungen wie Icon -Auxiliary -Logos zu kombinieren.

Um reaktionsschnelle Bilder mit CSS zu erstellen, kann es haupts?chlich durch die folgenden Methoden erreicht werden: 1. Verwenden Sie maximale Breite: 100% und H?he: Auto, damit das Bild an die Containerbreite anpasst und gleichzeitig den Anteil beibeh?lt. 2. Verwenden Sie die SRCSet- und Gr??enattribute von HTML, um die an verschiedenen Bildschirme angepassten Bildquellen intelligent zu laden. 3.. Verwenden Sie Objektfit und Objektposition, um die Bildaufbindung und Fokusanzeige zu steuern. Gemeinsam stellen diese Methoden sicher, dass die Bilder auf verschiedenen Ger?ten klar und wundersch?n pr?sentiert werden.

Die Auswahl der CSS -Einheiten h?ngt von den Entwurfsanforderungen und den reaktionsschnellen Anforderungen ab. 1.PX wird für die feste Gr??e verwendet, geeignet für eine pr?zise Kontrolle, aber mangelnde Elastizit?t; 2.Em ist eine relative Einheit, die leicht durch den Einfluss des übergeordneten Elements verursacht wird, w?hrend REM basierend auf dem Wurzelelement stabiler ist und für die globale Skalierung geeignet ist. 3.VW/VH basiert auf der Ansichtsfenstergr??e, die für das reaktionsschnelle Design geeignet ist. Die Leistung unter extremen Bildschirmen sollte jedoch Aufmerksamkeit geschenkt werden. 4. Bei der Auswahl sollte es ermittelt werden, ob reaktionsschnelle Anpassungen, Elementhierarchiebeziehungen und Ansichtsfensterabh?ngigkeit festgelegt werden. Angemessener Gebrauch kann die Layoutflexibilit?t und -wartung verbessern.

Verschiedene Browser weisen Unterschiede in der CSS -Analyse auf, was zu inkonsistenten Anzeigeeffekten führt, haupts?chlich die Differenzentscheidung, die Berechnung des Boxmodells, die Flexbox- und Raster -Layout -Unterstützung und das inkonsistente Verhalten bestimmter CSS -Attribute. 1. Die Standardstilverarbeitung ist inkonsistent. Die L?sung besteht darin, CSSReset oder Normalize.css zu verwenden, um den anf?nglichen Stil zu vereinen. 2. Die Box -Modellberechnung der alten Version von IE ist unterschiedlich. Es wird empfohlen, eine einheitliche Boxgr??e: Border-Box zu verwenden. 3. Flexbox und Grid führen in Kantenf?llen oder in alten Versionen unterschiedlich ab. Weitere Tests und verwenden Sie Autoprefixer; 4. Einige CSS -Attributverhalten sind inkonsistent. Caniuse muss konsultiert und herabgestuft werden.
