Vous n'êtes pas identifié(e).
Pages :: 1
Saluton,
C'est de nouveau moi avec mes petits errements JQueryistiens.
J'ai un tableau dont chaque <tr> est affecté d'une des classes suivantes qui correspondent à des catégories d'items :
Je souhaite que le premeier <td> de chacun des <tr> de ces classes soit en affichage "bold"
Aucun message d'erreur dans Firebug et pourtant les caractères de ma première colonne demeurent d'une maigreur consternante.
Pour les curieux, voici un les 65 premières lignes du tableau, c'est un lexique Česká-francouzský slovník ◊ Lexique tchèque-français
Bon là je n'ai que 146 items, mais, à terme, il y en aura environ 1500. Je sais que je pourrais encadrer toutes les valeurs de la première colonne avec des <b>item</b>, mais comme //ment je suis en train de mettre au point un petit moteur de recherche, je veux éviter de polluer le contenu de la colonne.
Je ne doute pas de me prendre encore une volée de bois vert de la part de notre cher Pierrot, mais là je tourne en rond sur cette technique car quelque chose doit m'échapper dans la syntaxe du sélecteur.
Bref, ça ne plante rien, mais ça ne rend pas le service attendu, juste ça me gonfle "grave" !!!
J'ai jamais autant bossé que depuis que je suis à la retraite, moi.
Même plus le temps de faire grève.
Merci de votre patience envers le 4° âge.
Amike, MK.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Bon, j'ai fait évoluer la chose comme ceci:
Et là, j'obtiens un résultat qui m'a surpris, mais qui est pourtant cohérent avec la syntaxe.
La première cellule <td> de chacune des 6 classes est bien en fonte grasse.
Donc comment je dois faire, passer par un <colgroup> ?
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Youpiie !!! Larirette !
J'ai trouvé.
J'utilise la hiérachie à partir de l'id='lexic' du tableau
Trop fort ce Jquery, une seule instruction.
Bon, j'ai bien mérité un petit dodo.
Ah et puis, merci à tous
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
çà s'appel de l'auto-aide :D
a++
Hors ligne
Salut MK,
Je te conseille vivement de définir tes comportements par défaut dans une feuille de style css et tes comportements particuliers inline avec jquery/js. Parce que certes, tu ne pollues pas ton html en procédant comme tu l'as fait, mais tu pollues ton code javascript...
Ensuite sache que les pseudo classes existent aussi en css et non pas qu'en Jquery, même si elles sont plus étendues en jquery.
D'autre part, peut-être sont-ce des pratiques à la mode, mais de plus en plus de gens, de part la simplicité d'écriture qu'offre jquery, ont tendance à boucler sur des classes ou attributs pour modifier le DOM pour, je cite "rendre le code indépendant de valeurs d'id" sous pretexte qu'elles changent au fil du temps et des modifications de code.
Or c'est tout sauf performant. Travailler le plus possible sur des ids invariants avec une convention de nommage propre est à mon sens incontournable, car c'est un Must Have en terme de performances applicative.
Sinon faire un <td class="first_td"></td> ne pollue en rien l'écriture du html entre nous, et quand tu regardes bien, cela t'économise bien des traitements...
++
Dernière modification par Jc (13-02-2013 20:59:52)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Salut MK,
Salut Jc,
Je te conseille vivement de définir tes comportements par défaut dans une feuille de style css et tes comportements particuliers inline avec jquery/js. Parce que certes, tu ne pollues pas ton html en procédant comme tu l'as fait, mais tu pollues ton code javascript...
????
Ensuite sache que les pseudo classes existent aussi en css et non pas qu'en Jquery, même si elles sont plus étendues en jquery.
En l'occurrence, je ne vois pas quelle pseudo-classe CSS je peux invoquer ici
Sinon faire un <td class="first_td"></td> ne pollue en rien l'écriture du html entre nous, et quand tu regardes bien, cela t'économise bien des traitements...
Là, je ne suis pas sûr de te suivre, entre une instruction JQuery :
et répéter 1500 foix class="first_td" dans la première <td> des 1500 <tr> du lexique, à quoi il faut bien ajouter une petite règle CSS pour la class first_td, je ne vois pas bien l'avantage.
Et quels traitements sont donc économisés ? sachant que j'utilise, évidemment, JQuery, pour d'autres fonctionnalités dans la page.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Re Mk,
Et bien pas de soucis, on va détailler.
Et on va commencer par poser les choses.
1. <td class="first_td"></td>
Quand tu écris cela, le comportement CSS de ta balise est chargé en même temps que ta page, ce qui implique qu'il n'y a aucun calcul ultérieur du navigateur pour savoir comment il doit afficher le contenu, l'affichage est instantané.
EDIT: je rappele aussi que la classe est définie une fois pour toutes, quelque soit la complexité de sa définition, et évite de toute réécrire comme on devrait le faire si on le fait inline (style=" ").
On factorise ainsi le code et on protège le comportement de base au niveau style, contrairement à l'écriture inline, qui l'expose.
2. $('#lexic tr td:first-child').css('font-weight','bold');
Ceci est très optimisé car cela applique ce que je viens de dire, à savoir que ta recherche primaire dans le DOM se fait par ID (présence de: #). Donc le scan du dom est très limitatif et donc la performance est du même ordre de grandeur que la recherche de l'ID.
3. et répéter 1500 foix class="first_td" dans la première <td> des 1500 <tr> du lexique, à quoi il faut bien ajouter une petite règle CSS pour la class first_td, je ne vois pas bien l'avantage.
On a un problème ici, cela voudrait-il dire que tu as 1500 fois l'ID "lexic" présent dans ton DOM? que fais-tu de l'unicité de l'ID que tu as besoin de préserver de plus dans ton cas de figure? Vu le nombre de lignes concernées ta recherche par ID se rapprochera de la performance d'une recherche par [name=xxxx] : Un quasi-full scan de ta page qui comporte autant de lignes pour appliquer les modifications CSS à un comportement statique localisé est bien moins performant que de rajouter un class="first_td" sur chacune de tes 1500 lignes, car le traitement est immédiat. On est donc bien dans un cas de traitement multiple qui justifie mon choix et qui invalide ton choix d'implémentation.
Jc a écrit :Je te conseille vivement de définir tes comportements par défaut dans une feuille de style css et tes comportements particuliers inline avec jquery/js. Parce que certes, tu ne pollues pas ton html en procédant comme tu l'as fait, mais tu pollues ton code javascript...
????
Pour bien comprendre ce qui se passe sous le capot quand tu écris par exemple
1. Jquery scanne le DOM à la recherche de toutes les balises td ayant pour attribut name="xxx".
2. A chaque fois qu'il rencontre une balise td qui vérifie les conditions requises il va insérer dans la balise le code suivant : style="font-weight:bold" et si l'attribut style existe déjà il va y rajouter cette définition à celle existante, et la remplacer si l'attribut font-weight est déjà présent.
3. Le code est réévalué et l'affichage est mis à jour par le navigateur.
=> Dans ces conditions, laquelles de nos solutions respectives est la plus performante à ton avis?
++
Dernière modification par Jc (13-02-2013 23:48:02)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Re,
Concernant les pseudo classes : http://www.w3schools.com/css/css_pseudo_classes.asp
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
OK pour ton avant-dernier raisonnement, d'autant que les 1500 lignes sont générées par un script PHP (Ouf ! je n'aurais pas à saisir 1500 fois class="first-child").
Par contre, tu penses que je peux même me contenter de mettre
dans la feuille de style ?
Aurais-je sombré dans une forme de JQuerite ?
Ce serait bien paradoxal, moi qui suis resté assez rétif à cette technologie.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Et je confirme (j'avais au demeurant peu de doutes) que la règle CSS seule offre le même service.
Dont acte.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Mon avis pour aller de l'eau au moulin ou pour carrément dévier la rivière !!!
Je suis d'accord avec JC sur le fait de mettre/modifier/ajouter des styles directement avec jQuery. Il est plus propre de travailler avec une classe (qui est d'ailleurs déjà "compilé" par le navigateur). Plutôt que de faire
Il est plus propre de faire :
En revanche, je ne suis pas du même avis. Il est bien plus propre d'utiliser la pseudo-classe :first-child que ce soit en css ou javascript plutôt que d'ajouter une classe first-child au premier fils. Je ne parle que css/html et pas javascript (j'y viendrais ensuuite). La différence de vitesse de rendu doit difficilement être perceptible à moins d'avoir une page de 10 kilomètres de long.
Concernant javascript il suffit de restreindre l'ensemble des noeuds à parcourir pour améliorer les performances :
p.s: Par parenthèses, w3schools n'est pas forcément un bon site de référence. Il est bien présenté, est la plupart du temps correct mais contient quelques erreurs.
Hors ligne
Concernant javascript il suffit de restreindre l'ensemble des noeuds à parcourir pour améliorer les performances :
$('tr td:first-child', '#identifiant-du-tableau-par-exemple')...
Je ne suis plus sûr de pouvoir suivre.
J'ai mis
dans ma feuille de style, il vaudrait mieux faire
????
J'ai du louper un épisode.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
nicolas a écrit :Concernant javascript il suffit de restreindre l'ensemble des noeuds à parcourir pour améliorer les performances :
$('tr td:first-child', '#identifiant-du-tableau-par-exemple')...Je ne suis plus sûr de pouvoir suivre.
J'ai mis#lexic tr td:first-child {font-weight:bold}dans ma feuille de style, il vaudrait mieux faire
$('tr td:first-child', '#lexic')...????
J'ai du louper un épisode.
En fait ton besoin peut se résoudre totalement en css sans une once de javascript. Je répondais à Jc sur sa préférence entre une classe .first-child placé sur chaque premier fils et l'utilisation de la pseudo-classe :first-child.
Hors ligne
En fait ton besoin peut se résoudre totalement en css sans une once de javascript. Je répondais à Jc sur sa préférence entre une classe .first-child placé sur chaque premier fils et l'utilisation de la pseudo-classe :first-child.
Ah ! quel soulagement, je ne suis pas complètement perdu, il me reste quelque avenir.
Merci mon bon nicolas de ta charitable réponse à mon désarroi existentiel.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Bonjour,
Tout d'abord pour répondre à MK (mais cela vaut aussi pour nico )
$("#lexic tr td:first-child")
est mieux que
$('tr td:first-child', '#identifiant-du-tableau-par-exemple')
pour la bonne et simple raison que les sélecteurs jquery sont évalués avec une précédence de la gauche vers la droite. Et la recherche à partir de l'ID est toujours meilleure. EDIT: D'ailleurs je ne suis pas convaincu que la seconde fonctionne...
Ensuite pour nicolas,
Il est bien plus propre d'utiliser la pseudo-classe :first-child que ce soit en css ou javascript plutôt que d'ajouter une classe first-child au premier fils. Je ne parle que css/html et pas javascript (j'y viendrais ensuuite). La différence de vitesse de rendu doit difficilement être perceptible à moins d'avoir une page de 10 kilomètres de long.
Tu as tout à fait raison concernant les performances et la propreté du code. Par contre, et je dois bien l'avouer, lorsque l'on est dans un contexte ou les performances sont équivalentes, en général on adopte la solution naturelle à savoir ... celle de nos habitudes...
++
Dernière modification par Jc (14-02-2013 16:11:55)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
$('tr td:first-child', '#identifiant-du-tableau-par-exemple')
pour la bonne et simple raison que les sélecteurs jquery sont évalués avec une précédence de la gauche vers la droite. Et la recherche à partir de l'ID est toujours meilleure. EDIT: D'ailleurs je ne suis pas convaincu que la seconde fonctionne...
Hé hé, toi aussi tu aurais été recalé en entretien !
Les candidats à qui j'ai posé la question avaient les réponses suivantes :
- je ne connais pas cette syntaxe. D'ailleurs je ne suis pas sûr qu'elle existe
- cette syntaxe n'existe pas
- c'est moins performant que de mettre li'dentifiant devant
- ...
Donc aussi bizarre que cela puisse paraître au premier abord la syntaxe $('.ma-classe', '#mon-id') est non seulement bien entendu valide mais est deux fois plus rapide (en général,...) que la syntaxe "normale" $('#mon-id .ma-classe')
Hors ligne
Je complète dans un nouveau message.
La doc est là :
http://api.jquery.com/jQuery/#jQuery1
Le test de perf est là : (mais on peut en trouver d'autres qui donnent le même ratio)
http://jsperf.com/jquery-selector-context-comparison
Evidemment si on peut accéder à l'élément directement il n'y a pas photo !
Hors ligne
Merci Nicolas pour ton retour !
Parfois, et cet exemple confirme la règle, ca ne fait pas de mal de s'arrêter 5min pour réfléchir à ce que l'on fait, car l'exemple d'utilisation donné, je le connaissais, mais utilisé dans une closure... et je n'ai jamais pensé à l'utiliser hors de ce contexte , ca me paraît incroyable!.
Par contre je suis déçu des tests de perfs. En effet,
1) document.getElementById("MonID") et $("#MonID") censés être équivalents, démontrent une perte de 18% de perf pour JQuery, dû à la couche du Framework je pense.
2) D'après le lien de la doc que tu as fourni, que je vais reprendre ici, $(".MaClasse", $("#MonID")) et $("#MonID").find(".MaClasse") qui sont censés être absolument équivalent en interne à Jquery, montrent d'une difference de perf de presque 20% en faveur du find !! (qui rejoint quelque part ce que j'ai dit lorsque l'id est en premier soit dit en passant).
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Après il faut faire attention aux perfs car on en arrive à faire des choses contre nature (non, non rien de sexuel !!!!) :
en théorie $('#id2', '#id1') est plus performant que $('#id1 #id2') ce qui semble assez logique (et évidemment moins performant que $('#id2')). Mais il n'est pas très logique de devoir accéder à à l'élément d'id id2 comme enfant de #id2. En revanche le cas avec le contexte peut se trouver mais ce sera l'objet d'une autre histoire.
Hors ligne
Désolé les gars, mais je suis en panne d'aspirine.
A demain ?
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Pages :: 1