Zunächst einmal weiß jeder, dass es beim Auslösen von jQuery-Ereignissen zwei Mechanismen gibt: der eine ist die Ereignisdelegation und der andere das Ereignis-Bubbling (die IE-Situation wird vorerst nicht berücksichtigt). Nehmen Sie als Beispiel das Klickereignis und hängen Sie zunächst einen Code an:
html:
<body> <div id="box"> <p id="btn">我是按钮</p> </div> </body> style: .hid{ display:none; }
Skript:
$('#box').click(function(){ $(‘#btn').toggleClass(‘hid'); }) $('#btn').click(function(){ alert('btn'); })
Die ursprüngliche Absicht dieses Codes besteht darin, dass ich die Zeichenfolge „btn“ warnen möchte, wenn ich auf #btn klicke, und dass ich #btn ausblenden möchte, wenn ich auf #box klicke Btn: Zuerst wird das BTN-Ereignis und dann das Box-Ereignis ausgeführt, das heißt, es wird zuerst alarmiert und dann ausgeblendet. Es unterscheidet sich von dem, was wir dachten. Wie kann dieses Problem gelöst werden? Hier müssen wir über den Ereignis-Bubbling-Mechanismus nachdenken, denn wenn ich auf BTN klicke, wird das Ereignis zum übergeordneten Element bis zum Dokumentobjekt übertragen.
JQuery-Versionen nach 1.7 bieten (wenn ich mich richtig erinnere) das .on()-Ereignis, um Ereignisse gebundener Elemente zu verarbeiten. Hier können wir das .on()-Ereignis und die stopPropagation()-Methode verwenden, um Ereignisse zu verhindern 🎜>
$('#box').on('click','#btn',function(e){ e.stopPropagation(); alert(‘btn'); }) $('#box').click(function(){ $(‘#btn').toggleClass(‘hid'); })
Ich habe hier darüber nachgedacht, wie ich es lösen kann, wenn .on() nicht verwendet wird. Ähnlich wie bei nativem js wird addEventListener verwendet, um das angeklickte Ziel zu überwachen. Der Code ist nicht kompliziert:
$('#box‘).click(function(e) { if (e.target == this) { $(‘#btn').toggleClass(‘hid'); } }) $(‘#btn').click(function() { alert(‘btn'); })
Natürlich sind Event-Bubbling nicht nur Nebeneffekte, sondern auch die Event-Delegation, die auf Event-Bubbling basiert. Es gibt viele Elemente zwischen btn und #box. Wenn ich auf das innerste #btn klicken und das entsprechende Ereignis auslösen möchte, kann ich auf die peripheren Elemente klicken und dann feststellen, ob der Klick das Ziel ist btn. Wenn ja, dann ist das Ereignis, das btn auslöst, tatsächlich das obige Beispiel von .on(), das wie folgt umgeschrieben werden kann:
$('body').on('click','#btn',function(e){ alert(‘btn'); })
Lassen Sie es uns abschließend sorgfältig analysieren. Tatsächlich sind Ereignisdelegation und Ereignissprudeln aus logischer Sicht nichts anderes als zwei entgegengesetzte Ausführungsrichtungen. Bei der Ereignisdelegation handelt es sich eigentlich um den Prozess der Ereigniserfassung, der als ein Prozess der Erfassung von außen nach innen angesehen werden kann, während das Sprudeln von Ereignissen ein Prozess des Sprudelns von innen nach außen ist.
Blockieren und Zulassen von Bubbling-Ereignissen von JQuery (drei Implementierungsmethoden)Bubbling- oder Standardereignisse sind zu bestimmten Zeiten nicht erforderlich. Hier benötigen wir einige Methoden, um Bubbling- und Standardereignisse in unterschiedlichem Ausmaß zu verhindern sprudelnde Ereignisse
Manchmal möchten wir nicht, dass Bubbling- oder Standardereignisse auftreten, daher benötigen wir einige JQuery-Methoden, um Bubbling- und Standardereignisse zu verhindern.
Mit den folgenden drei Methoden können unterschiedliche Blockierungsgrade erreicht werden.
false zurückgeben Bei der Ereignisverarbeitung können Sie Standardereignisse und Bubbling-Ereignisse verhindern.
event.preventDefault() kann Standardereignisse verhindern, aber das Auftreten von Bubbling-Ereignissen während der Ereignisverarbeitung zulassen.
event.stopPropagation() kann Blasenbildung verhindern, aber das Eintreten des Standardereignisses während der Ereignisverarbeitung zulassen.