Projet

Général

Profil

Development #60396

La classe clickable-rows ne fonctionne pas avec les tableaux chargés dynamiquement

Ajouté par Benjamin Dauvergne il y a plus de 2 ans. Mis à jour il y a plus de 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
07 janvier 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Révision 7546932d (diff)
Ajouté par Benjamin Dauvergne il y a plus de 2 ans

general: handle .clickable-rows at document level (#60396)

Historique

#2

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

#3

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

#4

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.

#5

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 ?

#6

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.

#7

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

#8

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.

#9

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

#10

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)
#11

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)

#12

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.

#13

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Statut changé de Solution validée à Résolu (à déployer)
#14

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
#15

Mis à jour par Transition automatique il y a environ 2 ans

Automatic expiration

Formats disponibles : Atom PDF