Un égal différent ?!

Désolé pour le titre, pas trouvé mieux

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Pulp.
Bon, je m'excuse pour le titre, j'édite si j'ai mieux, mais j'avoue que la je suis bouche bée devant ce probleme.
Le problème ne m'embete pas vraiment, il rend juste mon code plus sale qu'il ne l'ait déjà (Je referais tout au propre, ce n'est pas le probleme).
Bon voilà le code qui m'embete un peu :

1
2
3
4
if(!ZDSNotif.BrowserOverlay.showNotif) {
              dropdown.innerHTML = htmlNotif;
              dropdown.innerHTML == htmlNotif ? alert('ok') : alert('wtf?');
            }

Le probleme avec ce code est qu'il m'affiche wtf?. Et j'avoue ne pas comprendre. Voici la fonction en détail (je répète, c'est sale) :

  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
function getNotifAndMP() {
      var toolbarbutton = document.getElementById('zds-notif-button');
      var dropdown = document.querySelector('.dropdown');
      var oReq = new XMLHttpRequest();
      oReq.open("GET", 'http://zestedesavoir.com', true);
      oReq.onload = function () {
        //Parse la page
        var DOMPars = HTMLParser(this.responseText.replace(/href=\"\//g, 'href="http://zestedesavoir.com/'));
        var isConnected = false;
        for(var i = 0; i < DOMPars.getElementsByClassName('dropdown').length; ++i)
        {
          //Notifications
          if(DOMPars.getElementsByClassName('dropdown')[i].innerHTML.indexOf('Notifications') != -1)
          {
            var htmlNotif = DOMPars.getElementsByClassName('dropdown')[i].innerHTML;
            //var notiflab = document.querySelector('.notiflab');
            if(htmlNotif.split("<a").length-2 > 0)
              toolbarbutton.setAttribute('image', 'chrome://zds-notif/skin/images/icone_n_20.png');
            else if(!ZDSNotif.BrowserOverlay.isMP)
              toolbarbutton.setAttribute('image', 'chrome://zds-notif/skin/images/icone_20.png');
            //notiflab.innerHTML = (htmlNotif.split("<a").length-2).toString();

            htmlNotif = htmlNotif.substring(htmlNotif.indexOf('<ul'), htmlNotif.indexOf('</ul>')+5);

            //Convert HTML in XUL
            htmlNotif = htmlNotif.replace(/<span/g, '<html:span');
            htmlNotif = htmlNotif.replace(/<\/span/g, '</html:span');
            htmlNotif = htmlNotif.replace(/<ul/g, '<html:ul');
            htmlNotif = htmlNotif.replace(/<\/ul/g, '</html:ul');
            htmlNotif = htmlNotif.replace(/<li/g, '<html:li');
            htmlNotif = htmlNotif.replace(/<\/li/g, '</html:li');
            htmlNotif = htmlNotif.replace(/<a/g, '<html:a');
            htmlNotif = htmlNotif.replace(/<\/a/g, '</html:a');
            htmlNotif = htmlNotif.replace(/href=\"\//g, 'href="http://zestedesavoir.com/');
            htmlNotif = htmlNotif.replace(/src=\"\//g, 'src="http://zestedesavoir.com/');
            htmlNotif = htmlNotif.replace('<img(.*)>', '');

            if(ZDSNotif.BrowserOverlay.showNotif)
              dropdown.innerHTML = htmlNotif;

            isConnected = true;
          }
          //Messagerie
          if(DOMPars.getElementsByClassName('dropdown')[i].innerHTML.indexOf('Messagerie') != -1)
          {
            var htmlNotif = DOMPars.getElementsByClassName('dropdown')[i].innerHTML;
            //var mplab = document.querySelector('.mplab');
            if(htmlNotif.split("<a").length-2 > 0)
            {
              toolbarbutton.setAttribute('image', 'chrome://zds-notif/skin/images/icone_m_20.png');
              ZDSNotif.BrowserOverlay.isMP = true;
            }
            else
            {
              toolbarbutton.setAttribute('image', 'chrome://zds-notif/skin/images/icone_20.png');
              ZDSNotif.BrowserOverlay.isMP = false;
            }
            //mplab.innerHTML = (htmlNotif.split("<a").length-2).toString();

            htmlNotif = htmlNotif.substring(htmlNotif.indexOf('<ul'), htmlNotif.indexOf('</ul>')+5);

            //Convert HTML in XUL
            htmlNotif = htmlNotif.replace(/<span/g, '<html:span');
            htmlNotif = htmlNotif.replace(/<\/span/g, '</html:span');
            htmlNotif = htmlNotif.replace(/<ul/g, '<html:ul');
            htmlNotif = htmlNotif.replace(/<\/ul/g, '</html:ul');
            htmlNotif = htmlNotif.replace(/<li/g, '<html:li');
            htmlNotif = htmlNotif.replace(/<\/li/g, '</html:li');
            htmlNotif = htmlNotif.replace(/<a/g, '<html:a');
            htmlNotif = htmlNotif.replace(/<\/a/g, '</html:a');
            htmlNotif = htmlNotif.replace(/href=\"\//g, 'href="http://zestedesavoir.com/');
            htmlNotif = htmlNotif.replace(/src=\"\//g, 'src="http://zestedesavoir.com/');
            htmlNotif = htmlNotif.replace('<img(.*)>', '');

            if(!ZDSNotif.BrowserOverlay.showNotif) {
              dropdown.innerHTML = htmlNotif;
              dropdown.innerHTML == htmlNotif ? alert('ok') : alert('wtf?');
            }
            isConnected = true;
          }
        }
        var toParse = dropdown.innerHTML;
        //Si on est déconnecté.
        if(!isConnected)
        {
          dropdown.innerHTML = '<html:a href="http://zestedesavoir.com/membres/connexion/?next=/" class="dropdown-link-all">Connexion</html:a>';
          toolbarbutton.setAttribute('image', 'chrome://zds-notif/skin/images/icone_20_logout.png');
        }
        else
        {
          if(ZDSNotif.BrowserOverlay.showNotif)
            dropdown.innerHTML += '<html:a href="http://zestedesavoir.com/forums/notifications/" class="dropdown-link-all">Toutes les notifications</html:a>';
          else
            dropdown.innerHTML += '<html:a href="http://zestedesavoir.com/mp/" class="dropdown-link-all">Tous les messages</html:a>';
        }

        var Anchors = document.getElementsByTagName("html:a");
    for (var i = 0; i < Anchors.length ; i++)
      Anchors[i].addEventListener("click", linkClick, false);

        var tempAnchors = document.getElementsByTagName("a");
    for (var i = 0; i < tempAnchors.length ; i++)
      tempAnchors[i].addEventListener("click", linkClick, false);
      };
      oReq.send(null);
    }

Encore quelques détails :
+ htmlNotif contient donc du XUL. Il ressemble à : "<html:a href="blabla">blabla</html:a>" (bon, il est plus complet mais voilà).
+ Après l'instruction dropdown.innerHTML = htmlNotif; J'ai remarqué que dropdown contient htmlNotif non pas en XUL mais en HTML !!! J'ai l'impression que innerHTML convertit, mais c'est débile parce que lorsqu'on fait :

1
dropdown.innerHTML += '<html:a href="http://zestedesavoir.com/mp/" class="dropdown-link-all">Tous les messages</html:a>';

On a bien du XUL à l'intérieur de dropdown.

Voilà ma petite découverte que je ne comprends pas. Avez-vous une idée ?
AmarOk

Staff

Cette réponse a aidé l'auteur du sujet

J'ajoute qu'il faut toujours faire attention quand on compare innerHTML car le navigateur peut modifier le contenu sans prévenir entre deux traitements.

Pour le coup ça peut correspondre ici à une traduction XUL->HTML pour éviter d'avoir à gérer 36 namespaces lors du parsing par Gecko ;)

<troll type="gros" pilosité="élevé">Tu aimes l'environnement pour les extensions Firefox ? :D </troll>

Édité par viki53

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte