Ho dei widget a cui sono collegati controlli javascript.
Se il widget è presente quando viene caricata la pagina di amministrazione del widget, i controlli funzionano correttamente.
Quando aggiungo un nuovo widget, non funzionano correttamente, ottengo il markup, ma non hanno effetto eventi javascript.
Se salvo il nuovo widget, quando il modulo viene ricaricato, i controlli vengono creati correttamente e ora funzionano.
L'aggiornamento della pagina risolve anche il problema, ma solo per i widget esistenti. I nuovi widget hanno ancora questo problema.
In particolare sto eseguendo selectize su input selezionati in questi punti:
- documento pronto
- Ajaxcomplete
Ho verificato che il mio codice sia eseguito su ogni evento come desiderato, ma i risultati non sono quelli previsti.
Ecco un plug-in di prova che dimostra il problema:
https://gist.github.com/Tarendai/8466299
Vedrai che ho un contatore che aumenta con ogni elemento selezionato che riesce a convertire.
Gli appunti:
- Quando viene caricata la pagina del widget, posso vedere il contatore aumentare nella console JS come previsto
- Quando aggiungo un nuovo widget, il codice viene eseguito, tuttavia, non riesce a trovare tutti gli elementi selezionati su cui può essere eseguito, come dimostrato da found.length essendo 0. Questo non dovrebbe essere il caso, come ogni nuovo widget di quel tipo dovrebbe avere un elemento select
- elementi selezionati hanno una classe per identificarli, questa classe viene rimossa una volta applicata la libreria selectize per impedire la duplicazione e la rielaborazione su widget esistenti.
- Prima di usare selectize, ho usato Select2, che aveva lo stesso problema
- Commentando il codice AJAX, mi aspetto che i nuovi widget abbiano un input di selezione standard. Loro non. Non so perché sia così
Quindi, come faccio a far funzionare il controllo selectize senza dire all'utente di aggiornare / fare clic su Salva prima di apportare modifiche?
jQuery( document ).ajaxStop( function() {
parte in modo da poter inizializzare i controlli nei widget appena caricati. Tuttavia, se avessi rimosso quella riga, mi sarei aspettato che i nuovi widget avessero input di selezione HTML standard, ma non = s
widget-updated
e widget-added
. Inoltre, voglio sottolineare, nel codice @michaeljames, l'uso dell'elemento id #widgets-right
. Assicurati di usarlo per scegliere come target elementi widget attivi all'interno del tuo codice JS altrimenti potresti ottenere elementi duplicati poiché il tuo codice potrebbe anche selezionare elementi widget inattivi nascosti sul lato sinistro dello schermo (e questi verranno clonati quando il widget viene aggiunto).
.on()
metodo jQuerys . Il che richiede di associare un evento al documento. Tuttavia, quale evento sarà appropriato non sono sicuro in questo momento. In definitiva è perché i tuoi collegamenti originali rappresentano la versione iniziale del DOM quando la pagina è stata caricata e per la maggior parte sono ciechi rispetto ai nuovi elementi (contenuto del widget) che vengono aggiunti tramite Ajax. Spero che ti indichi nella giusta direzione, se non posso rispondere meglio quando sono al lavoro.