Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.javascript > #4764

Re: jQuery Wechsel von live() nach click()

From Thomas 'PointedEars' Lahn <PointedEars@web.de>
Newsgroups de.comp.lang.javascript
Subject Re: jQuery Wechsel von live() nach click()
Date 2016-08-21 13:04 +0200
Organization PointedEars Software (PES)
Message-ID <2726748.gXyuZs7Mdh@PointedEars.de> (permalink)
References <e1re7iFb2buU1@mid.individual.net> <npa41p$o8r$2@solani.org> <4025524.fQgX0d2UCM@PointedEars.de> <e1te7hFp97oU1@mid.individual.net>

Show all headers | View raw


Robert Berghaus wrote:

[lesbar formatiert]

> Am 21.08.2016 um 02:32 schrieb Thomas 'PointedEars' Lahn:
>> Das Problem ist aber anscheinend, dass Elemente mit der Klasse “Jahr”
>> dynamisch hinzugefügt werden und dann auf diesen noch kein Event-Listener
>> registriert ist.
> 
> So ist es. Ich werde also nach dem Einfügen des Inhaltes den
> Event-Listener registrieren. Das Durchgehen vom DOM kann ich ja an
> jQuery delegieren. Das dürfte dann so aussehen:
> 
>   $( ".Jahr" ).on( "click", function( e ) {
>     stopDefault( e );
>     JahrAusblenden( e );
>   } );

Das funktioniert dann, und nur dann, wenn ".Jahr" Dein Einfügekontext ist, 
was ja nach Deiner eigenen Aussage nicht der Fall ist.

Christoph hat die richtige Lösung angedeutet: Registrier den Event-Listener 
einmalig auf der Ebene Deines Einfügekontextes oder (*nur falls es nicht 
anders geht*) auf Dokumentebene.  Denn *click*-Events bubblen – es ist also 
egal, ob die Elemente, welche den Event auslösen, erst später hinzugefügt 
werden.  Du musst dann nur ausschliessen, dass die Aktionen auch für andere 
Elemente unterhalb der Registrierungsebene ausgeführt werden.  Wie das mit 
jQuery geht, wird dem geneigten Leser zur Übung überlassen (denn das ist 
hier kein jQuery-Forum).

<https://www.w3.org/TR/dom/#events>

>> Die richtige Methode ist ausserdem nicht stopDefault(), sondern
>> e.preventDefault() [siehe ebenfalls die API-Dokumentation; es handelt
>> sich bei “e” um die Referenz auf ein *jQuery*-Event-Objekt, daher hat e
>> auch die preventDefault-Methode, wenn die DOM-Implementierung sie für
>> Event-Objekte nicht bereitstellt – der übliche Ansatz für Event-Listener-
>> Wrapper]). [Ausser das benutzerdefinierte stopDefault() macht mehr als
>> das jQuery-e.preventDefault().]
> 
> Die Funktion macht mehr:

*Bist* *Du* *da* *auch* *wirklich* *ganz* *sicher*?

> function stopDefault( evt ) {
>     if ( evt && evt.preventDefault ) {
>         evt.preventDefault();
>     } else if ( window.event && window.event.returnValue ) {
>         window.event.returnValue = false;
>     }
> }	// function stopDefault( evt ) {
> 
> Das hatte ich entweder in einem jQuery Buch

Wohl kaum.

> oder in der dicken JavaScript 'Bibel' gefunden.

Autsch.  Schmeiss sie bitte weg, die „Bibel“ – wahrscheinlich eine uralte 
Ausgabe von Danny Goodmans Machwerk.

> Da es mir universeller erschien, habe ich es übernommen.

Und was, denkst Du, machte *damals* das e.preventDefault() *von jQuery*?

<https://github.com/jquery/jquery/blob/1.12-stable/src/event.js#L825-L842>

Wenn Du die aktuelle jQuery-Version benutzt, brauchst Du obigen Workaround 
nicht mehr, denn alle DOM-Implementierungen, die von der jeweiligen neuen 
jQuery-Version unterstützt werden, haben ein natives e.preventDefault(), was 
von jQuery nur noch getriggert wird:

<https://github.com/jquery/jquery/blob/2.2-stable/src/event.js#L598-L606>

[Womit klar sein sollte, dass man mit einer neuen jQuery-Version immer auch 
Abwärtskompatibilität aufgibt.  Bei anderen Bibliotheken ist das nicht 
notwendigerweise der Fall.]

Bitte kein Kammquoting.  Thunderbird/Icedove hat sogar eine Funktion, um 
Zitate gezielt neu umbrechen zu lassen (Edit → Rewrap).

-- 
PointedEars
FAQ: <http://PointedEars.de/faq> | SVN: <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | ES Matrix: <http://PointedEars.de/es-matrix>
Please do not cc me. / Bitte keine Kopien per E-Mail.b

Back to de.comp.lang.javascript | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

jQuery Wechsel von live() nach click() Robert Berghaus <Robert.Berghaus@gmx.de> - 2016-08-20 18:18 +0200
  Re: jQuery Wechsel von live() nach click() "Christoph M. Becker" <cmbecker69@arcor.de> - 2016-08-20 19:29 +0200
    Re: jQuery Wechsel von live() nach click() Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2016-08-21 02:32 +0200
      Re: jQuery Wechsel von live() nach click() "Christoph M. Becker" <cmbecker69@arcor.de> - 2016-08-21 11:59 +0200
        Re: jQuery Wechsel von live() nach click() Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2016-08-21 13:06 +0200
      Re: jQuery Wechsel von live() nach click() Robert Berghaus <robert.berghaus@gmx.de> - 2016-08-21 12:31 +0200
        Re: jQuery Wechsel von live() nach click() Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2016-08-21 13:04 +0200
          Re: jQuery Wechsel von live() nach click() Robert Berghaus <robert.berghaus@gmx.de> - 2016-08-21 13:28 +0200
            Re: jQuery Wechsel von live() nach click() Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2016-08-21 13:34 +0200
              Re: jQuery Wechsel von live() nach click() Robert Berghaus <Robert.Berghaus@gmx.de> - 2016-08-22 12:28 +0200
                Re: jQuery Wechsel von live() nach click() Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2016-08-22 19:15 +0200
          OT: Thunderbird Rewrap (was: jQuery Wechsel von live() nach click()) "Christoph M. Becker" <cmbecker69@arcor.de> - 2016-08-21 15:05 +0200
          Re: jQuery Wechsel von live() nach click() Robert Berghaus <Robert.Berghaus@gmx.de> - 2016-08-22 12:17 +0200
            Re: jQuery Wechsel von live() nach click() "Christoph M. Becker" <cmbecker69@arcor.de> - 2016-08-22 15:27 +0200
              Re: jQuery Wechsel von live() nach click() Robert Berghaus <Robert.Berghaus@gmx.de> - 2016-08-22 16:27 +0200
                Re: jQuery Wechsel von live() nach click() "Christoph M. Becker" <cmbecker69@arcor.de> - 2016-08-22 17:44 +0200
                Re: jQuery Wechsel von live() nach click() Robert Berghaus <Robert.Berghaus@gmx.de> - 2016-08-25 12:44 +0200
                Re: jQuery Wechsel von live() nach click() Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2016-08-25 23:45 +0200
                Re: jQuery Wechsel von live() nach click() Robert Berghaus <Robert.Berghaus@gmx.de> - 2016-08-26 11:25 +0200
                Re: jQuery Wechsel von live() nach click() Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2016-08-26 21:19 +0200

csiph-web