1. Der Ablauf der Ereignisse
Der Ursprung dieses Problems ist sehr einfach. Angenommen, Sie haben ein Element, das in einem anderen Element verschachtelt ist.
Wie erwartet verfolgten Netscape und Microsoft zwei sehr unterschiedliche Ansätze, um mit den Tagen der „Browserkriege“ umzugehen:
Netscape befürwortet, dass das Ereignis von Element 1 zuerst auftritt.Microsoft behauptet, dass Element 2 Priorität hat.
Beides von ihnen Die Abfolge der Ereignisse ist diametral entgegengesetzt. Der Explorer-Browser unterstützt nur Bubbling-Ereignisse, Mozilla, Opera7 und Konqueror unterstützen beides. Das ältere Opera und iCab unterstützen beides nicht
3. Ereignisse erfassen
Wenn Sie die Erfassung von Ereignissen verwenden
Wenn Sie Blasenereignisse verwenden
Kopieren Sie den Code
Code kopieren
Code kopieren
(Das Ereignis ist hier wie ein Tourist, der von außen nach innen reist, sich allmählich dem Hauptelement nähert, das ausgelöst wurde, und dann in die entgegengesetzte Richtung geht)
2. Es wird festgestellt, dass Element 1 einen hat, daher wird doSomething2 ausgeführt
3. Das Ereignis überprüft das Ziel selbst (Element 2 ), aber es gibt keinen Onclick-Handler in der Erfassungsphase. Es wurden weitere Verarbeitungsfunktionen gefunden. Das Ereignis beginnt in die Blasenphase einzutreten und doSomething () wird auf natürliche Weise ausgeführt. Dabei handelt es sich um eine Funktion, die an die Blasenphase von Element 2 gebunden ist.4. Das Ereignis entfernt sich von Element 2, um zu sehen, ob während der Bubbling-Phase an ein Vorgängerelement ein Handler gebunden ist. Es gibt keinen solchen Fall, also passiert nichts
Der umgekehrte Fall ist:
Kopieren Sie den Code
2. Das Ereignis erkennt das Ziel selbst. Das Ereignis beginnt in die Blasenphase einzutreten und die an die Blasenphase von Element 2 gebundene Funktion wird ausgeführt. doSomething()
In Browsern, die w3c dom (Document Object Model) unterstützen, ist die traditionelle Ereignisbindungsmethode
Code kopieren
Der Code ist wie folgt:
8. Es passiert ständig
Das erste, was Sie verstehen müssen, ist, dass Event Capture oder Bubbling immer stattfindet. Wenn Sie eine allgemeine On-Click-Verarbeitungsfunktion für das gesamte Seitendokument definierenKopieren Sie den Code
Der Code lautet wie folgt:
Das Klickereignis des Klickens auf ein beliebiges Element auf der Seite wird schließlich zur obersten Dokumentebene der Seite hochsteigen und so die allgemeine Verarbeitungsfunktion auslösen, es sei denn, die vorherige Verarbeitungsfunktion weist ausdrücklich darauf hin, dass das Blasen beendet werden soll Das Sprudeln wird gestoppt. Wird nicht auf die gesamte Dokumentebene übertragen
Ergänzung zum zweiten Satz des obigen Codes:
>>>Sprechen wir zuerst über den IE
object.setCapture() Wenn ein Objekt setCapture ist, wird seine Methode zur Erfassung an das gesamte Dokument vererbt.
Wenn Sie die Methode zum Erfassen des gesamten Dokuments nicht erben müssen, verwenden Sie object.releaseCapture()
>>>others
Mozilla hat auch eine ähnliche Funktion, die Methode ist etwas anders
window.captureEvents (Event.eventType)
window.releaseEvents(Event.eventType)
>>>example
Da jede Ereignisweitergabe im Seitendokument (dieser obersten Ebene) endet, ist der Standard-Ereignishandler möglich, vorausgesetzt, Sie haben eine Seite wie diese
bleibt
1. Wenn die Onmouseover-Handlerfunktion an die Elementebene gebunden ist, reagiert diese Elementebene nicht mehr auf Mausbewegungen, was zu einem seltsamen Gefühl bei den Benutzern führt.2. Wenn die Onmouseup-Handlerfunktion an die Elementebene gebunden ist Das Ereignis kann nicht ausgelöst werden. Die Folge ist, dass die Elementebene weiterhin auf Mausbewegungen reagiert, nachdem der Benutzer diese Elementebene löschen möchte. Das wird noch mehr Verwirrung stiften (?)
In diesem Beispiel ist das Event-Bubbling also sehr nützlich, da durch die Platzierung Ihrer Handlerfunktionen auf Seitenebene sichergestellt wird, dass sie immer ausgeführt werden können
10. Schalten Sie es aus (um zu verhindern, dass Ereignisse sprudeln)
Aber im Allgemeinen sollten Sie das gesamte Sprudeln und Aufnehmen ausschalten, um sicherzustellen, dass sich die Funktionen nicht gegenseitig stören. Wenn Ihre Dokumentstruktur außerdem recht komplex ist (viele ineinander verschachtelte Tabellen usw.), möchten Sie möglicherweise die Bubbling-Funktion deaktivieren, um Systemressourcen zu sparen. An diesem Punkt muss der Browser jeden Vorfahren des Zielelements überprüfen, um festzustellen, ob es über eine Handlerfunktion verfügt. Selbst wenn niemand gefunden wird, nimmt die Suche gerade noch viel Zeit in Anspruch
Im Microsoft-Modell müssen Sie die cancelBubble-Eigenschaft des Ereignisses auf true setzen
Kopieren Sie den Code
{
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
}
Es schadet nicht, cancelBubble in Browsern festzulegen, die das cancelBubble-Attribut unterstützen. Der Browser zuckt mit den Schultern und erstellt dieses Attribut. Natürlich wird dadurch das Sprudeln nicht wirklich aufgehoben, aber es stellt zumindest sicher, dass dieser Befehl sicher und korrekt ist
11. aktuelles Ziel
Wie wir zuvor gesehen haben, verwendet ein Ereignis das Attribut „target“ oder „srcElement“, um anzugeben, auf welchem Zielelement das Ereignis aufgetreten ist (d. h. auf dem Element, auf das der Benutzer ursprünglich geklickt hat). In unserem Fall ist es Element 2, weil wir darauf geklickt haben.
Es ist sehr wichtig zu verstehen, dass sich das Zielelement während der Einfang- oder Sprudelphase nicht ändert, sondern immer mit Element 2 verknüpft ist.
Aber nehmen wir an, wir binden die folgende Funktion
element2.onclick = doSomething;
12. Probleme mit dem Microsoft-Modell
Aber wenn Sie das Microsoft-Ereignisbindungsmodell verwenden, entspricht das Schlüsselwort this nicht dem HTML-Element. Lenovo fehlt ein Microsoft-Modell ähnlich der currentTarget-Eigenschaft (?) – wenn Sie dem obigen Code folgen, bedeuten Sie:
element2.attachEvent('onclick',doSomething)
Ich hoffe, bald aktuelle Target-ähnliche Eigenschaften hinzufügen zu können – oder dem Standard folgen? Webentwickler benötigen diese Informationen
Nachtrag:
Da ich JavaScript noch nie in der Praxis verwendet habe, verstehe ich einige Teile dieses Artikels nicht ganz, sodass ich sie nur abrupt übersetzen kann, z. B. den Abschnitt über den Drag-Effekt. Wenn Sie Ergänzungen haben oder Bei Fragen können Sie mir eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung!