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 :

Incompatibilité FF - IE


Sujet :

JavaScript

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut Incompatibilité FF - IE
    Bonsoir à tous,

    je développe actuellement un système assez sympa pour proposer à un internaute d'uploader des images à certains endroits d'une page.
    La disposition des images se fait en colonnes et rangées : je n'utilise pas de tableau HTML pour cela.
    J'utilise des div positionnés en colonnes qui, lorsque l'on clique dessus, se change en input type="file".
    Je dispose également d'un lien "Ajouter une rangée de photos" qui génère une nouvelle rangée à 4 colonnes de photos.

    Ce système fonctionne sous Firefox mais pas sous IE6... Pouvez-vous me dire pourquoi ?


    NB : désolé pour la mocheté du code HTML, ce n'est pas moi qui ai fait la mise en page...


    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
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <script language="JavaScript" type="text/JavaScript">
     
    var compteur_rangee = 1;
    var nb_photos = 4;
     
    </script>
    </head>
     
    <script type="text/javascript">
     
     
    function suppr_image(elem) {
     
    	add_input(elem);
     
    }
     
     
    function add_input(elem) {
     
    	nouvdiv = document.createElement('div');
    	nouvinput = document.createElement('input');
    	nouvinput.setAttribute("type", "file");
    	nouvinput.setAttribute("name", "photo_1");
     
    	elem.parentNode.replaceChild(nouvdiv, elem);
    	nouvdiv.appendChild(nouvinput);
     
    }
     
     
    function add_rangee() {
     
    	conteneur = document.createElement('div');
    	conteneur.setAttribute("id", "rangee"+(compteur_rangee+1));
    	conteneur.setAttribute("class", "rangee_photos");
     
    	nouvdiv1 = document.createElement('div');
    	nouvdiv1.setAttribute("id", "photo"+(nb_photos+1));
    	nouvdiv1.setAttribute("class", "photo_rangee col1");
    	nouvdiv1.setAttribute("onclick", "suppr_image(this);");
     
    	nouvdiv2 = document.createElement('div');
    	nouvdiv2.setAttribute("id", "photo"+(nb_photos+2));
    	nouvdiv2.setAttribute("class", "photo_rangee col1");
    	nouvdiv2.setAttribute("onclick", "suppr_image(this);");
     
    	nouvdiv3 = document.createElement('div');
    	nouvdiv3.setAttribute("id", "photo"+(nb_photos+3));
    	nouvdiv3.setAttribute("class", "photo_rangee col1");
    	nouvdiv3.setAttribute("onclick", "suppr_image(this);");
     
    	nouvdiv4 = document.createElement('div');
    	nouvdiv4.setAttribute("id", "photo"+(nb_photos+4));
    	nouvdiv4.setAttribute("class", "photo_rangee col1");
    	nouvdiv4.setAttribute("onclick", "suppr_image(this);");
     
    	titre_rangee = document.createElement('p');
    	texte_rangee = document.createTextNode("Rangée de photos n°"+(compteur_rangee+1));
    	titre_rangee.appendChild(texte_rangee);
     
     
    	document.getElementById("conteneur_rangees").appendChild(titre_rangee);
    	cont = document.getElementById("conteneur_rangees").appendChild(conteneur);
    	cont.appendChild(nouvdiv1);
    	cont.appendChild(nouvdiv2);
    	cont.appendChild(nouvdiv3);
    	cont.appendChild(nouvdiv4);
     
    	compteur_rangee++;
     
    }
     
    </script>
    <body>
     
    <div id="contenu_css">
    	<div id="petit_contenu_css">
    	<div id="conteneur">
    	<div id="titre_h2"><h2>Administration</h2> > <h3>Reportages</h3></div>
    	<?php 
                    if (isset($_GET["action"])) {
                            switch ($_GET["action"]) { 
                                                                            
                            default : ; break;
                                                                                    
                            case "nouveau" : ?>
     
    			<form method="post" name="nouv_report" action="" enctype="multipart/form-data">
    			<table id="form_report">
    				<tr>
    					<td valign="top">Date</td><td valign="top"><input type="text" name="titre" size="20" /></td>
    				</tr>
    				<tr>
    					<td valign="top">Commentaire</td><td valign="top"><textarea name="commentaire" cols="40" rows="6"></textarea></td>
    				</tr>
    			</table>
    			<p>Photo principale : </p>
    			<div id="photo_p" onclick="suppr_image(this);"></div>
    			<p>Rangée de photos n° 1 : </p>
    			<div id="conteneur_rangees">
    				<div id="rangee1" class="rangee_photos">
    					<div class="photo_rangee" id="photo_1" onClick="suppr_image(this);"></div>
    					<div class="photo_rangee col1" id="photo_2" onClick="suppr_image(this);"></div>
    					<div class="photo_rangee col1" id="photo_3" onClick="suppr_image(this);"></div>
    					<div class="photo_rangee col1" id="photo_4" onClick="suppr_image(this);"></div>
     
     
    				</div>
    			</div>
    			<br />
    			<div id="ajout"><a href="#" onClick="add_rangee();">Ajouter une rangée supplémentaire</a></div>
     
    			<p><input type="submit" value="Enregistrer"></p>
    			</form>
     
    		<?php   ;
                    }
            }
            else { ?>
    		<p><a href="adminsite08_reportages.php?action=nouveau">Créer un nouveau reportage</a></p>
    		<div id="liste_reportages"><p>Modifier un reportage existant :</p>
    		<?php 
                            include_once('classes/Parse.class.php');
                            $parse = new Parse("txt-html");
                            echo $parse->liste_reportages(0,"colonnes");
            }
            ?>
    		</div>
    	</div>
    	</div>
    	</div>
     
    </body>
    </html>

  2. #2
    En attente de confirmation mail
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    bonjour,

    IE ne connait pas setAttribute et getAttribute. Utilise donc la syntaxe commune aux navigateurs et qui est plus simple :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nouvinput.setAttribute("type", "file");
    nouvinput.setAttribute("name", "photo_1");
    devient :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nouvinput.type = "file";
    nouvinput.name = "photo_1";
    une remarque en passant : privilégie id à name

  3. #3
    En attente de confirmation mail
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    pour onclick (et autres événements) c'est plus complexe, surtout s'il y le paramètre this :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nouvdiv4.setAttribute("onclick", "suppr_image(this);");
    devient :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nouvdiv4.objetDiv4 = nouvdiv4;
    nouvdiv4.onclick = function(){suppr_image(this.objetDiv4);}

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    Merci j'ai effectué toutes les modifs... Seulement maintenant aucun des deux navigateurs n'affichent les images lors de la génération d'une nouvelle rangée de photos...
    Le texte "Rangée de photo n°X" s'affiche bien mais pas les div qui vont dessous...

  5. #5
    En attente de confirmation mail
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Ce qui m'embête dans ce code JS c'est que des variables ne sont pas déclarées (FF n'apprécie pas trop).

    Ensuite, je me demande si tu ne crées pas des éléments ayant le même id (fonction add_rangee() où nb_photos est une constante).

    Le texte "Rangée de photo n°X" s'affiche bien mais pas les div qui vont dessous...
    quelle est l'erreur retournée ?

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    Plus d'erreurs maintenant, tu avais raison pour les variables : j'ai corrigé ça et IE6 ne m'affiche plus d'erreur à l'exécution du script.

    Après avoir vérifié avec des alert(), les éléments nouvdiv sont bien créés (objectHTMLDivElement) mais pas insérés dans le conteneur_rangees... sous IE6 bien sûr.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cont = document.getElementById("conteneur_rangees").appendChild(conteneur);
    cont.appendChild(nouvdiv1);
    cont.appendChild(nouvdiv2);
    cont.appendChild(nouvdiv3);
    cont.appendChild(nouvdiv4);
    Quelqu'un a une idée ?

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    up !

  8. #8
    Membre averti Avatar de Sacha999
    Inscrit en
    Mars 2007
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mars 2007
    Messages : 294
    Points : 350
    Points
    350
    Par défaut
    Je ne suis pas sur que "appendChild" retourne un element, donc je presume que "cont" est vide. D'ailleurs pourquoi tu veux stocker dans "cont" alors que l'element est deja dans "conteneur"?
    Le forum c'est trop génial

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    Oui... Mais en modifiant par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	document.getElementById("conteneur_rangees").appendChild(titre_rangee);
    	document.getElementById("conteneur_rangees").appendChild(conteneur);
    conteneur.appendChild(nouvdiv1);
    conteneur.appendChild(nouvdiv2);
    conteneur.appendChild(nouvdiv3);
    conteneur.appendChild(nouvdiv4);
    J'ai toujours le même résultat : les rangées de photos supplémentaires s'affichent et fonctionnent correctement sous FF mais ne s'affichent pas sous IE6.

    J'ai cependant une piste : les nouvdiv sont considérés comme [object] sous IE et comme [object HTMLDivElement] sous Firefox...

  10. #10
    En attente de confirmation mail
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par oneTime Voir le message

    J'ai cependant une piste : les nouvdiv sont considérés comme [object] sous IE comme [object HTMLDivElement] sous Firefox...
    Non ce n'est pas une piste. Simplement FF est plus précis dans la désignation des éléments (FF te dit que tu as créés des objets HTML de type div, IE dit que tu as créé des objets sans plus).

    Le fait que IE et FF retourne des objets est déjà bon signe : cela veut dire qu'ils sont créés

    Montre nous ton code après les corrections que nous t'avons conseillées de faire

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    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
     
    <script type="text/javascript">
     
    function suppr_image(elem) {
     
    	add_input(elem);
     
    }
     
     
    function add_input(elem) {
     
    	nouvdiv = document.createElement('div');
    	nouvinput = document.createElement('input');
    	nouvinput.setAttribute("type", "file");
    	nouvinput.setAttribute("id", "photo_1");
     
    	elem.parentNode.replaceChild(nouvdiv, elem);
    	nouvdiv.appendChild(nouvinput);
     
    }
     
     
    function add_rangee() {
     
    	var conteneur = document.createElement('div');
    	conteneur.setAttribute("id", "rangee"+(compteur_rangee+1));
    	conteneur.setAttribute("class", "rangee_photos");
     
    	var nouvdiv1 = document.createElement('div');
    	nouvdiv1.setAttribute("id", "photo"+(nb_photos+1));
    	nouvdiv1.setAttribute("class", "photo_rangee col1");
    	nouvdiv1.onclick = function() {suppr_image(this); };
     
    	var nouvdiv2 = document.createElement('div');
    	nouvdiv2.setAttribute("id", "photo"+(nb_photos+2));
    	nouvdiv2.setAttribute("class", "photo_rangee col1");
    	nouvdiv2.onclick = function() {suppr_image(this); };
     
    	var nouvdiv3 = document.createElement('div');
    	nouvdiv3.setAttribute("id", "photo"+(nb_photos+3));
    	nouvdiv3.setAttribute("class", "photo_rangee col1");
    	nouvdiv3.onclick = function() {suppr_image(this); };
     
    	var nouvdiv4 = document.createElement('div');
    	nouvdiv4.setAttribute("id", "photo"+(nb_photos+4));
    	nouvdiv4.setAttribute("class", "photo_rangee col1");
    	nouvdiv4.onclick = function() {suppr_image(this); };
     
    	titre_rangee = document.createElement('p');
    	texte_rangee = document.createTextNode("Rangée de photos n°"+(compteur_rangee+1));
    	titre_rangee.appendChild(texte_rangee);
     
     
            document.getElementById("conteneur_rangees").appendChild(titre_rangee);
            document.getElementById("conteneur_rangees").appendChild(conteneur);
            conteneur.appendChild(nouvdiv1);
            conteneur.appendChild(nouvdiv2);
            conteneur.appendChild(nouvdiv3);
            conteneur.appendChild(nouvdiv4);
     
    	compteur_rangee++;
     
    }
     
    </script>
    Le reste n'a pas changé.

  12. #12
    En attente de confirmation mail
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par Auteur Voir le message
    bonjour,

    IE ne connait pas setAttribute et getAttribute. Utilise donc la syntaxe commune aux navigateurs et qui est plus simple :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nouvinput.setAttribute("type", "file");
    nouvinput.setAttribute("name", "photo_1");
    devient :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nouvinput.type = "file";
    nouvinput.name = "photo_1";
    une remarque en passant : privilégie id à name
    Citation Envoyé par Auteur Voir le message
    pour onclick (et autres événements) c'est plus complexe, surtout s'il y le paramètre this :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nouvdiv4.setAttribute("onclick", "suppr_image(this);");
    devient :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nouvdiv4.objetDiv4 = nouvdiv4;
    nouvdiv4.onclick = function(){suppr_image(this.objetDiv4);}

    donc ton code devient (pour la fonction add_rangee) :
    Code javascript : 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
     
    function add_rangee() 
    {
     
    	var conteneur = document.createElement('div');
    	conteneur.id = "rangee"+(compteur_rangee+1);
    	conteneur.className = "rangee_photos";
     
    	var nouvdiv1 = document.createElement('div');
    	nouvdiv1.id = "photo"+(nb_photos+1);
    	nouvdiv1.className = "photo_rangee col1";
     
      nouvdiv1.div1 = nouvdiv1;
    	nouvdiv1.onclick = function() {suppr_image(this.div1); };
     
    	var nouvdiv2 = document.createElement('div');
    	nouvdiv2.id = "photo"+(nb_photos+2);
    	nouvdiv2.className = "photo_rangee col1";
     
      nouvdiv2.div2 = nouvdiv2;  
    	nouvdiv2.onclick = function() {suppr_image(this.div2); };
     
    	var nouvdiv3 = document.createElement('div');
    	nouvdiv3.id = "photo"+(nb_photos+3);
    	nouvdiv3.className = "photo_rangee col1";
     
      nouvdiv3.div3 = nouvdiv3;
    	nouvdiv3.onclick = function() {suppr_image(this.div3); };
     
    	var nouvdiv4 = document.createElement('div');
    	nouvdiv4.id = "photo"+(nb_photos+4);
    	nouvdiv4.className =  "photo_rangee col1";
     
      nouvdiv4.div4 = nouvdiv4;
    	nouvdiv4.onclick = function() {suppr_image(this.div4); };
     
    	var titre_rangee = document.createElement('p');
    	var texte_rangee = document.createTextNode("Rangée de photos n°"+(compteur_rangee+1));
    	titre_rangee.appendChild(texte_rangee);
     
     
      document.getElementById("conteneur_rangees").appendChild(titre_rangee);
      document.getElementById("conteneur_rangees").appendChild(conteneur);
      conteneur.appendChild(nouvdiv1);
      conteneur.appendChild(nouvdiv2);
      conteneur.appendChild(nouvdiv3);
      conteneur.appendChild(nouvdiv4);
     
    	compteur_rangee++;
     
    }


    Corrige également la fonction add_input() selon le modèle et les indications ci-dessus
    Le code fonctionne sous IE et FF.

    Maintenant je crains que les div qui sont créés (div1, div2, div3 et div4) au fur et à mesure que add_rangee est appelée aient le même id.

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    Problème résolu, merci pour tout !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ATTENTION !] XP Service Pack 2 - Incompatibilités !!!
    Par iubito dans le forum Windows XP
    Réponses: 121
    Dernier message: 03/06/2005, 19h45
  2. [IB 6 OpenSource et P4 HT] Incompatibilité ?
    Par TMuet dans le forum InterBase
    Réponses: 5
    Dernier message: 20/09/2004, 10h45
  3. Réponses: 2
    Dernier message: 25/05/2004, 11h40
  4. UPDATE+max= Incompatibilité?
    Par $grm$ dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/05/2004, 16h43
  5. problème d'incompatibilité apparement
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 17/09/2003, 14h51

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