J'ai des widgets auxquels des contrôles javascript sont attachés.
Si le widget est présent lors du chargement de la page d'administration du widget, les contrôles fonctionnent correctement.
Lorsque j'ajoute un nouveau widget, ils ne fonctionnent pas correctement, j'obtiens le balisage, mais aucun événement javascript ne prend effet.
Si j'enregistre le nouveau widget, lorsque le formulaire se recharge, les contrôles sont créés correctement et fonctionnent maintenant.
L'actualisation de la page résout également le problème, mais uniquement pour les widgets existants. Les nouveaux widgets ont toujours ce problème.
Plus précisément, je lance selectize sur certaines entrées à ces points:
- document prêt
- Ajaxcomplete
J'ai vérifié que mon code est exécuté sur chaque événement comme souhaité, mais les résultats ne sont pas ceux attendus.
Voici un plugin de test qui illustre le problème:
https://gist.github.com/Tarendai/8466299
Vous verrez que j'ai un compteur qui augmente avec chaque élément sélectionné qu'il trouve qu'il peut convertir.
Remarques:
- Lorsque la page du widget se charge, je peux voir le compteur augmenter dans la console JS comme prévu
- Lorsque j'ajoute un nouveau widget, le code est exécuté, cependant, il ne trouve aucun élément de sélection sur lequel il peut s'exécuter, comme démontré par found.length étant 0. Cela ne devrait pas être le cas, comme chaque nouveau widget de ce type devrait avoir un élément select
- les éléments select ont une classe pour les identifier, cette classe est supprimée une fois la bibliothèque selectize appliquée pour éviter la duplication et le retraitement sur les widgets existants.
- Avant d'utiliser selectize, j'ai utilisé Select2, qui avait le même problème
- Commentant le code AJAX, je m'attendrais à ce que les nouveaux widgets aient une entrée de sélection standard. Ils ne. Je ne sais pas pourquoi c'est le cas
Alors, comment puis-je faire fonctionner le contrôle de sélection sans dire à l'utilisateur d'actualiser / cliquer sur Enregistrer avant d'apporter des modifications?
jQuery( document ).ajaxStop( function() {
partie afin de pouvoir initialiser les contrôles dans les widgets nouvellement chargés. Cependant, si je supprimais cette ligne, je m'attendrais à ce que les nouveaux widgets aient des entrées de sélection HTML standard, mais ils ne le sont pas
widget-updated
et widget-added
. Je tiens également à souligner, dans le code @michaeljames, l'utilisation de l'ID d'élément #widgets-right
. Assurez-vous de l'utiliser pour cibler les éléments de widgets actifs dans votre code JS, sinon vous pourriez obtenir des éléments en double car votre code peut également sélectionner des éléments de widget inactifs cachés sur le côté gauche de l'écran (et ceux qui sont clonés lorsque le widget est ajouté).
.on()
méthode jQuerys . Ce qui vous oblige à lier un événement au document. Cependant, quel événement sera approprié, je ne suis pas sûr pour le moment. En fin de compte, c'est parce que vos liaisons d'origine représentent la version initiale du DOM lorsque la page a été chargée et sont pour la plupart aveugles aux nouveaux éléments (contenu du widget) qui sont ajoutés via ajax. J'espère que cela vous indiquera la bonne direction, sinon je pourrai mieux répondre lorsque je serai au travail.