[JS] innerHTML ie et mozilla : galere !

innerHTML ie et mozilla : galere ! [JS] - HTML/CSS - Programmation

Marsh Posté le 12-06-2002 à 19:25:43    

alors ca marche sous ie mais pas sous mozilla :
 
<div id="d"></div>  
<script language="JavaScript">
<!--
d.innerHTML="toto";  
//-->
</script>
 
et ca ca marche sous mozilla et sous ie j'ai une belle erreur cet objet ne gere pas cette propriete
 
<div id="d"></div>  
<script language="JavaScript">
<!--
d = document.getElementById("d" );  
d.innerHTML="toto";  
//-->
</script>
 
 :cry: comment je fé moa ?  [:sharpknife]


---------------
All we need is a soul revolution
Reply

Marsh Posté le 12-06-2002 à 19:25:43   

Reply

Marsh Posté le 12-06-2002 à 19:31:32    

normal, d existe déjà et est 'read-only'. je suppose que ie ne sait pas trop quoi faire et plante.
 
solution qui marche sous ie et mozilla :
 
document.getElementById('d';).innerHTML = 'hello';
 
sinon, nommer les objets que tu récupères avec getElementById() différemment de ceux qui existent déjà dans l'html (eg nodeD = document.getElementById('d';); )


Message édité par youdontcare le 06-12-2002 à 19:36:44
Reply

Marsh Posté le 12-06-2002 à 19:34:31    

:jap: encore une fois respect !


---------------
All we need is a soul revolution
Reply

Marsh Posté le 12-06-2002 à 19:47:23    

<script>
  try
  {
   d = document.getElementById('d';);
  }
  catch (e)
  {
   str = '';
   for (i in e)
    str += i + ' ' + eval('e.' + i) + '<br>';
   d.innerHTML = str;
  }
 </script>
 
ie balance en fait une exception qu'il suffit de catcher pour reprendre l'éxécution du code.

Reply

Marsh Posté le 12-06-2002 à 19:55:36    

ok je comprends mieux l'utilisation de ton for..in de l'autre fois !
Avec Youdontcare tout s'eclaire !
 :hello:
 
edit : je le conaissai pas non plus ce catch  ;)
2eme edit += c'est bien ca aussi  :ange:


Message édité par kayasax le 06-12-2002 à 19:57:45

---------------
All we need is a soul revolution
Reply

Marsh Posté le 12-06-2002 à 19:59:20    

:) for ... in, c'est pour énumérer toutes les propriétés d'un objet. très pratique quand tu veux savoir tout ce qu'un objet contient ou quelles propriétés css il supporte : ta node d est un objet, d.style est un objet que tu peux aussi énumérer. et dès que tu as le nom de la propriété (for i in), tu peux faire un eval('d.' + i) pour connaître sa valeur.

Reply

Marsh Posté le 13-06-2002 à 00:09:53    

Whoôô! J'ai rarement appris autant de trucs sur JS en aussi peu de lignes! :jap:

Reply

Marsh Posté le 13-06-2002 à 08:51:09    

euh a tout hasard, personne ne connait une alternative pour opera ? :hello:


---------------
All we need is a soul revolution
Reply

Marsh Posté le 14-06-2002 à 18:49:02    

kayasax a écrit a écrit :

euh a tout hasard, personne ne connait une alternative pour opera ? :hello:  



 
 
upeuh !

Reply

Marsh Posté le 14-06-2002 à 19:23:04    

tu peux écrire une fonction qui parse ton texte et créé les éléments dynamiquement avec document.createElement(), document.createTextNode(), document.appendChild(), etc.
 
par ex si tu as ta node n :
 
n = document.getElementById('myText';);
 
que tu veux faire  
 
n.innerHTML = '<b>hello, ceci est <i>un test</i></b>';
 
il faudra :  
 
* effacer les fils de n (removeChild())
* créer l'arborescence de ce que tu veux mettre comme nouveau contenu :
 
élément <b>
  node texte "hello, ceci est "
  élément <i>
    node texte "un test"
 
* parcourir cet arbre, créer les éléments avec createElement(), les nodes textes avec createTextNode()
* lier le tout avec appendChild()
* lier l'arborescence à n, toujours avec appendChild().
 
voilà pour la base. ie et mozilla doivent bosser comme ça en interne, d'ailleurs. ensuite, il faudra gérer les attributs (align="center" ) et le style (style="padding: 4" -> node.style.padding = 4).
 
enfin c'est vraiment si tu veux te faire chier :D

Reply

Marsh Posté le 14-06-2002 à 19:23:04   

Reply

Marsh Posté le 14-06-2002 à 19:45:16    

:sol:  :lol: ca y est apres m'avoir aide tu veux me degouter ?? :D


Message édité par kayasax le 14-06-2002 à 19:45:37

---------------
All we need is a soul revolution
Reply

Marsh Posté le 14-06-2002 à 20:03:02    

[:yaisse]

Reply

Marsh Posté le 17-05-2005 à 01:38:11    

Je fais un mégaup de 3 ans, presque.
 
et si je veux faire quelque chose de cette forme là :
<b>hello, ceci est <i>un test</i> et la suite du texte</b>
 
Je m'y prend comment :??:


---------------
Mon blog
Reply

Marsh Posté le 17-05-2005 à 06:22:57    

appendChild() ajoute un element apres le dernier fils d'un noeud.
 
donc :
 
b.appendChild(hello);
b.appendChild(i);
b.appendChild(suite);
 
ala :D

Reply

Marsh Posté le 17-05-2005 à 06:50:38    

En fait la difficulte pour toi est peut-etre de trouver une methode pour inserer un frere juste apres un element.
 
Pour cela pas de fonction toute faite :(
Alors il faut jongler avec essentiellement 3 fonctions :p
C'est vrai que c'est un peu lourd !
 
element.nextSibling;
retourne le frere suivant de element, ou null s'il n'y en a pas.
 
element.parentNode;
retourne le pere de element, ou null s'il n'y en a pas.
 
pere.insertBefore(element,frere)
insere element juste avant l'element frere qui est un fil de pere.
 
De la, pour ajouter un element nouveau APRES un element element il faut proceder ainsi :
 

  • recuperer le pere de element (parentNode)
  • recuperer le frere de element (nextSibling)
  • inserer nouveau comme fils de pere avant le fils frere

         pere.insertBefore(nouveau , frere);
 
ouf ^^;
Bon ... s'il existe une methode append_next ou je ne sais quel nom qui realise ce travail je veux bien etre elu boulay de l'année :D


Message édité par afbilou le 17-05-2005 à 06:56:37
Reply

Marsh Posté le 17-05-2005 à 09:09:41    

[:moule_bite]  
 
Pour la première partie, 3 ans en retard (mais vu que ça a été remonté, on va essayer d'éviter que les gens prennent de mauvaises habitudes)
 
Pour commencer le div "d" n'a rien de read-only.
 
Ensuite pour la première tentative ce n'est plus utilisé et invalide, et pour la 2e le problème est probablement que MSIE tente de récupérer "d" (par le getElementById) alors que celui ci n'existe pas encore > il récupère un objet vide qui n'a donc pas de innerHTML.
 
Donc on va commencer par corriger ça:
ta page HTML est normalement du type

<html>
    <head>
        <title></title>
    </head>
    <body>
        <div id="d">
        </div>
    <body>
</html>


(c'est le strict minimum)
 
dans la partie <head></head>, juste après le <title> il te faut ajouter un script:

<script type="text/javascript">
    <!--
    //-->
</script>


 
Maintenant on crée la fonction qui fait la modification, donc un truc du style

function modify() {
    var d = getElementById('d'); // toujours déclarer les variables qu'on utilise
    if(d) // on vérifie si on a bien récupéré un élément dans "d"
        d.innerHTML = "<p>toto</p>";
}


 
Et maintenant il faut dire au navigateur "quand t'as fini de charger la page, tu lances ma fonction

window.onload = modify; // pas de "()", sinon ça tente d'exécuter la fonction


 
Résultat:  

<html>
    <head>
        <title></title>
        <script type="text/javascript">
            <!--
                function modify() {
                    var d = document.getElementById('d'); // toujours déclarer les variables qu'on utilise
                    if(d) // on vérifie si on a bien récupéré un élément dans "d"
                        d.innerHTML = "<p>toto</p>";
                }
                window.onload = modify; // pas de "()", sinon ça tente d'exécuter la fonction
            //-->
        </script>
    </head>
    <body>
        <div id="d">
        </div>
    <body>
</html>


Fonctionne dans MSIE et Firefox, et Opera aussi
 
Pour plus d'infos sur innerHTML
 
En gros, le fonctionnement d'innerHTML c'est d'ajouter le texte qu'on lui donne directement dans le code source de la page et de reparser le tout. L'avantage c'est que c'est extrèmement rapide (de 2 à 20 fois plus rapide que le DOM) et que ça fonctionne dans la quasi totalité des navigateurs, l'inconvénient c'est qu'il est très dur de retourcher ensuite à ce qui a été créé via innerHTML
 
La deuxième méthode, c'est le DOM.
DOM, c'est le Document Object Model. En gros, quand un navigateur rencontre une page HTML il va construire un "arbre" pour représenter le document (c'est le DOM), et c'est cet arbre qu'on va modifier. On a donc beaucoup plus de fonctions, beaucoup plus complexes, mais c'est également beaucoup plus puissant et flexible.
Par contre faire du cross-browsers est un poil plus difficile.
Pour plus d'infos sur le DOM, retourner voir Quirksmode.
 
 
Gurney > les balises <i> et <b> sont dépréciées en HTML (parce qu'elles n'ont aucun intérêt, pour mettre en gras ou en italique on utilise les CSS)
 
Commence par lire la doc du DOM sur quirksmode, ça devrait t'aider.
 
Pour ton problème, c'est très simple:
1- on a deux nodes HTML <i> et <b>
2- on a 3 nodes de texte, "hello, ceci est", "un test" et " et la suite du texte"
Les fonctions dont on va avoir besoin sont:
document.createElement -> permet de créer une node HTML/XML, donc une balise
document.createTextNode -> permet de créer une node textuelle, donc du texte
element.appendChild -> permet d'ajouter un enfant à l'élément
 
Imaginons qu'on ait récupéré un élément du nom de "p" dans lequel on veut insérer nos machins:

Code :
  1. if(!document.getElementById||!document.createElement||!document.createTextNode)
  2.     return /* ici, on va avoir besoin de createElement et createTextNode, on vérifie donc s'ils sont disponibles ou pas. S'ils ne le sont pas, on annule le script. Ca permet d'éviter les plantages à la con. On en profite pour vérifier getElementById, ça coute pas plus cher*/
  3. var p = document.getElementById('mon_element'); // On récupère l'élément dans lequel on insère le reste
  4. var bold = document.createElement("b" ); // on crée la balise <b>
  5. var italic = document.createElement("i" ); // on crée la balise <i>
  6. italic.appendChild(document.createTextNode('un test')); // On crée une node de texte "un test" et on l'insère comme enfant de <i>
  7. bold.appendChild(document.createTextNode('hello, ceci est ')); // Idem avec 'hello ceci est un' et la balise <b>
  8. bold.appendChild(italic); // puis on ajoute <i> comme enfant de <b>, derrière le texte (appendChild ajoute l'enfant en fin de liste)
  9. bold.appendChild(document.createTextNode(" et la suite du texte" ); // Et on ajoute la fin du texte
  10. p.appendChild(bold); // Enfin, on ajoute <b> comme enfant de l'élément qu'on avait récupéré


 
Pour détailler:
à la ligne 3 on a un élément
<machin/>
 
lignes 5 et 6, on crée deux éléments qui ne sont pas attachés au reste
donc on a <b/> et <i/> quelque part, on sait pas ou
 
Ligne 7, <i/> devient <i>un test</i>
Ligne 8, <b/> devient <b>hello, ceci est</b>
Puis avec la ligne 9 <b>hello, ceci est <i>un test</i></b>
Et enfin avec la ligne 10 <b>hello, ceci est <i>un test</i> et la suite du texte</b>
 
Pour terminer, la ligne 11 transforme <machin/> en  
<machin><b>hello, ceci est <i>un test</i> et la suite du texte</b></machin>


Message édité par masklinn le 17-05-2005 à 09:11:30

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 17-05-2005 à 10:31:12    

Merci pour toutes ces réponses :)que j''ai pas encore lues d'ailleurs...
 
Juste, entre temps j'y suis arrivé :D
 
Voilà ce que j'ai fait :  

Code :
  1. var re = /(http:\/\/[^ ]*)/;
  2. var aText = liText.split(re);
  3. for(var i=0; i<aText.length; i++){
  4.  var m = re.exec(aText[i]);
  5.  if(m!=null){
  6.   oLink = document.createElement('a'); 
  7.   oLink.href = m[1];
  8.      oLink.appendChild(document.createTextNode(m[1]));
  9.   oLi.appendChild(oLink);
  10.  }else{
  11.   oLi.appendChild(document.createTextNode(aText[i]));
  12.  }
  13. }


 
C'est pas trop sale ?
Ça marche, tout est défini avant, j'ai mis tout le code. Par contre, j'avais un bug dans le for, si je mettais pas le var devant le i=0 ça me bousillait la suite du script...
Et rien dans la console JS de Firefox, bizarre... Enfin, ça marche now.
 
Je lis vos messages maintenant ^^


Message édité par Gurney_Halleck le 17-05-2005 à 10:33:27

---------------
Mon blog
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed