IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Amélioration d'un script JS ?


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2015
    Messages : 54
    Par défaut Amélioration d'un script JS ?
    Bonjour,

    Dans un premier temps, et il me paraît très assez important de le noter, je n'ai aucune base en informatique. Je code assez régulièrement sur un logiciel de programmation de données (SAS) mais c'est sensiblement différent et pas vraiment de l'informatique. J'ai pu récupérer, auprès d'un ami, un script qui fait plus ou moins ce que je cherche (mais comme il le dit, c'est du bricolage) et j'aimerais l'améliorer sur deux ou trois points, d'où ma venue ici.

    Le script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    // ==UserScript==
    // @name ame_en_tab.hs
    // @namespace nimporte quoi
    // @description hache une âme en sections fines
    // @include http://www.hordes.fr/#ghost*
    // @include https://www.hordes.fr/#ghost*
    // @include www.hordes.fr/#ghost*
    // @include www.hordes.fr/#ghost*
    // @grant none
    // @version 1
    // ==/UserScript==
     
    setTimeout(function () {
     var picto;
     var count;
     var ret = [
     ];
     var ind = [
     ];
     //
     var nodes = document.querySelectorAll('div.tid_goal.tid_bg3.tid_tip');
     for (var i = 0, max = nodes.length; i < max; i++)
     {
     picto = nodes[i].querySelector('img.tid_icon').src.slice(54);
     picto = picto.replace('.gif', '');
     count = parseInt(nodes[i].querySelector('div.tid_count > span:first-child').textContent);
     ret[picto] = count;
     }
     ind[0] = ret['r_heroac'];
     ind[1] = ret['r_alcool'];
     ind[2] = ret['r_homeup'];
     ind[3] = ret['r_cwater'];
     ind[4] = ret['r_refine'];
     ind[5] = ret['r_solban'];
     ind[6] = ret['r_ban'];
     ind[7] = ret['r_wound'];
     ind[8] = ret['r_cookr'];
     ind[9] = ret['r_animal'];
     ind[10] = ret['r_cmplst'];
     ind[11] = ret['r_camp'];
     ind[12] = ret['r_cannib'];
     ind[13] = ret['r_watgun'];
     ind[14] = ret['r_chstxl'];
     ind[15] = ret['r_buildr'];
     ind[16] = ret['r_nodrug'];
     ind[17] = ret['r_collec'];
     ind[18] = ret['r_wrestl'];
     ind[19] = ret['r_ebuild'];
     ind[20] = ret['r_cooked'];
     ind[21] = ret['r_digger'];
     ind[22] = ret['r_deco'];
     ind[23] = ret['r_surgrp'];
     ind[24] = ret['r_drug'];
     ind[25] = ret['r_cobaye'];
     ind[26] = ret['r_ruine'];
     ind[27] = ret['r_explor'];
     ind[28] = ret['r_explo2'];
     ind[29] = ret['r_share'];
     ind[30] = ret['r_guide'];
     ind[31] = ret['r_drgmkr'];
     ind[32] = ret['r_theft'];
     ind[33] = ret['r_broken'];
     ind[34] = ret['r_maso'];
     ind[35] = ret['r_bgum'];
     ind[36] = ret['r_ebcstl'];
     ind[37] = ret['r_ebpmv'];
     ind[38] = ret['r_ebgros'];
     ind[39] = ret['r_ebcrow'];
     ind[40] = ret['r_forum'];
     ind[41] = ret['r_jtamer'];
     ind[42] = ret['r_jrangr'];
     ind[43] = ret['r_jermit'];
     ind[44] = ret['r_jcolle'];
     ind[45] = ret['r_jguard'];
     ind[46] = ret['r_jtech'];
     ind[47] = ret['r_dcity'];
     ind[48] = ret['r_dwater'];
     ind[49] = ret['r_dinfec'];
     ind[50] = ret['r_dnucl'];
     ind[51] = ret['r_ddrug'];
     ind[52] = ret['r_surlst'];
     ind[53] = ret['r_suhard'];
     ind[54] = ret['r_mystic'];
     ind[55] = ret['r_doutsd'];
     ind[56] = ret['r_door'];
     ind[57] = ret['r_dhang'];
     ind[58] = ret['r_plundr'];
     ind[59] = ret['r_wondrs'];
     ind[60] = ret['r_repair'];
     ind[61] = ret['r_brep'];
     ind[62] = ret['r_rp'];
     ind[63] = ret['r_cgarb'];
     ind[64] = ret['r_batgun'];
     ind[65] = ret['r_hbuild'];
     ind[66] = ret['r_tronco'];
     ind[67] = ret['r_ptame'];
     ind[68] = ret['r_guard'];
     ind[69] = ret['r_winbas'];
     ind[70] = ret['r_wintop'];
     ind[71] = ret['r_winthi'];
     ind[72] = ret['r_killz'];
     //
     for (var i = 0; i < 73; i++)
     {
     if (typeof ind[i] === 'undefined')
     {
     ind[i] = 0;
     }
     }
     //
     
     var table = document.createElement('table');
     table.id = 'tableau';
     table.title = 'que magnifico!';
     //table.style = "float:left";
     var parent = document.getElementsByClassName('footSearch') [0];
     var premier_fils = parent.firstChild;
     parent.insertBefore(table, premier_fils);
     for (var i = 0; i < 73; i++)
     {
     var cadre = document.createElement('tr');
     cadre.id = i;
     table.appendChild(cadre);
     document.getElementById(i).appendChild(document.createTextNode(ind[i] + '\n'));
     }
    }, 1000);
    Avant d'utiliser ce script, il est nécessaire de créer un compte ici : http://www.hordes.fr/ (ne demande qu'un pseudo, un mail et un mot de passe, aucune vérification n'est nécessaire). Chaque joueur possède une fiche (âme) dont on retrouve sur la gauche un tableau rempli de pictogramme avec une valeur en dessous de chacune. L'idée du script est ici de récupérer, parmi tous les pictogrammes qu'il est possible d'avoir, la valeur de celui - ci pour un joueur en question.
    Pour ce joueur par exemple : http://www.hordes.fr/#ghost/city?go=...14048;sk=14df0 , le script renvoie à l'ouverture de la page (en bas) le rendu suivant : http://image.noelshack.com/fichiers/...ript-rendu.png.

    En résumé, en se rendant sur la fiche d'un joueur, le script nous donne la valeur de tous les pictogrammes que l'on peut avoir pour le joueur en question.

    Dans ce script, je souhaiterais améliorer plusieurs choses :

    Le fait de devoir se rendre sur la fiche d'un joueur est problématique quand j'ai besoin d'obtenir ces statistiques pour une trentaine de joueurs ou plus. Il faut se rendre sur chacune et c/c à chaque fois. Y a t-il un moyen de sortir tous les chiffres dont j'ai besoin en déclarant par exemple le lien vers la fiche de chaque joueur en amont et en retrouver les résultats dans un endroit spécifique ?
    Je n'ai pas besoin de toutes les statistiques. Chaque fois que j'utilise ce script, je n'ai besoin que de la valeur de 2 ou 3 pictogrammes. Y a t-il aussi un moyen de filtrer les valeurs i de ma boucle for ?
    C'est à peu près tout ce qui m'intéresse pour le moment. Je n'ai vraiment aucune base et c'est assez difficile de le modifier selon mes envies.

    A dispo pour toutes questions,

    Mac_Leod.

  2. #2
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Haha, un jeu de Motion Twin et un userscript, deux choses que j’adore ! Le monde est bien petit parfois.

    Je me penche sur ce script. Ce que je peux déjà dire, c’est qu’il y a une maladresse dans la gestion du tableau ind : une boucle qui le remplit, une boucle qui corrige ses valeurs non définies, et une boucle qui utilise ces valeurs. Il y a moyen de fusionner ces trois boucles en une seule, ça sera à la fois plus efficace et plus clair. Ça te donnera également la souplesse dont tu manques pour « filtrer les valeurs de i » comme tu l’as dit.

    Je te donnerai des news après la nuit.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Voilà ma première mise à jour du script, plus courte et compatible avec Chrome.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    // ==UserScript==
    // @name          ame_en_tab.hs
    // @namespace     nimporte quoi
    // @description   hache une âme en sections fines
    // @include       http://www.hordes.fr/*
    // @include       https://www.hordes.fr/*
    // @grant         none
    // @version       1
    // @nocompat      Chrome
    // ==/UserScript==
     
    (function () {
      'use strict';
     
      if (!location.hash.startsWith('#ghost')) return;
     
      new MutationObserver(function (mutations) {
        for (let mut of mutations) for (let node of mut.addedNodes) {
          if (node.matches && node.matches('.tid_userGoals')) {
            this.disconnect();
            fetchPictos(node);
            return;
          }
        }
      }).observe(document.body, { childList: true, subtree: true });
     
      var fetchPictos = function fetchPictos(div) {
        var srcRegex = /(r_\w+)\.gif$/;
        var nodes = div.querySelectorAll('.tid_goals .tid_goal.tid_tip');
     
        var table = document.createElement('table');
        for (let node of nodes) {
          let picto = node.querySelector('img.tid_icon').src.match(srcRegex)[1];
          let count = parseInt(node.querySelector('.tid_count > span').textContent, 10);
          let row = table.insertRow();
          row.insertCell().textContent = picto;
          row.insertCell().textContent = count;
        }
     
        var parent = document.querySelector('.footSearch');
        parent.insertBefore(table, parent.firstChild);
      }
     
    }());

    Parmi mes modifications :
    • J’ai modifié les @include (Tampermonkey ne supporte pas les #) et ajouté un contrôle « à la main » de location.hash.
    • J’ai remplacé le setTimeout par un MutationObserver qui permet d’être sûr que le script agit quand la page est prête (parfois, une seconde ce n’est pas suffisant).
    • J’ai fusionné les boucles for en une seule, et du coup j’ai supprimé le tableau ind qui n’était plus utile.


    Tu remarqueras que les chaînes 'r_…' ne sont plus codées en dur dans le script, mais sont extraites directement du HTML de la page. Il est possible d’ajouter un filtrage en déclarant un tableau contenant uniquement les noms des pictos qui t’intéressent, et en comparant le nom des images aux noms qui sont dans ce tableau.

    Pour obtenir les données dans un « autre format », il est assez facile de les mettre sous forme de texte et de les afficher dans un nouvel onglet. Tu peux aussi faire en sorte que le script te propose de les enregistrer dans un fichier.

    Dis-moi déjà si je pars dans la bonne direction avec ça
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Amélioration d'un script
    Par fourmizen dans le forum jQuery
    Réponses: 1
    Dernier message: 14/04/2010, 16h49
  2. [MySQL] Amélioration de mon script
    Par lumycaan dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 23/07/2009, 14h41
  3. amélioration d'un script !
    Par omécéLinux dans le forum Linux
    Réponses: 3
    Dernier message: 30/04/2009, 16h55
  4. [XML] Amélioration d'un script de parsing RSS
    Par new-dmx dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 23/10/2008, 10h51
  5. Amélioration d'un script
    Par villers dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 29/08/2008, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo