Ich habe Widgets, an die Javascript-Steuerelemente angehängt sind.
Wenn das Widget beim Laden der Widget-Verwaltungsseite vorhanden ist, funktionieren die Steuerelemente ordnungsgemäß.
Wenn ich ein neues Widget hinzufüge, funktionieren diese nicht ordnungsgemäß. Ich erhalte das Markup, aber es werden keine JavaScript-Ereignisse wirksam.
Wenn ich das neue Widget speichere, werden die Steuerelemente beim erneuten Laden des Formulars korrekt erstellt und funktionieren jetzt.
Das Aktualisieren der Seite behebt ebenfalls das Problem, jedoch nur für vorhandene Widgets. Neue Widgets haben dieses Problem immer noch.
Insbesondere lasse ich an folgenden Punkten selectize auf ausgewählten Eingängen ausführen:
- Dokument bereit
- Ajaxcomplete
Ich habe überprüft, ob mein Code bei jedem Ereignis wie gewünscht ausgeführt wird, aber die Ergebnisse sind nicht wie erwartet.
Hier ist ein Test-Plugin, das das Problem demonstriert:
https://gist.github.com/Tarendai/8466299
Sie werden sehen, dass ich einen Zähler habe, der sich mit jedem ausgewählten Element erhöht, das konvertiert werden kann.
Anmerkungen:
- Wenn die Widget-Seite geladen wird, wird der Zähler in der JS-Konsole wie erwartet erhöht
- Wenn ich ein neues Widget hinzufüge, wird der Code ausgeführt, es werden jedoch keine ausgewählten Elemente gefunden, auf denen er ausgeführt werden kann. Dies wird dadurch demonstriert, dass found.length 0 ist. Dies sollte nicht der Fall sein, wie dies bei jedem neuen Widget dieses Typs der Fall sein sollte habe ein ausgewähltes Element
- ausgewählte Elemente haben eine Klasse, um sie zu identifizieren. Diese Klasse wird entfernt, sobald die Auswahlbibliothek angewendet wird, um ein Duplizieren und erneutes Verarbeiten auf vorhandenen Widgets zu verhindern.
- Vor der Verwendung von selectize habe ich Select2 verwendet, bei dem das gleiche Problem auftrat
- Wenn ich den AJAX-Code auskommentiere, würde ich erwarten, dass neue Widgets eine Standardauswahleingabe haben. Sie nicht. Ich weiß nicht, warum das so ist
Wie kann ich das Steuerelement selectize aktivieren, ohne den Benutzer aufzufordern, vor dem Vornehmen von Änderungen zu aktualisieren / auf Speichern zu klicken?
jQuery( document ).ajaxStop( function() {
Teil hinzugefügt habe, damit ich die Steuerelemente in den neu geladenen Widgets initialisieren kann. Wenn ich diese Zeile jedoch entfernen würde, würde ich erwarten, dass neue Widgets Standardeingaben für die HTML-Auswahl haben, aber dies ist nicht der Fall
widget-updated
und widget-added
. Außerdem möchte ich in @michaeljames Code die Verwendung der Element-ID hervorheben #widgets-right
. Verwenden Sie diese Option unbedingt , um aktive Widgets-Elemente in Ihrem JS-Code als Ziel festzulegen. Andernfalls erhalten Sie möglicherweise doppelte Elemente, da in Ihrem Code möglicherweise auch ausgeblendete inaktive Widget-Elemente auf der linken Seite des Bildschirms ausgewählt werden (und diese werden geklont, wenn das Widget hinzugefügt wird).
.on()
Methode auseinandersetzen. Dazu müssen Sie ein Ereignis an das Dokument binden. Welches Ereignis jedoch angemessen sein wird, weiß ich derzeit nicht genau. Letztendlich liegt es daran, dass Ihre ursprünglichen Bindungen die ursprüngliche Version des DOM darstellen, als die Seite geladen wurde, und für die neuen Elemente (Widget-Inhalt), die über Ajax hinzugefügt werden, größtenteils blind sind. Hoffentlich weist das Sie in die richtige Richtung, wenn nicht, kann ich besser antworten, wenn ich bei der Arbeit bin.