J'ai des widgets auxquels des contrôles javascript sont associé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, je reçois le balisage, mais aucun événement javascript ne prend effet.
Si j'enregistre le nouveau widget, lorsque le formulaire est rechargé, les contrôles sont créés correctement et fonctionnent maintenant.
L'actualisation de la page corrige é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:
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é détecté qu'il peut convertir.
Remarques:
Alors, comment faire fonctionner le contrôle de sélection sans demander à l'utilisateur d'actualiser/cliquer sur enregistrer avant d'apporter des modifications?
Bonne nouvelle,
Je l'ai réparé.
Mes excuses pour avoir manqué votre Gist dans mon commentaire initial et pour vous donner une réponse que vous aviez déjà mise en œuvre. Cela m'apprendra à répondre au téléphone en train!
Votre utilisation de ajaxstop est correcte. Hell le JS fonctionne pour la plupart correctement, vous pouvez voir les styles CSS en cours d'initialisation et les modifications dans le DOM.
Le problème réside en fait avec votre sélecteur.
En effet, le contenu du widget n'est pas chargé via ajax. En fait, il le clone dans la colonne de gauche où il est masqué, puis déclenche un appel ajax pour enregistrer la position du widget dans la colonne de droite. Cela explique pourquoi ajaxstop fonctionne comme un régal, même si le contenu pensé est cloné. Cependant, comme il existe une version cachée du widget dans la colonne de gauche, votre système de surveillance est instancié sur ce point. En tant que tel, lorsque vous le faites glisser dans la colonne de droite, vous obtenez un clone mutilé du widget masqué.
Ainsi, vous devez sélectionner celui du côté gauche. Ci-dessous le code corrigé:
<script>
jQuery( document ).ready( function( $ ) {
function runSelect() {
var found = $( '#widgets-right select.testselectize' );
found.each( function( index, value ) {
$( value ).selectize();
.removeClass( 'testselectize' )
.addClass( 'run-' + window.counter );
console.log( $val );
window.counter++;
} );
}
window.counter = 1;
runSelect();
$( document ).ajaxStop( function() {
runSelect();
} );
} );
</script>
Comme l'a commenté @ aaron-holbrook, une approche plus propre consiste à:
jQuery(document).on('widget-updated widget-added', function(){
// your code to run
});
Dans de nombreux cas, vous souhaiterez également exécuter le JS lors du chargement de la page ainsi que lors de la mise à jour des widgets. Vous pouvez le faire comme ça.
function handle_widget_loading(){
// your code to run
}
jQuery(document).ready( handle_widget_loading );
jQuery(document).on('widget-updated widget-added', handle_widget_loading );
Il suffit de coller ici pour référence car les réponses sont beaucoup plus faciles à trouver que les commentaires