Development #60396
La classe clickable-rows ne fonctionne pas avec les tableaux chargés dynamiquement
0%
Description
Ça concerne la cellule 'Demandes à traiter' qui est chargé en ajax (ticket #59872), dans ce cas il faut poser le gestionnaire d'évènement à la racine du document.
Fichiers
Révisions associées
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Fichier 0001-general-handle-.clickable-rows-at-document-level-603.patch 0001-general-handle-.clickable-rows-at-document-level-603.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
J'ai testé le code sur toulouse-test c'est visible sur https://agents-montoulouse.cutm-publik-preprod.nfrance.com/portail-police-municipale/
Mis à jour par Serghei Mihai il y a plus de 2 ans
Lors du chargement d'une cellule c'est l'événement combo:cell-loaded
qui est déclenché. Autant se baser dessus, je pense.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
Serghei Mihai a écrit :
Lors du chargement d'une cellule c'est l'événement
combo:cell-loaded
qui est déclenché. Autant se baser dessus, je pense.
Autant pour générer du contenu ça me parait obligatoire de passer par là, mais pour un onclick/onauxclick qu'est-ce que je gagne à faire ça ?
Mis à jour par Serghei Mihai il y a plus de 2 ans
Ce que me paraît fragile est qu'au moment du chargement du document les .clickable-rows
ne sont pas encore chargées et ne font pas partie de la DOM.
C'est peut-être un coup de chance que sur la recette de Toulouse ça fonctionne car la cellule se charge rapidement.
Mais je peux me tromper. Je laisse les autres connaisseurs de JS donner leur avis.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
Serghei Mihai a écrit :
Ce que me paraît fragile est qu'au moment du chargement du document les
.clickable-rows
ne sont pas encore chargées et ne font pas partie de la DOM.
Le fait de poser le handler sur document pallie justement à ce problème, les évènements traverse le DOM dans les deux sens de la racine (document) vers le noeud intérieur puis du noeud vers la racine, quand tu utilises la syntaxe $(document).on('event', '<filtre>', ....)
même si l'élément visé par filtre n'existe pas, quand il apparaîtra plus tard ça marchera.
C'est peut-être un coup de chance que sur la recette de Toulouse ça fonctionne car la cellule se charge rapidement.
Non justement c'est la correction ici qui fait que ça marche.
On passe par combo:cell-loaded
quand il y a du contenu à générer/modifier suite au chargement d'une cellule par le code des cellules asynchrones, si au passage on ajoute des gestionnaires d'évènement c'est surtout par souci de garder le code un peu rassemblé mais ça n'est pas strictement nécessaire (mais on pourrait aussi utiliser un MutationObserver1 et tout gérer sans trop d''évènement' custom).
1 https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
Mis à jour par Serghei Mihai il y a plus de 2 ans
- Statut changé de Solution proposée à Solution validée
Benjamin Dauvergne a écrit :
Le fait de poser le handler sur document pallie justement à ce problème, les évènements traverse le DOM dans les deux sens de la racine (document) vers le noeud intérieur puis du noeud vers la racine, quand tu utilises la syntaxe
$(document).on('event', '<filtre>', ....)
même si l'élément visé par filtre n'existe pas, quand il apparaîtra plus tard ça marchera.
Fire then.
Mis à jour par Thomas Jund (congés, retour le 29/04) il y a plus de 2 ans
Le delegation d'evenement peut parfois bien plomber les performances. Et dans ce cas certainement impacter negativement (parfois c'est mieux, ça dépend).
L'evenement sera lancer chaque fois qu'on clic sur document, et par propagation (bubbling) de l'event, il va ensuite vérifier si le click est egalement effectué sur `.clickable-rows tr`.
Je suis ok avec Serghei, pourquoi ne pas simplement attaché l'event au tableau une fois qu'il est chargé ? et s'il y a beaucoup de tr au tableau, là il est préférable d'attacher d'event au tableau plutôt qu'à chaque row
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 7546932ddf4fec73d18c691831781484c5beedd5 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Fri Jan 7 10:22:17 2022 +0100 general: handle .clickable-rows at document level (#60396)
Mis à jour par Thomas Jund (congés, retour le 29/04) il y a plus de 2 ans
- Statut changé de Résolu (à déployer) à Solution validée
(mais c'est juste pour info, si pas de prob de perf, faut pas s'embêter)
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
J'en prends note, si quelqu'un constate des lenteurs quand on a un tableau 'clickable-rows' qu'il ouvre un ticket, je ferai le nécessaire.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
general: handle .clickable-rows at document level (#60396)