innerHTML ie et mozilla : galere ! [JS] - HTML/CSS - Programmation
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'; )
Marsh Posté le 12-06-2002 à 19:34:31
encore une fois respect !
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.
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 !
edit : je le conaissai pas non plus ce catch
2eme edit += c'est bien ca aussi
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.
Marsh Posté le 13-06-2002 à 00:09:53
Whoôô! J'ai rarement appris autant de trucs sur JS en aussi peu de lignes!
Marsh Posté le 13-06-2002 à 08:51:09
euh a tout hasard, personne ne connait une alternative pour opera ?
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 ? |
upeuh !
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
Marsh Posté le 14-06-2002 à 19:45:16
ca y est apres m'avoir aide tu veux me degouter ??
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
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
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 :
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
Marsh Posté le 17-05-2005 à 09:09:41
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> |
(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"> |
Maintenant on crée la fonction qui fait la modification, donc un truc du style
function modify() { |
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> |
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 :
|
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>
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é
Voilà ce que j'ai fait :
Code :
|
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 ^^
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>
comment je fé moa ?
---------------
All we need is a soul revolution