Partage
  • Partager sur Facebook
  • Partager sur Twitter

GreaseMonkey retirer un élement de la page

Sujet résolu
    18 octobre 2011 à 18:21:37

    Bonjour,
    voulant jouer un peu avec js et greasemonkey je me lance dans une solution pour un client, il veut virer l'accès aux paramètres messagerie dans gmail...

    un coup de firebug et j'identifie la balise : <span id="gbi5"></span>

    tout content je fais :
    // ==UserScript==
    	// @name                RemoveGmailSettings
    	// @namespace	        http://www.ademis.com/scripts/gmadcloud/
    	// @description	        remove gmail settings. 
    	// @include		https://mail.google.com/mail/*
    	// ==/UserScript==
    
    	var gmailsettings = document.getElementById("gbi5").innerHTML;
    	alert(gmailsettings);
    


    juste pour tester si j'attrape bien la bonne balise et il ne se passe rien ???

    comment retirer de l'affichage ce span id=gbi5 ?

    merci
    • Partager sur Facebook
    • Partager sur Twitter
      18 octobre 2011 à 20:38:56

      Essaie d'écrire ça dans un window.onload peut-être ? si ton code est exécuté avant que le span en question soit parsé ça va planter.

      Tu regardes la console d'erreur quand tu codes ?
      • Partager sur Facebook
      • Partager sur Twitter
        18 octobre 2011 à 23:04:56

        non je n'ai pas regardé la console faut dire que je me suis lancé là-dedans sans trop réfléchir et sans avoir fait de javascript avant ;-)

        je vais regarder en suivant tes conseils
        • Partager sur Facebook
        • Partager sur Twitter
          18 octobre 2011 à 23:23:07

          Commence déjà par enlever le innerHTML.

          Comme ça tu sauras vraiment si tu récupères l'élément, ou si tu récupères "null"...
          • Partager sur Facebook
          • Partager sur Twitter
            19 octobre 2011 à 11:57:52

            j'ai donc procédé à quelques essais avec vos pistes :

            - en virant innerhtml, j'ai bien alert qui ouvre une boite intitulé "greasemonkey alerte" et qui est vide de tout contenu.

            j'ai essayé le code suivant :

            window.addEventListener('load', onLoad, false);  
                  
            	function onLoad() {  
            	     if ( document.getElementById('gbi5') ) {  
            		 var gmailsettings = document.getElementById('gbi5');  
            		 gmailsettings.innerHTML = '';  
            	     }  
            	    }
            


            mais je n'obtiens toujours pas le résultat escompté, et dans la console je ne vois aucun élément se rapportant à ce script, je dois aborder le truc à l'envers ou google a mis un truc qui me bloque peut-être ?


            EDIT : la solution qui fonctionne inspiré d'un autre script :

            setInterval(doStuff, 100);
            
            function doStuff()
            {
            	if(document.getElementById("gbi5"))
            	{
            		// id gbi5 for settings
            		document.getElementById("gbi5").style.display="none";
            	}
            }
            
            • Partager sur Facebook
            • Partager sur Twitter
              20 octobre 2011 à 9:34:45

              Pense à faire un clearInterval après.
              • Partager sur Facebook
              • Partager sur Twitter
                20 octobre 2011 à 22:47:07

                j'ai regardé car j'avais copié collé setinterval donc sans savoir son utilité ;-)

                si j'ai bien compris ça renvoie la fonction toutes les 200 msec, je suppose que le gars qui 'lavaity mis le fait pour être certain de toujorus masquer les balises en questions...

                donc si je fais un clear c'est propre et ça évite la surcharge mais ça casse le principe non ?

                en même temps je me demande si un winodw.onload ne serait pas tout aussi efficace, le but c'est juste qu'à ouverture de la page les balises non déisrées soit masquées...
                • Partager sur Facebook
                • Partager sur Twitter
                  21 octobre 2011 à 8:29:52

                  Bravo pour la réflexion :)

                  La seule erreur c'est sur le setInterval : la propriété display de gbi5 ne va pas spontanément revenir à "bloc" (ou que sais-je) juste parce que tu as arrêté de la passer à "none". Dès que tu la passe une première fois à "none" tu peux t'arrêter.

                  La raison pour laquelle ce gars a utilisé setInterval, c'est parce qu'il n'arrivait pas à utiliser window.onload. Donc, au lieu d'attendre le chargement de la page, il a fait s'exécuter sa fonction à interval régulier de façon à ce que, au bout d'un moment, elle finisse par s'exécuter quand gbi5 existe.

                  edit. normalement addEventListener fonctionne dans greaseMonkey. J'ai écrit ça et ça marche.

                  window.addEventListener('load', function(){
                     alert("onload");
                  });
                  


                  Tu n'as pas pensé à une éventualité : que gbi5 ne soit pas présent dans le HTML brut mais qu'il soit généré après window.onload par un script dans la page (par exemple, sur Yahoo mail tout est généré par script, c 'est scandaleux). Dans ce cas ça ne sert à rien d'écouter l'événement load de la page, d'où peut-être le setInterval.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 octobre 2011 à 9:49:17

                    je pense effectivement que le setInterval se justifie parceque les balises gmail sont générées après onload car mes premiers essais utilisait onload et je ne récupérai jamais la balise...

                    mon script a évolué (j'ai un client qui prend goût à la personnalisation de son gmail lol)

                    setInterval(doStuff, 100);
                    
                    function doStuff()
                    {
                    	
                    document.getElementsByClassName('nH fY')[0].style.display="none";
                    
                    for (var i =0 ; i< 14 ;i++)
                    {
                    	document.getElementsByClassName('r7')[i].style.display="none";
                    }
                    
                    document.getElementsByClassName('r7')[15].style.display="none";
                    document.getElementsByClassName('r7')[16].style.display="none";
                    
                    }
                    


                    il s'agit de masquer presque tout dans la page settings de gmail sauf un formulaire pour paramétrer la réponse auto...

                    aucun id repéré qui puisse m'aider cette fois car gmail semble avoir choisi la voie de l'imbrication de span class...

                    du coup j'ai bien réussi avec le script ci-dessus à obtenir le résultat escompté sous chrome (sous firefox le numéro des r7 changent lol)

                    mais je suppose que ce script est optimisable non ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 octobre 2011 à 12:56:36

                      Tu n'essaierais pas, plutôt, de créer une feuille de style personnalisée pour mettre de simples display: none; sur les balises qui dérangent ?

                      Tu peux utiliser la règle !important en CSS pour remplacer un style.

                      Si le client ne veux pas installer de feuille de style personnalisée dans son névigateur (ce qui serait étonnant puisqu'il veut bien installer greaseMonkey), tu peux toujours générer une balise style en DOM et coller dedans une chaîne de caractères avec tout ton CSS.

                      ça me semble plus léger à mettre en oeuvre.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 octobre 2011 à 13:04:37

                        je n'avais pas pensé à cette piste.

                        j'ai peur cependant que ce soit complexe car des class r7 gmail en mets pleins dans la page modifiée, l'avantage du script c'est que le get les gèrent comme un array du coup avec la clé je peux cibler celle que je veux...

                        j'ai de bonnes bases en CSS mais je vois mal comment en faire autant ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 octobre 2011 à 15:00:59

                          Le problème de ce type de sélection c'est que si demain gmail ajoute ou enlève ne serait-ce qu'un r7, ça te fout un bordel monstre.

                          Il vaut mieux regarder quels sont les éléments parents ou adjacents pour faire des sélections précises, et là le CSS te donne des opérateurs comme parent enfant ; parent > enfant direct ; référent + prochain élément ; référent ~ prochains éléments ; etc.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 octobre 2011 à 15:10:23

                            c'est effectivement ma crainte et vu le code généré par gmail ça arrivera sans doute...

                            le truc c'est que avec parents>enfants ils ont bien compliqué le truc en imbriquant tout justement.

                            par exemple le xpath du r7 qui m'intéresse :

                            /html/body/div/div[2]/div/div[2]/div/div[2]/div/div/div/div[2]/div/div/div/div/div[2]/div/div[2]/div/div[2]/div/div[2]/div/div/table/tbody/tr[16]
                            


                            quasi chaque div n'a que la class nH pour être visé...

                            comme je n'ai par contre pas de bonnes bases en js, xptah et dom il est possible qu'une méthode m'échappe ?

                            là le but c'est de n'afficher que le tr[16] dont j'ai copié le xpath...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 octobre 2011 à 17:02:27

                              Dans ce cas je te conseillerais effectivement de continuer en JS, mais de découper ton script en plusieurs parties en ciblant un proche parent avant de faire le getElementsByClassName().

                              En gros : ne fais pas de document.getElementsByClassName() mais plutôt des parent.getElementsByClassName())

                              Si non, juste un truc : ne fais pas 10 fois le même getElementsByClassName(). C'est lourd à force. Stocke-le dans une variable.

                              Tu as le droit d'écrire var mes_r7 = document.getElementsByClassName('r7'); et après mes_r7[16].style.display="none";
                              • Partager sur Facebook
                              • Partager sur Twitter

                              GreaseMonkey retirer un élement de la page

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown