Path: csiph.com!news.mixmin.net!weretis.net!feeder1.news.weretis.net!news.solani.org!.POSTED!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: de.comp.lang.javascript Subject: Re: jQuery Wechsel von live() nach click() Date: Sun, 21 Aug 2016 13:04:49 +0200 Organization: PointedEars Software (PES) Lines: 86 Message-ID: <2726748.gXyuZs7Mdh@PointedEars.de> References: <4025524.fQgX0d2UCM@PointedEars.de> Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Trace: solani.org 1471777492 28567 eJwFwYEBwDAEBMCVfHhkHFX2HyF3VId3mNONy9WTE7lwxEIgzo6q/16b/A66GY0pigIo7gMJRxCT (21 Aug 2016 11:04:52 GMT) X-Complaints-To: abuse@news.solani.org NNTP-Posting-Date: Sun, 21 Aug 2016 11:04:52 +0000 (UTC) User-Agent: KNode/4.14.2 Cancel-Lock: sha1:bLvEfWhwFWjmOitzuORGCrAmEU4= X-NNTP-Posting-Host: eJwNycEBwCAIA8CVBAmRdUxh/xHsfQ87LcVIZGAwfmPw3dGhFWaV7DiX2qv1ZyS5W/DihVU/HyQQ5g== X-User-ID: eJwNxMEBwCAIA8CVFAnIOAhk/xHaexyObStXgykIpgcvp3vv0kU+D5vR/suIenS8hVKp1beRcULksvxMpYt+ieQWnQ== Xref: csiph.com de.comp.lang.javascript:4764 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). >> 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*? 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: [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: | SVN: Twitter: @PointedEars2 | ES Matrix: Please do not cc me. / Bitte keine Kopien per E-Mail.b