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 :

Générer un calendrier


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut Générer un calendrier
    bonjour,

    avant de me lancer j'essaie quelque chose de très simple mais ça marche pas !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function afficher_cal(){
    	document.getElementById('madiv').innerHTML = "<table border=1> <tr>";
    	document.getElementById('madiv').innerHTML = "<td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td>";
    	document.getElementById('madiv').innerHTML = "</tr></table>";
    }
    </SCRIPT>
     
    bouton pour afficher le tableau <input type='button' name='voir_cal' value='calendar' onclick='javascript:afficher_cal()';>
     
    <div id="madiv" style="width:15em;height:10em;background-color:yellow;">
     
     
    </div>
    et comme dirait un chanteur : il est où le problème ?

    merci

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Utilise l’inspecteur avec la touche F12 et je pense que tu verras vite le problème
    En principe tu devrais voir que ta div contient seulement </tr></table>. C’est parce que chacune de tes déclarations .innerHTML = … écrase la précédente.

    Pour corriger le problème, construis une chaîne avec + et passe-la en une seule fois à innerHTML.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function afficher_cal() {
      document.getElementById('madiv').innerHTML = "<table border=1> <tr>" + 
        "<td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td>" +
        "</tr></table>";
    }
    Ou mieux, utilise la méthode insertAdjacentHTML.

    Et supprime le "javascript:" de ton onclick. C’est une syntaxe obsolète et ça fonctionne sans.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    En bonus, la version « propre », c’est-à-dire où les codes HTML, JS et CSS sont bien séparés.

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!DOCTYPE html>
    <html lang="fr">
    <head>
      <meta charset="utf-8">
      <title>Philippef</title>
      <link rel="stylesheet" href="style.css">
      <script src="script.js"></script>
    </head>
    <body>
      Bouton pour afficher le tableau
      <input type="button" name="voir_cal" value="calendar">
      <div id="madiv"></div>
    </body>
    </html>
    Code CSS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @charset "utf-8";
     
    #madiv { width: 15em;
             height: 10em;
             background-color: yellow;
    }
    #madiv table { border-width: 1px;
                   border-style: outset;
    }
    #madiv th, #madiv td { border-width: 1px;
                           border-style: inset;
    }
    Code JS : 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
    'use strict';
     
    var madiv;
     
    function afficher_cal() {
      madiv.innerHTML = '';
     
      var table = document.createElement('table');
      var row = table.insertRow();
      var cell;
      for (var i = 1; i <= 7; i++) {
        cell = row.insertCell();
        cell.textContent = i;
      }
     
      madiv.appendChild(table);
    }
     
    document.addEventListener('DOMContentLoaded', function () {
      madiv = document.getElementById('madiv');
     
      document.querySelector('input[name="voir_cal"]')
        .addEventListener('click', afficher_cal);
    });
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    Merci beaucoup !!
    j'étais et suis encore loin de tout ça !!
    mon but c'est de créer un calendrier cliquable.
    j'avais récupéré un code mais bien sur ça ne marche pas.
    j'ai donc complété ce code pour pouvoir changer les mois. Bien sur ce n'est pas ce qu'il y a de mieux mais ça marche.

    le code javascript : permet d'afficher le nom du mois et l'année quand on clique sur les boutons "<" et ">"
    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
     
    function next(gen){
    	var numero = parseInt(document.gen.mois_encours.value);
    	var numerofin = 12;
    	var an = parseInt(document.gen.annee.value);
    	if (numero < numerofin){
    		var numero = ++numero ;
    		document.gen.mois_encours.value= +numero;
    	}
    	else if (numero = numerofin){
    		document.gen.mois_encours.value= 1;
    		var an = ++an ;
    		document.gen.annee.value= +an;
    		numero = 1;
    	}
    	var le_mois =["","janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"];
    	var valeur = le_mois[numero];
    	document.gen.an.value= valeur.concat(' ').concat(+an);
    }
    function previous(gen){
    	var numero = parseInt(document.gen.mois_encours.value);
    	var numerofin = 12;
    	var an = parseInt(document.gen.annee.value);
    	if (numero > 1){
    		var numero = --numero ;
    		document.gen.mois_encours.value= +numero;
    	}
    	else if (numero = numerofin){
    		document.gen.mois_encours.value= 12;
    		var an = --an ;
    		document.gen.annee.value= +an;
    		numero = 12;
    	}
    	var le_mois =["","janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"];
    	var valeur = le_mois[numero];
    	document.gen.an.value= valeur.concat(' ').concat(+an);
    }
    function le_jour(el){
    	var day = el.innerHTML;
    	var month = document.gen.mois_encours.value;
    	var year = document.gen.annee.value;
    	if ((day < 10) && (month < 10)){ 
    		document.gen.date_selected.value = '0'+day +'/' +'0' +month +'/' +year;
    		document.gen.date_selected_en.value = +year +'-' +'0' +month +'-' +'0' +day;
    	}
    	else if ((day < 10) && (month > 9)){ 
    		document.gen.date_selected.value = '0'+day +'/' +month +'/'+year;
    		document.gen.date_selected_en.value = +year +'-' +month +'-' +'0'  +day;
    	}
    	else if ((day > 9) && (month < 10)){ 
    		document.gen.date_selected.value = +day +'/' +'0' +month +'/'+year;
    		document.gen.date_selected_en.value = +year +'-' +'0' +month +'-'+day;
    	}
    	else {
    		document.gen.date_selected.value = +day +'/' +month +'/'+year;
    		document.gen.date_selected_en.value = +year +'-'+month +'-'+day;
    	}
    }
    function Njours(gen){
    	var mois_js = parseInt(document.gen.mois_encours.value);
    	var anne_js = parseInt(document.gen.annee.value);
    	target = new Date(anne_js,mois_js,0);
    	nbJour = target.getDate(); // donne le nombre de jours dans le mois sélectionné
    	document.gen.nbjjs.value = nbJour;
    }

    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
     
    <?php
    $jour = date('d');
    $mois = date('m');
    $anne = date('Y');
    $mois_fr = Array("", "janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre");
    list($nom_jour, $jour, $mois, $annee) = explode('/', date("w/d/n/Y"));
    ?>
    <FORM NAME="gen" >
    <!---
    mois en cours  <INPUT type="text" name="mois_encours" value= "<?php echo $mois; ?>"><br />
    année <INPUT type="text" name="annee" value="<?php echo $anne;?>"><br />
    nb jours dans le mois <input type="text" name ="nbjjs" value="<?php echo $nbjour;?>"><br />
    date pour bdd <INPUT type="text" name="date_selected_en" value=""><br /><br />--->
     
    Votre date <INPUT type="text" name="date_selected" value=""><br />
    <!---################################################################################################ --->
    <!--- en tête du tableau contenant "1 bouton < cliquable", le mois et l'année, "1 bouton > cliquable" --->
     
    <table border =1 style="border-collapse:collapse;font-family:verdana;width:12.4em;">
    	<tr><td><input type='button' name='bouton' value='<' onclick='javascript:previous(gen),Njours(gen)'; style='cursor:pointer;'></td>
    	<td><input type='text' name='an'  style='text-align:center;border:none;' size=16em value='<?php echo $mois_fr[$mois]; echo " $anne";?>'></td>
    	<td><input type='button' name='bouton' value='>' onclick='javascript:next(gen),Njours(gen)'; style='cursor:pointer;'></td></tr>
    </table>
    <!--- la ligne contenant les jours de la semaine --->
    <table border =1 style="border-collapse:collapse;font-family:verdana;font-size:0.84em;width:12.4em">
    	<tr><td class='plein'>Lun</td><td class='plein'>Mar </td><td class='plein'>Mer </td><td class='plein'>Jeu </td><td class='plein'>Ven </td><td class='plein'>San </td><td class='plein'>Dim </td></tr>
    et enfin le tableau des jour du calendrier. Le problème c'est qu'il est écrit en php !! Je voudrais avoir le même résultat mais avec javascript. J'ai regarder depuis xx jours je n'y arrive pas
    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
     
    <?php
    for ($i = 1; $nbjour >= $i; $i++){
    	$p = cal_to_jd(CAL_GREGORIAN, $mois, $i, $anne); // formater jour
    	$jourweek = jddayofweek($p); // jour de la semaine
    	if($i == $nbjour){  //si c'est le dernier jour du mois
    		if($jourweek == 1){	//si c'est un lundi on ouvre une ligne
    			echo "<tr>";
    		}
    		if ($i == $jour){
    			echo "<td class='plein' onclick='javascript:le_jour(this)';><b>".$i."</b></td></tr>"; // on écrit la date en gras
    		}
    		else {
    			echo "<td class='plein' onclick='javascript:le_jour(this)';>".$i."</td></tr>"; 
    		}
    	}
    	else if($i == 1){ // si c'est le premier jour du mois
    		echo "<tr>"; //  on ouvre la ligne
    		if($jourweek == 0){  // si c'est un dimanche 
    			$jourweek = 7; // on affecte 7 à la variable $jourweek
    		}
    		for($b = 1 ;$b != $jourweek; $b++){  // on ajoute les cases vides devant le premier jour tant que la variable $b < à 7
    			echo "<td class='vide'></td>";
    		}
    		echo "<td class='plein' onclick='javascript:le_jour(this)';>".$i."</td>";
    		if($jourweek == 7){ // si le jour est un dimanche on ferme la ligne
    			echo "</tr>";
    		}
    	}
    	else{
    		if($jourweek == 1){ // si le jour de la semaine est un lundi on ouvre une ligne
    			echo "<tr>";
    		}
    		if ($i == $jour){ // si $i = la date du jour on écrit la date en gras
    			echo "<td class='plein' onclick='javascript:le_jour(this)';><b>".$i."</b></td>";
    		}
    		else { //si la variable $i # de la date du jour on ne met pas en gras
    			echo "<td class='plein' onclick='javascript:le_jour(this)';>".$i."</td>";
    		}
    		if($jourweek == 0){ // si c'est un dimanche on ferme la ligne
    			echo "</tr>";
    		}
    	}
    }
    ?>
    </table>
    </FORM>
    </div>
    un peu (beaucoup !) d'aide m'irai bien
    (ne pas trop croire l'attribut que l'on me donne !!)

  5. #5
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Waaaah… J’ai mis un moment à comprendre à quoi sevaient ces appels à cal_to_jd et jddayofweek

    Rassure-toi, pour obtenir le numéro du jour dans la semaine en JavaScript, c’est bien plus simple : c’est une méthode de l’objet Date : getDay.

    Le reste du script PHP est facile à convertir je pense, je vais te laisser chercher un peu. Tu peux recourir à la méthode innerHTML que tu utilises déjà, ou sa variante plus efficace insertAdjacentHTML dont je t’ai déjà parlé. Ou sinon tu peux utiliser les méthodes du DOM, notamment :


    Tu peux voir un exemple d’utilisation de ces méthodes dans le code « propre » que je t’ai donné.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    J'ai regardé du coté de getDate.
    Comme je veux faire un tableau des jours du mois quand on clique j'ai besoin de récupérer la valeur du premier jour du mois.
    Pour le moment j'ai ceci dans la fonction pour avoir le nombre de jour du mois et le numéro du jour de la semaine du mois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function Njours(gen){
    	var mois_js = parseInt(document.gen.mois_encours.value);
    	var anne_js = parseInt(document.gen.annee.value);
    	target = new Date(anne_js,mois_js,0);
    	nbJour = target.getDate(); // donne le nombre de jours dans le mois sélectionné
    	document.gen.nbjjs.value = nbJour;
    	var madate = new Date("Feb-1-2017");
    	var nJour = madate.getDay();
    	document.gen.premierjourmois.value = nJour;
    }
    je pense être sur la piste et je continue de chercher !!

  7. #7
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Attention avec le constructeur Date, les mois commencent à zéro mais les jours commencent à un.

    Cf. la doc :
    mois
    Valeur d'un entier représentant le mois, commençant à partir de 0 pour Janvier jusqu'à 11 pour Décembre.

    jour
    Paramètre optionnel. Un entier représentant le jour du mois (1-31).
    En mettant zéro tu te retrouves avec le dernier jour du mois précédent. Peut-être voulais-tu faire target = new Date(anne_js, mois_js + 1, 0) ?


    Une remarque avec parseInt : il y a un piège avec les nombres commençant par zéro (une situation qui est susceptible d’arriver quand on manipule des dates). Sous d’anciens navigateurs, il ne les interprète pas de façon attendue : pour une raison que j’ignore (sans doute un héritage du langage C), il les interprète en octal (base 8), ainsi les valeurs '08' et '09' (correspondant aux mois de septembre et octobre) sont considérées comme invalides et renvoient zéro.
    Pour cette raison il est conseillé de toujours forcer la base décimale en ajoutant un second paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var mois_js = parseInt(document.gen.mois_encours.value, 10);
    var anne_js = parseInt(document.gen.annee.value, 10);
    Voir parseInt.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  8. #8
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    Merci pour les informations.
    C'est vrai que j'ai un peu galéré avec les numéros de mois et de jours mais voilà où je suis arrivé.
    j'ai testé plusieurs fois et ça marche !! Je suis sûr que pour les "pro" il y a certainement mieux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function Njours(gen){
    	var mois_js = parseInt(document.gen.mois_encours.value);
    	var mois = mois_js -1;
    	var anne_js = parseInt(document.gen.annee.value);
    	var jour_js = "1";
    	target = new Date(anne_js,mois_js,0);
    	nbJour = target.getDate(); // donne le nombre de jours dans le mois sélectionné
    	document.gen.nbjjs.value = nbJour;
    	target = new Date(anne_js,mois,1);
    	var madate = new Date(anne_js,mois_js,1);
    	var FirstD = target.getDay(madate);
    	document.gen.premierjourmois.value = FirstD; // donne le 1er jour du mois dimanche=0, lundi=1, mardi=2 ...
    }
    Maintenant je vais m'attaquer à la construction du tableau en fonction du mois et du 1er jour du mois.
    je vais essayer essayer d'utiliser le code que tu m'as donné.
    Les prochaines recommandations sont les bienvenues !!

  9. #9
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    @Watilin,
    Rien à faire, j'ai beau chercher et essayer rien ne marche !!
    Je n'arrive pas à insérer une ligne dans le tableau de la fonction que tu m'as donnée.
    Et je ne mets même pas mes tentatives puisque rien ne fonctionne.
    Je pense qu'avec ce code j'arriverai à créer le tableau entier. Enfin j'espère.

    Merci

  10. #10
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Sois méthodique.
    Tu sais que tu dois construire un tableau qui a toujours 7 cellules par ligne. À partir de là tu peux choisir entre deux approches :
    • soit tu fais comme c’était fait dans le code PHP, c’est-à-dire une seule boucle, et toutes les 7 cellules tu crées un nouvelle ligne ;
    • soit tu fais deux boucles imbriquées, une pour les lignes et une pour les cellules de chaque ligne.


    Les données que tu as déjà calculées (le nombre de jours dans le mois, et la position dans la semaine du premier jour du mois) te permettent de savoir combien de cases vides mettre au début et à la fin du tableau.

    Un petit exemple de création de tableau avec les méthodes DOM :
    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
    'use strict';
     
    var i, j;
    var row, th, cell;
    var table = document.createElement('table');
     
    //
    // création des têtes de colonnes
    //
    var thead = table.createTHead();
    row = thead.insertRow();
    var nomsJours = [ 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa', 'Di' ];
    for (i = 0; i < 7; i++) {
      th = document.createElement('th'); // malheureusement, il n’y a pas de méthode insert pour les th
      th.textContent = nomsJours[i];
      th.scope = 'col'; // optionnel, pour l’accessibilité
      row.appendChild(th);
    }
     
    //
    // création du contenu
    //
    var tbody = table.createTBody();
    for (j = 0; j < 5; j++) {
      row = tbody.insertRow();
      for (i = 0; i < 7; i++) {
        cell = row.insertCell();
        cell.textContent = '(' + i + ',' + j + ')';
      }
    }
     
    document.body.appendChild(table);
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  11. #11
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    J'ai avancé encore un peu. j'arrive à afficher le nombre de jours en fonction du mois !!
    Oui bien sûr ça commence toujours le lundi ... pour le moment !!
    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
     
    	var firstD = parseInt(document.gen.premierjourmois.value); //le jour de la semaine lundi=1, mardi=2,... dimanche=0
    	var lastD = parseInt(document.gen.nbjjs.value); // dernier jour du mois
    	lastD = lastD +1;
    	var tbody = table.createTBody();
     
    	for (j = 1; j < lastD; j){
    		row = tbody.insertRow();
    		for (i = 1; i < 8; i++) {
    			if (j < lastD ){
    				cell = row.insertCell();
    				cell.textContent = j;
    			}
    			j = j + 1;
    		}
    	}
    Le problème c'est qu'à chaque clic pour avoir le mois suivant ou le mois précédent, c'est une table en plus qui s'affiche.
    J'ai cherché comment supprimer la table avant d'écrire la nouvelle table mais je n'ai trouvé que object.deleteRow();
    Donc j'imagine que je dois faire une boucle pour supprimer mes 5 lignes !! Je n'ai pas essayer.

  12. #12
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Pour éviter d’avoir des tables qui se multiplient, tu peux détecter si un <tbody> est présent, et le cas échéant, le supprimer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var existingTBody = table.querySelector('tbody');
    if (existingTBody) table.removeChild(existingTBody);
    Pour faire commencer le mois un autre jour qu’un lundi, il m’a semblé pratique de commencer par des jours négatifs (mais parfois j’ai une façon de raisonner un peu anormale). En clair, si la semaine commence un mardi, tu dois faire « reculer » le premier jour de 1, pour un mercredi, de 2, etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lundi      0
    mardi     -1
    mercredi  -2
    jeudi     -3
    vendredi  -4
    samedi    -5
    dimanche  -6
    Il y a donc une petite conversion à faire à partir de la valeur donnée par .getDay(). Je te laisse chercher
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  13. #13
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    donc pour le moment le calendrier qui s'affiche correspond bien au jour du début du mois sélectionné janvier = dimanche (0), février = mercredi (3) ...
    par contre les calendriers se placent l'un sous l'autre. je n'arrive pas à supprimer celui qui s'affiche au moment du clic pour le mois suivant.
    lorsque je place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var existingTBody = table.querySelector('tbody');
    if (existingTBody) table.removeChild(existingTBody);
    aucun calendrier ne s'affiche.

    voici le code complet de la page. Je sais que je dois encore simplifier le code mais pour le moment je veux aller au bout avant.
    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
     
    'use strict';
     
    function afficher_cal(){
     
    	var i, c;
    	var row, td, cell;
    	var table = document.createElement('table');
     
    	table.border = '1';
    	table.style.fontSize = '0.83em';
    	table.style.fontFamily = 'verdana';
    	table.style.borderCollapse = 'collapse';
    	table.style.textAlign = 'center';
    //
    // création des têtes de colonnes
    //
    	var thead = table.createTHead();
    	row = thead.insertRow();
    	var nomsJours = [ 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim' ];
    	for (i = 0; i < 7; i++) {
    		td = document.createElement('td'); // malheureusement, il n’y a pas de méthode insert pour les th
    		td.textContent = nomsJours[i];
    		td.scope = 'col'; // optionnel, pour l’accessibilité
    		row.appendChild(td);
    	}
    //
    // création du contenu
    //
    	var firstD = parseInt(document.gen.premierjourmois.value); //le jour de la semaine lundi=1, mardi=2,... dimanche=0
    	var lastD = parseInt(document.gen.nbjjs.value); // donne le nombre de jours (et le dernier) jour du mois
    	lastD = lastD + 1;
     
    	c = 1; 
    	var tbody = table.createTBody();
    	if (firstD == 1){	// 1er jour du mois = lundi
    		row = tbody.insertRow();
    		for (c = 1; c < lastD; c){
    			row = tbody.insertRow();
    			for (i = 1; i < 8; i++) {
    				if (c < lastD ){
    					cell = row.insertCell();
    					cell.textContent = c;
    				}
    				c = c + 1;
    			}
    		}			
     	}
    	if (firstD == 2){	// 1 er jour du mois = mardi
    		row = tbody.insertRow();
    		for (i = 1; i < 2; i++){
    			cell = row.insertCell();
    			cell.textContent = '';
    		}
    		for (i = 2; i < 8; i++){
    			cell = row.insertCell();
    			cell.textContent = c;
    			c = c + 1;
    		}
    		for (c = 7; c < lastD; c){
    			row = tbody.insertRow();
    			for (i = 1; i < 8; i++) {
    				if (c < lastD ){
    					cell = row.insertCell();
    					cell.textContent = c;
    				}
    				c = c + 1;
    			}
    		}			
     	}
    ....
    	document.body.appendChild(table);
     
    }
    document.addEventListener('DOMContentLoaded', function () {
      madiv = document.getElementById('madiv');
     
      document.querySelector('input[name="voir_cal"]')
        .addEventListener('click', afficher_cal);
    });
    j'ai cherché pendant un bon bout de temps ce qui suit mais sans résultat
    je voudrais aussi pouvoir ajouter un clic sur une date pour récupérer la valeur.
    et mettre en gras la date du jour.

  14. #14
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Je t’ai induit en erreur avec mon dernier message, je pensais que tu n’avais qu’une seule <table> dans ta page et que tu créais dynamiquement les <tbody>. En fait tu crées dynamiquement les tables, donc c’est ça que tu dois vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var existingTable = document.querySelector('table');
    if (existingTable) existingTable.parentElement.removeChild(existingTable);
    Sinon, tu avais un problème avec mes <th> ? Si c’est le style centré gras qui te dérange, n’oublie pas que ce n’est que l’apparence par défaut. Tout ça se gère par CSS.
    D’ailleurs à propos de ça, tu triches en rajoutant du CSS sur ta table via JavaScript. Mets une déclaration CSS dans un fichier CSS une bonne fois pour toutes, et au besoin utilise des class ou des id.

    Dans ton code tu as 7 boucles for qui font presque exactement la même chose. Tu dois te douter qu’il y a quelque chose qui cloche Ça peut se factoriser si tu utilises la variable firstD ailleurs que dans les if.

    Pour mettre la case du jour en gras, je te propose de prévoir à cet effet une classe CSS :
    Code CSS : Sélectionner tout - Visualiser dans une fenêtre à part
    .today { font-weight: bold; }
    Pour éviter de gérer les styles directement dans le code JS, puisque ce n’est pas le rôle de JS. On appelle ça le principe d’orthogonalité.
    Et ensuite, aux environs de cette (ces) ligne(s) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      …
      cell.textContent = c;
      …
    Rajoute ce bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      if (c === today) {
        cell.classList.add('today');
      }
    En ayant au préalable déclaré var today = new Date().getDate(); plus haut dans le script.


    Pour récupérer l’info de la date de chaque cellule, dans tous les cas ça va commencer par un gestionnaire d’évènement 'click'. Tu peux ajouter autant de gestionnaires qu’il y a de cellules, ou bien déléguer à un élément parent, par exemple le <tbody> ou la <table>.

    Pour traiter un évènement « délégué », il suffit d’examiner la nature de l’objet event.target.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tbody.addEventListener('click', function (event) {
      if ('TD' === event.target.tagName) {}
    });
    Et à partir de là tu récupères event.target.textContent et tu es en mesure de bidouiller avec pour reconstruire une date complète.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  15. #15
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    Merci pour tout ça.
    Entre temps j'avais cogité et trouvé pour mettre en gras la date du jour.
    pour le reste je vais regardé tout ça de près.
    encore merci

  16. #16
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    Malgré les heures je n'arrive toujours pas à utiliser la fonction C'est la chose qui me manque pour finaliser ce calendrier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tbody.addEventListener('click', function (event) {
      if ('TD' === event.target.tagName) {}
    });
    le script :
    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
     
    'use strict';
     
    function afficher_cal(){
     
    	var existingTable = document.querySelector('table');
    	if (existingTable) existingTable.parentElement.removeChild(existingTable);
     
    	var ladate = new Date();	
    	var ladatedujour = ladate.getDate();// la date du jour
    	var lemois = ladate.getMonth() ;
    	lemois = lemois + 1;
    	var i, c;
    	var row, td, cell;
    	var table = document.createElement('table');
    //
    // création des têtes de colonnes
    //
    	var thead = table.createTHead();
    	row = thead.insertRow();
    	var nomsJours = [ 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim' ];
    	for (i = 0; i < 7; i++) {
    		td = document.createElement('td'); // malheureusement, il n’y a pas de méthode insert pour les th
    		td.textContent = nomsJours[i];
    		td.scope = 'col'; // optionnel, pour l’accessibilité
    		row.appendChild(td);
    	}
    //
    // création du contenu
    //
    	var firstD = parseInt(document.gen.premierjourmois.value); //le jour de la semaine lundi=1, mardi=2,... dimanche=0
    	var lastD = parseInt(document.gen.nbjjs.value); // donne le nombre de jours (et le dernier) jour du mois
    	lastD = lastD + 1;
    	var actualMonth = parseInt(document.gen.mois_encours.value); // 
     
    	c = 1; 
    	var tbody = table.createTBody();
    	row = tbody.insertRow();
    	if (firstD == 0){
    		for (i = 1; i < 7; i++) {
    			cell = row.insertCell();
    			cell.textContent = '';
    			cell.classList.add('couleurvide');
    		}
    		cell = row.insertCell();
    		cell.textContent = c;
    		cell.classList.add('curseur');
    		if ((c == ladatedujour) && (actualMonth == lemois)){
    			cell.classList.add('ladatedujour');
    		}
    		c = c + 1;		
    	}
    	else if (firstD == 1){
    		for (i = firstD; i < 8; i++) {
    			cell = row.insertCell();
    			cell.textContent = c;
    			cell.classList.add('curseur');
    			if ((c == ladatedujour) && (actualMonth == lemois)){
    				cell.classList.add('ladatedujour');
    			}
    			c = c + 1;
    		}			
    	}
    	else {
    		for (i = 1; i < firstD; i++) {
    			cell = row.insertCell();
    			cell.textContent = '';
    			cell.classList.add('couleurvide');
    		}
    		for (i = firstD; i < 8; i++) {
    			cell = row.insertCell();
    			cell.textContent = c;
    			cell.classList.add('curseur');
    			if ((c == ladatedujour) && (actualMonth == lemois)){
    				cell.classList.add('ladatedujour');
    			}
    			c = c + 1;
    			c = c + 1;
    		}			
    	}
    	for (c = c; c < lastD; c){
    		row = tbody.insertRow();
    		for (i = 1; i < 8; i++){
    			if ( c < lastD){
    				cell = row.insertCell();
    				cell.textContent = c;
    				cell.classList.add('curseur');
    				if ((c == ladatedujour) && (actualMonth == lemois)){
    					cell.classList.add('ladatedujour');
    				}
    				c = c + 1;
    			}
    		}
    	}		
     
    	document.body.appendChild(table);
     
    }
    document.addEventListener('DOMContentLoaded', function () {
      madiv = document.getElementById('madiv');
     
      document.querySelector('input[name="voir_cal"]')
        .addEventListener('click', afficher_cal);
     
     
    });
    question subsidiaire : Ce calendrier est destiné à être placé 2 pages d'un site. Sur ces 2 pages il y a tableau. Etant donné que le calendrier efface les tableaux, comment résoudre ce problème ?
    par une indexation des tableaux ? par inclusion de la page du calendrier sur chacune des pages du site ?
    Merci d'avance

  17. #17
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Tu peux utiliser un id si tu considères que la table doit être déjà présente dans le HTML pur (sans l’intervention de JS). Mais ça n’a pas beaucoup de sens vu que la construction du calendrier dépend de JS.

    À la place, je propose une simple variable globale.
    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
    'use strict';
     
    function afficher_cal() {
      var ladate = new Date();
      var ladatedujour = ladate.getDate();
      var lemois = ladate.getMonth() + 1;
      var i, c;
      var row, th, abbr, cell;
      var thead, tbody;
     
      if (!calendrier) { // premier appel
        calendrier = document.createElement('table');
        document.body.appendChild(calendrier);
     
        // création des entêtes une fois pour toutes lors du premier appel
        // avec noms entiers des jours en infobulle
        var thead = table.createTHead();
        row = thead.insertRow();
        var nomsJours = [
          { nomCourt: 'Lun', nomLong: 'Lundi'    },
          { nomCourt: 'Mar', nomLong: 'Mardi'    },
          { nomCourt: 'Mer', nomLong: 'Mercredi' },
          { nomCourt: 'Jeu', nomLong: 'Jeudi'    },
          { nomCourt: 'Ven', nomLong: 'Vendredi' },
          { nomCourt: 'Sam', nomLong: 'Samedi'   },
          { nomCourt: 'Dim', nomLong: 'Dimanche' }
        ]; // https://youtu.be/QF9lUh5XPxo
     
        for (i = 0; i < 7; i++) {
          // j’ai repris les th, c’est quand même plus approprié pour des entêtes
          th = document.createElement('th');
          th.scope = 'col';
          abbr = document.createElement('abbr');
          abbr.textContent = nomsJours[i].nomCourt;
          abbr.title       = nomsJours[i].nomLong;
          th.appendChild(abbr);
          row.appendChild(th);
        }
      }
     
      // ici, thead existe forcément, mais tbody pas nécessairement
      tbody = calendrier.querySelector('tbody');
      if (!tbody) {
        // s’il n’existe pas, on le crée…
        tbody = calendrier.createTBody();
        // … et on lui ajoute le gestionnaire d’évènement des <td>
        tbody.addEventListener('click', function (event) {
          if ('TD' === event.target.tagName) {
            console.log(event.target.textContent);
          }
        });
      }
      else {
        // s’il existe, on le vide
        tbody.innerHTML = '';
      }
     
      //
      // … le remplissage des cellules ne change pas
      //
     
      // pas de appendChild à la fin, on l’a fait au début
    }
    Juste un truc : attention aux comparaisons « == » et « != » en JS et en PHP : ce sont des comparaisons laxistes, elles ne vérifient pas les types et effectuent des conversions implicites. Ça donne des résultats erratiques dans de nombreux cas. Utilise systématiquement les comparaisons strictes « === » et « !== » et tu n’auras jamais de problème avec ça.

    Il y a quelques autres petits trucs à retoucher dans ton code, par exemple c = c + 1; c = c + 1; qui peut se réduire en c += 2;. Et n’oublie pas le second argument de parseInt.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  18. #18
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Points : 442
    Points
    442
    Par défaut
    J'ai modifié tous les signes == en === et j'ai remplacé c = c + 1 par c += 1. Concernant c = c + 1, c = c + 1 c'était une erreur
    J'ai tenu compte de tes observations pour le début de la fonction. Problème, plus rien ne s'affiche.
    Pour la partie css ce qui me gêne c'est que tous les styles de la table vont être appliqués à toutes les tables (7) du site !!
    Est ce qu'il ne faut pas remettre la table du calendrier dans un balise <div> avec un id comme cela avait fait?

    le code de la page index. Les styles encore sur cette page seront placés dans le fichier css
    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
     
    <!DOCTYPE html>
    <html lang="fr">
    <head>
      <meta charset="utf-8">
      <title>Philippef</title>
      <link rel="stylesheet" href="style.css">
      <script src="script.js"></script>
    </head>
    <body >
     
    <?php
     
    $numjour = date('w'); // numéro du jour de la semaine 0 = dimanche ... 6 pour samedi
    $numjourl= date('N'); // numéro du jour de la semaine 1 = lundi ...7 pour dimanche
    $nomjour = date('D'); // nom du jour en enaglais sur 3 caratères
    $jour = date('d');
    $mois = date('m');
    $anne = date('Y');
     
    $mois_fr = Array("", "janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre");
    list($nom_jour, $jour, $mois, $annee) = explode('/', date("w/d/n/Y"));
     
     
    $nbjour = cal_days_in_month(CAL_GREGORIAN, $mois, $anne); // nombre de jour dans le mois
    $p = cal_to_jd(CAL_GREGORIAN, $mois, 1, $anne); // formater jour
    $jourweek = jddayofweek($p); // jour de la semaine
    ?>
     
    <table id="toto">
    <tr><td>tata</td><td>machin</td></tr>
    </table>
     
    <FORM NAME="gen">
    	<p style="font-size:0.83em;font-family:verdana;background-color:yellow;width:21em;">
    		Sélectionnez vos dates de disponibilités<br /><br />
    		Début : <INPUT type="text" name="date_selected" value="" size=9em> 
    			<input type="button" name="voir_cal" value="cal" class='boutonCal' onclick="afficher_cal(),voir('calendrier')";><br /><br />
    		Fin :	 <INPUT type="text" name="date_selected_end" value=""size=9em style="margin-left:1.3em;">
    			<input type="button" name="voir_cal" value="cal" class='boutonCal' onclick="afficher_cal(),voir('calendrier')";>
    	</p>
    	<!---mois en cours--->		<INPUT type="hidden" name="mois_encours" value= "<?php echo $mois; ?>">
    	<!---année en cours --->	<INPUT type="hidden" name="annee" value="<?php echo $anne;?>">
    	<!---nb jours dans le mois--->	<input type="hidden" name ="nbjjs" value="<?php echo $nbjour;?>">
    	<!---date pour bdd --->		 <INPUT type="hidden" name="date_selected_en" value=""><br />
    	<!---premier jour du mois --->	 <INPUT type="hidden" name="premierjourmois" value="<?php echo $jourweek;?>">
     
    <!--- en tête du tableau contenant "1 bouton < cliquable", le mois et l'année, "1 bouton > cliquable" --->
    <div id="calendrier" >
    	<input type='button' name='bouton' value='<' onclick='previous(gen),Njours(gen)'; class='boutonCal'>
    	<input type='text' name='an'  class='inputladate' size=16em value='<?php echo $mois_fr[$mois]; echo " $anne";?>'>
    	<input type='button' name='bouton' value='>' onclick='javascript:next(gen),Njours(gen)'; class='boutonCal'>
    </div>
    </FORM>
    </body>
    </html>
    le fichier css
    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
     
    table { 
    	border-width: 1px;
                   border-style: outset;
    	width:15.2em;
    	border-collapse:collapse;
    	font-family:verdana;
    	font-size:0.83em;
    	text-align : center;
    }
    .inputladate { text-align:center;font-weight:bold;}
    .ladatedujour { font-weight : bold;}
    .boutonCal { cursor : pointer;}
    .couleurvide { background-color : cyan;}
    .curseur { cursor:pointer;}
     
    #calendrier {width:12.57em;display :none;}
     
     
    th,  td { border-width: 1px; border-style: inset;}
     
    td {
    	text-align:center;
    	border:1px solid grey;
    	background-color:white;
    	border-collapse:collapse;;
     
    }
    le fichier script
    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
     
    function afficher_cal(){
     
    	var ladate = new Date();	
    	var ladatedujour = ladate.getDate();// la date du jour
    	var lemois = ladate.getMonth() + 1;
    	var i, c;
    	var row, td, abbr; cell; 
    	var thead, tbody;
     
    	if (!calendrier) {
    		calendrier = document.createElement('table');
    		document.body.appendChild(calendrier);
     
    		var thead = table.createTHead();
    		row = thead.insertRow();
    		var nomsJours = [
          		{ nomCourt: 'Lun', nomLong: 'Lundi'    },
          		{ nomCourt: 'Mar', nomLong: 'Mardi'    },
          		{ nomCourt: 'Mer', nomLong: 'Mercredi' },
          		{ nomCourt: 'Jeu', nomLong: 'Jeudi'    },
          		{ nomCourt: 'Ven', nomLong: 'Vendredi' },
         		{ nomCourt: 'Sam', nomLong: 'Samedi'   },
         		{ nomCourt: 'Dim', nomLong: 'Dimanche' }
        		]; // https://youtu.be/QF9lUh5XPxo
     
     		for (i = 0; i < 7; i++) {
          		// j’ai repris les th, c’est quand même plus approprié pour des entêtes
          			th = document.createElement('th');
    			th.scope = 'col';
          			abbr = document.createElement('abbr');
         			abbr.textContent = nomsJours[i].nomCourt;
          			abbr.title       = nomsJours[i].nomLong;
          			th.appendChild(abbr);
          			row.appendChild(th);
        		}
    	}
     
    	// ici, thead existe forcément, mais tbody pas nécessairement
    	tbody = calendrier.querySelector('tbody');
    	if (!tbody) {
    		// s’il n’existe pas, on le crée…
    		tbody = calendrier.createTBody();
        		// … et on lui ajoute le gestionnaire d’évènement des <td>
    		tbody.addEventListener('click', function (event) {
    			if ('TD' === event.target.tagName) {
    				console.log(event.target.textContent);
          			}
        		});
      	}
    	else {
        		// s’il existe, on le vide
        		tbody.innerHTML = '';
      	}
     
    //
    // création du contenu
    //
    	var firstD = parseInt(document.gen.premierjourmois.value); //le jour de la semaine lundi=1, mardi=2,... dimanche=0
    	var lastD = parseInt(document.gen.nbjjs.value); // donne le nombre de jours (et le dernier) jour du mois
    	lastD = lastD + 1;
    	var actualMonth = parseInt(document.gen.mois_encours.value); // 
     
    	c = 1; 
    	var tbody = table.createTBody();
    	row = tbody.insertRow();
    // la première ligne du tableau
    	if (firstD === 0){	// premier jour du mois un dimanche
    		for (i = 1; i < 7; i++) {
    			cell = row.insertCell();
    			cell.textContent = '';
    			cell.classList.add('couleurvide');
    		}
    		cell = row.insertCell();
    		cell.textContent = c;
    		cell.classList.add('curseur');
    		if ((c === ladatedujour) && (actualMonth === lemois)){
    			cell.classList.add('ladatedujour');
    		}
    		c += 1;		
    	}
    	else if (firstD === 1){	// premier jour du mois un lundi
    		for (i = firstD; i < 8; i++) {
    			cell = row.insertCell();
    			cell.textContent = c;
    			cell.classList.add('curseur');
    			if ((c === ladatedujour) && (actualMonth === lemois)){
    				cell.classList.add('ladatedujour');
    			}
    			c += 1;
    		}			
    	}
    	else {	// les autres jours de la semaine
    		for (i = 1; i < firstD; i++) {
    			cell = row.insertCell();
    			cell.textContent = '';
    			cell.classList.add('couleurvide');
    		}
    		for (i = firstD; i < 8; i++) {
    			cell = row.insertCell();
    			cell.textContent = c;
    			cell.classList.add('curseur');
    			if ((c === ladatedujour) && (actualMonth === lemois)){
    				cell.classList.add('ladatedujour');
    			}
    			c += 1;
     
    		}			
    	}
    // les autres lignes du tableau
    	for (c = c; c < lastD; c){
    		row = tbody.insertRow();
    		for (i = 1; i < 8; i++){
    			if ( c < lastD){
    				cell = row.insertCell();
    				cell.textContent = c;
    				cell.classList.add('curseur');
    				if ((c === ladatedujour) && (actualMonth === lemois)){
    					cell.classList.add('ladatedujour');
    				}
    				c += 1;
    			}
    		}
    	}		
    }
    document.addEventListener('DOMContentLoaded', function () {
      madiv = document.getElementById('madiv');
     
      document.querySelector('input[name="voir_cal"]')
        .addEventListener('click', afficher_cal);
     
    });

  19. #19
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Si rien ne s’affiche c’est probablement à cause du display: none dans ton CSS.

    Attention à la déclaration des variables, ici tu as oublié de remettre th :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var row, td, abbr; cell;
    En mode 'use strict', les variables non déclarées, ça ne passe pas et ça fait un message dans ta console F12. C’est un des avantages du mode strict.

    Pour que les styles ne s’appliquent qu’à ton calendrier, je te suggère de lui donner un id (ou une classe), et d’appliquer les styles à cet id (ou cette classe).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (!calendrier) {
        calendrier = document.createElement('table');
        calendrier.id = 'calendrier';
        document.body.appendChild(calendrier);
        …
    Code CSS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #calendrier {
      border-width: 1px;
      border-style: outset;
      width: 15.2em;
      border-collapse: collapse;
      font-family: Verdana, sans-serif;
      font-size: 0.83em;
      text-align: center;
    }
    Remarque que le border-style: outset je l’ai mis juste pour que ça ressemble au style par défaut quand tu utilises l’attribut déprécié border="1".
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  20. #20
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,

    Attention à la confusion des genres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (!calendrier) {
        calendrier = document.createElement('table');
        document.body.appendChild(calendrier);
     
        var thead = table.createTHead();
    la variable table n'est pas définie à ce niveau il s'agit de calendrier.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Générer un calendrier automatique
    Par philippesorin dans le forum 1&1
    Réponses: 3
    Dernier message: 18/12/2007, 12h31
  2. Réponses: 4
    Dernier message: 20/09/2007, 16h38
  3. Générer un calendrier dans une table
    Par freud dans le forum Bases de données
    Réponses: 9
    Dernier message: 06/04/2007, 14h26
  4. Générer un calendrier de Matches
    Par Gwenn dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 18/08/2006, 16h23
  5. [Dates] Générer un calendrier
    Par EvilAngel dans le forum Langage
    Réponses: 1
    Dernier message: 10/08/2006, 00h25

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