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 :

Fonctionne sur tous les navigateurs sauf IE


Sujet :

JavaScript

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut Fonctionne sur tous les navigateurs sauf IE
    Hello,

    J'ai écrit le code suivant et je l'ai testé avec succès sur tous lels navigateurs à ma disposition (je suis sous mac OS X). Par contre je l'ai fait tester par un ami sur Internet Explorer et une partie des menus ne fonctionne pas (IE signale une erreur ligne 45 char 3).

    Si vous pouvez m'indiquer mon erreur, je suis preneur, j'ai beau chercher je ne vois pas ce qui pose problème à IE là dedans.


    Voici mon code :
    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
     
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
    	<title>Test</title>
    <script type="text/javascript" language="javascript">
    <!--
    function set_day (dayfield, monthfield, hourfield, minutefield) {
    	var now = new Date();
    	var hours = now.getHours();
    	var minutes = Math.ceil(now.getMinutes()/5)*5;
    	var today = now.getDate();
    	var month = now.getMonth();
    	var year = now.getFullYear();
    	var dayfield = document.getElementById(dayfield);
    	var monthfield = document.getElementById(monthfield);
    	var hourfield = document.getElementById(hourfield);
    	var minutefield = document.getElementById(minutefield);
    	var aMonth = 30*24*60*60*1000;
    	var then = new Date(now.getTime()+3*aMonth);
    	var monthtext=['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'];
    	var monthvalue=['01','02','03','04','05','06','07','08','09','10','11','12'];
    	var hourtext=['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23'];
    	var minutetext=['00','05','10','15','20','25','30','35','40','45','50','55'];
     
    	if (minutes == 60) {
    		minutes = 0
    		hours = hours+1
    	}
     
    	if (minutes < 10) {
    		minutes = "0" + minutes
    	}
     
    	for (i=0; i<31; i++) {
    		dayfield.options[i] = new Option(i+1,i+1);
    		dayfield.options[today] = new Option(today, today, true, true) //select today's day
    	}
     
    	for (m=now.getTime(); m<then.getTime(); m+=aMonth) {
    		var date = new Date(m);
    		var months = date.getMonth();
    		var year = date.getFullYear();
    		monthfield.options[m]=new Option(monthtext[m], year + "|" + monthvalue[m])
    		monthfield.options[months]=new Option(monthtext[months] + " " + year, year + "|" + monthvalue[months], true, 0) //select today's month
    	}
     
    	for (i=0; i<24; i++) {
    		hourfield.options[i] = new Option(hourtext[i],hourtext[i]);
    		hourfield.options[hours] = new Option(hours, hours, true, true);
    	}
     
    	for (j=0; j<12; j++) {
    		minutefield.options[j] = new Option(minutetext[j],minutetext[j]);
    		minutefield.options[minutes/5] = new Option(minutes, minutes, true, true);
    	}
    }
     
    //-->
    </script>
    </head>
    <body>
    <form method="post" id="date" name="date" action="">
    <select id="daymenu" name="daymenu">
    	<option value="">Jour</option>
    </select>
     
    <select id="monthmenu" name="monthmenu">
    	<option value"">Mois et ann&eacute;e</option>
     
    </select>
     
    <select id="hourmenu" name="hourmenu">
     
    </select>
     
    <select id="minutemenu" name="minutemenu">
     
    </select>
    </form>
    <script type="text/javascript" language="javascript">
    <!--
    set_day("daymenu","monthmenu","hourmenu","minutemenu");
    //-->
    </script>
    </body>
    </html>
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    sort les déclarations (var date = ...) de ta boucle, sinon, multi-déclaration de la même variable.
    De plus "date", "month" et "year" sont à éviter comme nom de variable car il s'agit de mots réservés JS ...

    A+

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    J'ai corrigé ces points (sachant que je n'ai pas encore réussi à faire marcher la génération du menu des mois pour qu'il contienne effectivement les 3 mois à venir), mais selon ce que mon ami testeur m'as dit, toujours le même problème.
    IE aurait-il un souci avec le new Option() ? Ou avec field.options[] ?

    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
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
    	<title>Test</title>
    <script type="text/javascript" language="javascript">
    <!--
    function set_day (dayfield, monthfield, hourfield, minutefield) {
    	var now = new Date();
    	var myHours = now.getHours();
    	var myMinutes = Math.ceil(now.getMinutes()/5)*5;
    	var myToday = now.getDate();
    	var myMonth = now.getMonth();
    	var myYear = now.getFullYear();
    	var dayfield = document.getElementById(dayfield);
    	var monthfield = document.getElementById(monthfield);
    	var hourfield = document.getElementById(hourfield);
    	var minutefield = document.getElementById(minutefield);
    	var aMonth = 30*24*60*60*1000;
    	var then = new Date(now.getTime()+3*aMonth);
    	var monthtext=['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'];
    	var monthvalue=['01','02','03','04','05','06','07','08','09','10','11','12'];
    	var hourtext=['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23'];
    	var minutetext=['00','05','10','15','20','25','30','35','40','45','50','55'];
     
    	if (myMinutes == 60) {
    		myMinutes = 0;
    		myHours = myHours+1;
    	}
     
    	if (myMinutes < 10) {
    		myMinutes = "0" + myMinutes;
    	}
     
    	for (i=0; i<31; i++) {
    		dayfield.options[i] = new Option(i+1,i+1);
    		dayfield.options[myToday-1] = new Option(myToday, myToday, true, true); //select today's day
    	}
     
    	for (m=now.getTime(); m<then.getTime(); m+=aMonth) {
    		monthfield.options[m]=new Option(monthtext[m], now.getFullYear(m) + "|" + monthvalue[m])
    		monthfield.options[now.getMonth(m)]=new Option(monthtext[now.getMonth(m)] + " " + now.getFullYear(m), now.getFullYear(m) + "|" + monthvalue[now.getMonth(m)], true, 0); //select today's month
    		document.write(then);
    	}
     
    	for (i=0; i<24; i++) {
    		hourfield.options[i] = new Option(hourtext[i],hourtext[i]);
    		hourfield.options[myHours] = new Option(myHours, myHours, true, true); //select current hours
    	}
     
    	for (j=0; j<12; j++) {
    		minutefield.options[j] = new Option(minutetext[j],minutetext[j]);
    		minutefield.options[myMinutes/5] = new Option(myMinutes, myMinutes, true, true); //select the next 5 minutes time
    	}
    }
     
    //-->
    </script>
    </head>
    <body>
    <form method="post" id="date" name="date" action="">
    <select id="daymenu" name="daymenu">
    	<option value="">Jour</option>
    </select>
     
    <select id="monthmenu" name="monthmenu">
    	<option value"">Mois et ann&eacute;e</option>
     
    </select>
     
    <select id="hourmenu" name="hourmenu">
     
    </select>
     
    <select id="minutemenu" name="minutemenu">
     
    </select>
    </form>
    <script type="text/javascript" language="javascript">
    <!--
    set_day("daymenu","monthmenu","hourmenu","minutemenu");
    //-->
    </script>
    </body>
    </html>

  4. #4
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut
    Salut,

    A ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	for (m=now.getTime(); m<then.getTime(); m+=aMonth) {
    		monthfield.options[m]=new Option(monthtext[m], now.getFullYear(m) + "|" + monthvalue[m])
    monthfield.options[now.getMonth(m)]=new Option(monthtext[now.getMonth(m)] + " " + now.getFullYear(m), now.getFullYear(m) + "|" + monthvalue[now.getMonth(m)], true, 0); //select today's month
    - Tu semble vouloir afficher des mois et tu utilise getTime dans ton "for"
    - Tu vas avoir des problème pour récupérer des données vu que tes tableaux ne sont pas aussi grand que les valeurs retournées par les getTime
    - il manque un ";" à la fin de la première ligne (ça, ça aide vraiment pas)
    - J'ai l'impression que les 2 lignes représentent la même chose mais avec des essais de codage différents
    - getMonth ne prend pas de paramètre

    En codant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (m=myMonth; m<then.getMonth(); m++) 
      monthfield.options[m]=new Option(monthtext[m], myYear + "|" + monthvalue[m])
    J'obtient ceci sous FF et IE
    <select id="monthmenu" name="monthmenu">
    <option value="2007|01">Janvier</option>
    <option value="2007|02">Février</option>
    <option value="2007|03">Mars</option>
    </select>
    et je n'ai pas besoin de selectionner "MyMonth" puisque c'est le premier de la liste. Ceci dit, cela ne t'empêchera d'avoir des soucis si le premier mois est novembre ou décembre car, tel quel, il n'y a pas de changement d'année dans les "value"

    Si "then" (genre de nom de variable à éviter également) ne te sert QUE pour le calcul des mois, tu vires "aMonth" et "then" et tu remplaces la boucle par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (m = myMonth; m < myMonth + 3; m++)

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    Merci Ricou, tes commentaires m'aident beaucoup à comprendre des détails dans ce que j'ai fait.

    Cependant, il me semble que ton "myMonth + 3" risque de donner des incohérences puisque si myMonth=12, on aura une valeur de 15.
    Je pourrai corriger le tir en faisant une condition de type :
    if (m>12) {
    m = m-12;
    }
    mais ça ne me semble pas très propre.

    Pour ce qui est de mon getTime(), j'ai pensé à cette méthode qui me semble très lourde pour garantir d'avoir les mois qui viennent dans l'ordre, c'est à dire bien gérer les transitions entre années.

    Mon objectif au final est d'avoir une liste du type :

    <select id="monthmenu" name="monthmenu">
    <option value="2007|12">Décembre 2007</option>
    <option value="2008|01">Janvier 2008</option>
    <option value="2008|02">Février 2008</option>
    </select>
    Une autre option serait de dire :
    if (m>12) {
    m=m-12;
    myYear=myYear+1;
    }
    Mais là aussi ça ne me semble pas très propre. Ceci étant, ça l'est peut-être moins que mon astuce de getTime(), je sais pas.

  6. #6
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut
    Salut,

    Effectivement, dans le code que j'ai fait, il n'y a aucune gestion du changement d'année. A ce niveau je n'étais pas sûr de ce que tu voulais obtenir.

    Par rapport au getTime, getMonth te renvoie un chiffre de 0 à 11 (ce qui est compatible avec tes tableaux) alors que getTime te retourne "le nombre de millisecondes écoulées depuis le 1er janvier 1970" (un chiffre totalement incompatible avec tes tableaux)

    Je te conseille de plutot travailler directement sur des objets date et d'en extraire le mois et l'année
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (i = 0; i < 3; i++)
    {
      NextDate = new Date(now.getTime() + (aMonth * i));
      NoMois = NextDate.getMonth();
      monthfield.options[i]=new Option(monthtext[NoMois], NextDate.getFullYear() + "|" + monthvalue[NoMois]);
    }
    En étant en décembre 2007, on obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <select id="monthmenu" name="monthmenu">
    <option value="2007|12">Décembre</option>
    <option value="2008|01">Janvier</option>
    <option value="2008|02">Février</option>
    </select>

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    En effet ça me semble une bonne solution. Dans le même temps j'ai découvert la méthode setMonth et du coup j'avais fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (m=0; m< 3; m++) {
    now.setMonth(myMonth+m);
    with(now){
    monthfield.options[m]=new Option(monthtext[now.getMonth()] + " " +now.getFullYear(), now.getFullYear() + "|" + monthvalue[now.getMonth()]);
    }
    }
    Les deux produisent le même résultat, et j'ai bien du mal à saisir le souci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <select id="monthmenu" name="monthmenu">
    <option value="2007|01">Janvier 2007</option>
    <option value="2007|03">Mars 2007</option>
    <option value="2007|03">Mars 2007</option>
    </select>
    Tous les autres mois de l'année fonctionnent bien si j'allonge m.

    Par contre au delà de 12 mois mon code fait un truc bizarre : Janvier 2008, Février 2009, Mars 2010, etc. Le tien gère parfaitement le changement d'année et reste dans la continuité.

    Il reste donc le mystère pour le mois de Février de l'année en cours et je serai sorti de l'auberge.

    Merci encore pour ton aide Ricou.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    Je viens de faire tester par une personne sous windows, apparemment ni ton code ni le mien ne fonctionnent sous IE...

  9. #9
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut
    Ton code modifie la date initiale (son mois donc). Pourquoi pas si tu n'as plus besoin de la date originelle.

    Mais en l'écrivant comme ça tu vas te retrouver avec un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    now.setMonth(12);
    // Voire
    now.setMonth(13); // Si la date originale est en décembre et m à 2
    et là, je pense qu'il va pas aimer...

    Moi j'ai W2K et FF 2 / IE 6 et mon bout de code fonctionne sur les 2

    Precise la version de ton IE de test (c'est sûr que si c'est une version 3 )
    Essaye également mon code dans un fichier vierge (dans mon test j'ai virer le code de remplissage des autres listes)

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    Ok j'opte pour ta méthode, et je met un coup à ma copine qui sait pas rafraichir son navigateur IE 7 :p
    Et je me met un coup à moi même, comme dans mon aMonth j'ai défini qu'un mois = 30 jours, or nous sommes le 30 janvier et le mois de Février comporte 28 jours donc ça tombe en mars.

    Merci pour tout Ricou !

  11. #11
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut
    Tu peux aussi fixer le jour au 10 du mois.

    Exemple : nous sommes le 30/01/2007, tu modifies le jour pour obtenir le 10/01/2007.

    Ainsi, sur une boucle aussi courte (+3 max), en ajoutant 30 jours, tu tomberas forcement sur le mois suivant que l'on soit en janvier ou février sur une année bisextile ou non

    10 janvier + 30 jours = toujours février
    10,11,12 ou 13 février + 30 jours = toujours mars

    Par contre, ne fixe pas au 1er du mois car 01 janvier + 30j = encore janvier

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

Discussions similaires

  1. problem d affichage dans tous les navigateur sauf I7
    Par younes86 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 16/12/2010, 22h02
  2. Rendu identique sur tous les navigateurs
    Par Ziltoid dans le forum Webdesign & Ergonomie
    Réponses: 3
    Dernier message: 23/06/2009, 16h29
  3. Réponses: 1
    Dernier message: 26/03/2009, 15h48
  4. Mon site fonctionne sur tous les navigateurs sauf IE6 :-(
    Par acrylica dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/11/2007, 11h39
  5. Mettre une class sur tous les input sauf les radio
    Par kevinf dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 22/10/2007, 20h26

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