Bonjour, Bonsoir
Voilà il y a environ 1 an j'ai utilisé le tutoriel du calendrier pour un stage. Comme j'ai trouver le calendrier génial, je souhaiterais le réutiliser aujourd'hui dans une application web. Simplement je ne suis pas vraiment fort en Jquery c'est pourquoi j'ai besoin de votre aide, étant donné que malgré mes recherches je n'ai pas trouver la réponse à ma question.

Je souhaiterais que les évènement du calendriers s'affiche quand je clique sur le jour et non pas quand je passe sur le jour en question.

Mon code étant exactement celui du tutoriel.

Merci d'avance !

13 réponses


elhebert
Réponse acceptée

Pas de soucis :)

En soit mon code jQuery n'est pas compliqué à comprendre si tu comprend l'anglais. Je vais tenté de l'expliquer ligne par ligne.

précision :
no-hover : classe css qui cache les évenements lié à une date. De base toutes les dates sont en no-hover
hover : affiche les évenement lié à une date.
click : classe servant à savoir quel éléement est le dernier séléctionner.

$('#today').removeClass('no-hover').addClass('hover click');

Cherche l'élément ayant l'id #today (la date d'aujourd'hui en somme), lui retire la classe no-hover et lui ajoute les classe hover et click. Pour résumé : On affiche les évenement d'aujourd'hui et on sauvegarde le clique dessus.

$('td').hover(function() {
    $('td').removeClass('hover').addClass('no-hover');
    $(this).toggleClass('hover').toggleClass('no-hover');
});

Lorsque tu survole avec ta souris une case du tableau (une date du calendrier), on retire la classe hover de toutes les cellules du tableau et on leur ajoute la classe no-hover. Pour résumé : on cache tout les évenements.
Ensuite sur l'élément que l'on est en train de survoler (this) on inverse l'état des classes hover et no-hover (On ajoute la classe si elle n'existe pas, et on la supprime si elle existe). Pour résumé : on affiche les évenements de la date qu'on est en train de survoler.

$('table').mouseleave(function(){
  $('td').removeClass('hover').addClass('no-hover');
  $('.click').removeClass('no-hover').addClass('hover');
});

Lorsque l'on quite le tableau (c-à-d le calendrier) on cache tout les évenements (En retirant hover et en ajoutant no-hover. Et ensuite on affiche les évenements de l'élément contenant la classe click. Pour résumé quand tu quitte le calendroer, tu affiche uniquement les évenements de la date sur laquelle tu as cliqué.

$('td').click(function() {
  $('td').removeClass('click');
  $(this).addClass('click');
});

Ici on retire la classe click de toutes les cases du tableau, et on l'ajoute sur l'éléent que l'on vient de cliquer (this). Pour résumé on sauvegarde la date que l'on vient de cliquer.

En espérant que tu ai compris :) Mais si tu as toujours des soucis de compréhension je t'invite à me contacter via mon skype ou me rejoindre su mon ts (info en début de post).

Bonjour ShishiLeSushi,

Je pense qu'avec un peu de temps, tu aurais pu trouver par toi même.
En effet, (je me souviens plus du tutoriel) tu dois avoir à un bout de code qui ressemble à ça :

$("#quelquechose").hover(function(){
    /*
    Fait plein de truc ici
    */
});

Et comme je vais pas te donner la réponse en entière, je te laisse aller regarder ce lien pour trouver quel est la bonne méthode à utiliser (c'est pas bien compliqué).

C'est tout, pour le moment.
Cordialement,
PallMallShow.

Bonjour, il se trouve que j'avais essayé la fonction click() cela fonctionnait juste partiellement étant donné que cela s'affichait quand je cliquait dessus, mais ensuite cela ne restait pas afficher, là se trouve le réel problème.

edit : hmmm en fait il se trouve que non le "hover" est dans le css, et pas présent dans le JS ... je suis totalement perdu :'(

Comment ça cela ne reste pas affiché ?

bah mes évenèment s'affichait simplement quand je restais sur la case en maintenant le bouton de ma souris dès que je relachais, les informations disparaissaient.

Est-ce quand tu relache le clique, ou quand tu sors de la case ?

Il y a pas si longtemps j'ai été confronté au même problème que toi.
J'ai trouvé une solution, quoi que un peu tordue, mais fonctionelle :

c'est un peu barbare, mais en gros, lorsque je clique sur une date, je lui ajoute une classe en css click. Et lorsque je quitte le calendrier j'affiche que le jour qui a la classe click en lui ajoutant la classe hover (qui affiche les évenements de la dites date) et en cachant toute les autres dates via la classe no-hover.

Je t'invite à regarder le code jQuery tu comprendra surement mieux :

    $('#today').removeClass('no-hover').addClass('hover click');

    $('td').hover(function() {
        $('td').removeClass('hover').addClass('no-hover');
        $(this).toggleClass('hover').toggleClass('no-hover');
    });

    $('table').mouseleave(function(){
        $('td').removeClass('hover').addClass('no-hover');
        $('.click').removeClass('no-hover').addClass('hover');
    });

    $('td').click(function() {
        $('td').removeClass('click');
        $(this).addClass('click');
    });

Si tu veux tester je t'invite à le tester sur un de mes projets en cours : http://elhebert.be/projects/StingNetwork/Calendar/index.html

Je sais pas si j'ai été très clair. Si tu as besoin de plus de précision, je tenterais de faire mieux. Mais je pense qu'avec le code jQuery et mon exemple fonctionel tu devrait être en mesure de comprendre et reproduire par toi même un procédé similaire.

@PallMallShow
Quand je relache le clique.

@helhebert
Mon niveau en jQuery est bas, très bas... trop bas ! --' J'ai compris la logique de ton raisonnement mais cela s'arrete là :'( du moins je crois.
Pourrais-je te contacter autrement que via le forum ?

Il faudrait le code à l'endroit où tu utilise $("#lacase") pour qu'on puisse voir.

Voilà comment s'affiche ma case :

                   <td <?php if($time == strtotime(date('Y-m-d'))): ?> class="today" <?php endif; ?>>
                            <div class="relative">

                                <div class="day"><?php echo $d; ?></div>
                            </div>

                           <div class="daytitle">
                               <?php echo $date->days[$w-1]; ?> <?php echo $d; ?>  <?php echo $date->months[$m-1]; ?>
                           </div>
                           <ol class="events">
                               <?php if(isset($events[$time])): foreach($events[$time] as $e): ?>
                                    <li><?php echo $e; ?></li>
                               <?php endforeach; endif;  ?>
                               <div class="eventsj">
                               <?php if(isset($eventj[$time])): foreach($eventj[$time] as $e): ?>
                                    <li><?php echo $e; ?></li>
                               <?php endforeach; endif;  ?>
                               </div>
                           </ol>
                       </td>

Et le JS ? :)

le js de mon code :


  jQuery(function($){

                //on cache les tableaux contenant les mois
               $('.month').hide();

               //on affiche le premier mois de l'année
               $('.month:first').show();

               // on ajoute la classe active au premier mois de l'année
               $('.months a:first').addClass('active');

               // current = 1 car le premier mois de l'année est janvier
               var current = 1;

               // on ajoute les effets quand on clique sur un mois
               $('.months a').click(function(){

                    //on stock le mois que l'on veut afficher
                    var month = $(this).attr('id').replace('linkMonth','');

                    // si le mois est différent de celui qui est affiché alors :
                    if(month != current){

                        //le mois courrant remonte (il est donc masqué)
                        $('#month'+current).slideUp();

                        //le mois que je veux afficher descend (il est donc apparu)
                        $('#month'+month).slideDown();

                        //on retire la classe active sur tous les liens
                        $('.months a').removeClass('active'); 

                        //j'ajoute la classe active sur le lien qui affiche le mois
                        $('.months a#linkMonth'+month).addClass('active'); 

                        //je mets la valeur du mois afficher dans $current
                        current = month;
                    }
                    return false; 
               });
            });
        </script>
    </head>

Merci beaucoup sujet résolu ! \0/