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

Bibliothèques & Frameworks Discussion :

Stopper un delay sur accordion Mootools [MooTools]


Sujet :

Bibliothèques & Frameworks

  1. #1
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut Stopper un delay sur accordion Mootools
    Bien le bonjour à tous.

    Je me casse la tête comme un fou sur un script mootools.
    Le bien connu accordion mootools.

    Demo ici : http://demos.mootools.net/Accordion

    Tout fonctionne bien avec le code ci-dessous (j'ai épuré le code et laissé les évènements au cas ou).

    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
    window.addEvent('domready', function() {
    var myAccordion = new Accordion($('accordion'), 'h3.toggler', 'div.element', {
    opacity: true,show:0,
    onActive: function(toggler, element){
     
    },
    onBackground: function(toggler, element){
     
    },
    onComplete: function(toggler, element){
     
    }
     
    });
    });
    Ce que je voulais faire c'est que le menu "s'accordéonne" tout seul.
    J'ai donc trouvé ce bout de code qui je rajoute dans onActive

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var myTimer = this.display.delay(10000, this, (this.previous + 1) % this.togglers.length);
    Tout ce passe à merveille le menu s'active tout seul.

    La ou réside le problème est que je voudrais que myTimer s'arrête de fonctionner si on clique sur un toggler parce qu'actuellement si on clique sur un toggler le timer ne s'arrête pas et très rapidement le menu s'emballe dans tous les sens.

    Je me doute que si je laisse myTimer dans onActive j'y arriverai pas ?
    Aussi j'ai tenté des dizaines de solutions mais rien ne fonctionne

    J'arrive à lancer un évènement lors du clic (genre un alert() :p) mais je n'arrive pas du tout à stopper display.delay.

    J'espère avoir été clair
    J'ai la tête qui éclate du coup.

    Merci à tous.

  2. #2
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    Bonjour,

    En mettant myTimer comme variable globale, avez-vous essayé de faire ceci ?


  3. #3
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut
    Bonjour Vermine (lol)

    Oui tout à fait j'ai testé et en le mettant par exemple dans onComplete.
    Mais cela ne fonctionne pas.

    L'idéal serai de lancer le delay hors évènement onActive etc.
    Cela pourrais surement fonctionner ensuite avec $clear(myTimer).

    Comment puis-je réussir à mettre myTimer en dehors des évenements onActive, onComplete et onBackground. J'ai tenté de remplacer le "this" mais je ne trouve pas la syntaxe correct apparemment

    Merci par avance

    EDIT: Comment procéder pour mettre ma variable en global s'il vous plait ?
    Actuellement elle figure dans onActive.

    EDIT 2:

    Bon je peux te dire que le $clear fonctionne car j'ai mis ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    window.addEvent('domready', function() {
    var myAccordion = new Accordion($('accordion'), 'h3.toggler', 'div.element', {
    opacity: true,show:0,
    onActive: function(toggler, element){
    var myTimer = this.display.delay(3000, this, (this.previous + 1) % this.togglers.length);
    var myTimer = $clear(myTimer);
    }
    });
    });
    Et le défilement ne se produit plus, normal puisque que le clear s'execute après le lancement du delay. Si j'inverse les deux le défilement fonctionne, cependant toujours le même problème lorsque je clique il lance plusieurs instances le menu deviens fou très rapidement

  4. #4
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    Essayez toujours de déclarer le timer en dehors de l'accordéon, sinon en dehors du domready.
    Puis vous faites le clear dans le onComplete. Mais il faut tester tout ça car je fais des suppositions.

    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
     
    window.addEvent('domready', function() {
     
       var myTimer;
     
       var myAccordion = new Accordion($('accordion'), 'h3.toggler', 'div.element', {
          opacity: true,show:0,
          onActive: function(toggler, element){
             myTimer = this.display.delay(3000, this, (this.previous + 1) % this.togglers.length);
          },
          onComplete: function(toggler, element){
    	 var myTimer = $clear(myTimer);	
          }
       });
    });

  5. #5
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut
    bon ça avance :

    J'arrive à arrêter le défilement avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    window.addEvent('domready', function() {
    var test = 1;
     
    $('accordion').addEvent('click', function() { test = 2;  });
     
    var myAccordion = new Accordion($('accordion'), 'h3.toggler', 'div.element', {
    opacity: true,show:0,
    onActive: function(toggler, element){
    if(test==2) { myTimer = $clear(myTimer);}else{ myTimer = this.display.delay(3000, this, (this.previous + 1) % this.togglers.length);}
    }
    });
    });
    Le problème qui réside maintenant est lors du clic cela arrête le défilement mais pas le delay précédemment déclaré. De ce fait le slider s'arrete mais une instance plus tard.

  6. #6
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    Excusez-moi, vous pourriez me mettre un peu plus de code pour que je puisse tester chez moi ?

  7. #7
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut
    Pas de problème,
    je vais même te mettre un rar à disposition avec tous les éléments.

    Je prépare ça de suite et je reviens.

  8. #8
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut
    Alors voici le zip en question : http://www.website-modern.fr/mootools.zip

    Voici un rapide état des lieux

    Si tu laisses le menu sans rien toucher il défile parfaitement.
    Si tu cliques sur le menu ACTIF cela stoppe bien le défilement c'est parfait
    Par contre si tu cliques sur un élément qui est INACTIF il va se déplier (normal) mais le delay précédent n'est pas arrété. Il s'arretera qu'au prochain défilement.

    Merci de ton aide Vermine, j'apprécie grandement

    Edit : en fait je pense que myTimer est lancé et lorsque qu'on clique sur un element un autre myTimer est généré, le $clear(myTimer) "kill" la dernière instance de myTimer mais pas celle générée avant. Il serait peux être intéressant de regarder comment "killer" toutes les instances et pas uniquement myTimer. C'est une idée comme ça que je viens d'avoir Je vais faire des tests En tous les cas sur la toile on ne trouve pas vraiment de solution, je pense que si on réussi ça pourrais servir à moulte personnes

  9. #9
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut Ca y est! Presque. Ou pas. :D
    Ha ben je me rend compte que le onComplete n'est pas ce que je pensais.

    Ceci fonctionne partiellement:

    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
    25
    26
    27
     
    var test = 1;
    var myTimer;
     
    window.addEvent('domready', function() {
     
     
    		$('accordion').addEvent('click', function() { 
    			$clear(myTimer); 
    			test++;
    			});
     
    		var myAccordion = new Accordion($('accordion'), 'h3.toggler', 'div.element', {
    			opacity: true,show:0,
    			onActive: function(toggler, element){
    			},
    			onComplete: function(){
    				if(test>2) { 
    					$clear(myTimer); 
    				}else{ 
    					myTimer = this.display.delay(3000, this, (this.previous + 1) % this.togglers.length);
    				}
    			}
    	});
     
     
    });

    Par contre, il faut encore retravailler cela car au démarrage, ça ne se lance pas (forcément). Il faut en ouvrir d'abord un pour que le défilement continu se lance, puis cliquer pour l'arrêter.
    Second problème; ça ne fonctionne pas du tout sur IE (le script précédent non plus en fait).

  10. #10
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    Il y a de l'idée en faisant ceci:

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    onActive: function(toggler, element){
    	if(test2<2) { 
    		myTimer = this.display.delay(3000, this, (this.previous + 1) % this.togglers.length);
    		test2++;
            }
    }

    en déclarant var test2 = 1; au dessus. Mais ça ne fonctionne que si l'on clique sur l'actif (toujours logique). Donc il faudrait voir à mettre ce code plutôt dans le onComplete mais je n'ai pas encore trouvé où ni comment exactement et malheureusement, je quitte l'ordinateur. :-s

    Bon courage, on y est presque. =)

  11. #11
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut \o/
    Voici donc quelque chose qui pourrait vous convenir. Il y a sûrement une méthode plus propre.

    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
     
    var test = 1;
    var test2 = 1;
    var myTimer;
     
    window.addEvent('domready', function() {
     
    	//Si on clique, on arrête le timer	
    	 $('accordion').addEvent('click', function() { 
    		 $clear(myTimer); 
    		 test++;
    	 });
     
    	 var myAccordion = new Accordion($('accordion'), 'h3.toggler', 'div.element', {
    		 opacity: true,show:0,
    		 onActive: function(toggler, element){
                             //Premier passage, on lance le timer
    			 if(test2<2) { 
    				 myTimer = this.display.delay(3000, this, (this.previous + 1) % this.togglers.length);
    				 test2++;
                              }
     
    		 },
    		 onComplete: function(){
                             //chaque fois qu'on a déplié, on vérifie si on a cliqué ou pas
                             //étonnament on ne passe pas ici lors du premier passage
    			 if(test>1) {
    				 $clear(myTimer); 
    			 }else{ 
    				 myTimer = this.display.delay(3000, this, (this.previous + 1) % this.togglers.length);
    			 }
    		 }
    	});
    });
    Et bonne nouvelle, ça fonctionne aussi sur IE. Ce qui me parait logique, mais tantôt je n'y parvenais pas.

    PS: attention, il y avait une virgule qui trainait dans votre code après le onComplete.

  12. #12
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut
    Merci je test de suite

  13. #13
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut
    Excellent Vermine !
    Ça fonctionne enfin !

    J'ai une de ces joie la ahah
    Merci beaucoup.

    En décryptant ton code j'ai bien saisi le fonctionnement et c'est vraiment bien pensé en fait ! J'avais pas du tout pensé à tester si il y a eu un clic sur le onComplete. Franchement bien vu

    Merci encore d'avoir pris du temps pour m'aider, j'apprécie grandement.
    A charge de revanche Vermine

  14. #14
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    Le plaisir est partagé.

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

Discussions similaires

  1. Stopper le scroll sur une ancre avec javascript
    Par rocketter dans le forum Général JavaScript
    Réponses: 23
    Dernier message: 07/05/2014, 16h10
  2. [MooTools] Lien sur imagemenu mootools
    Par idamarco dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 24/12/2008, 03h08
  3. Démarrer / Stopper des services sur un PC distant
    Par El-Diablo- dans le forum C++Builder
    Réponses: 1
    Dernier message: 30/05/2008, 21h42
  4. [MooTools] [DOM] Question sur toolkit Mootools
    Par Ylias dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 16/10/2007, 00h09
  5. Stopper une impression sur Windows NT Pro ?
    Par coralie26 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 29/09/2007, 18h32

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