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 :

Un effet Toggle [script.aculo.us]


Sujet :

Bibliothèques & Frameworks

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Un effet Toggle
    Bonjour à toute la communauté ,

    Mon souci aujourd'hui concerne la réalisation d'un effet toggle sur des éléments. Pour vous situer un peu, j'ai 2 div formant un menu, et je souhaite effectuer un effet de toggle sur les deux div (l'une par défaut étant plié (donc un toggle déjà fait) et l'autre étant déplié), donc lorsque j'ouvre une des div, l'autre se ferme.

    En jQuery, rien de plus simple, suffit d'un petit element.slideToggle() et tout baigne.

    Cependant, ayant des contraintes précises je dois utiliser Scriptaculous et Prototype. Voici le script actuel que j'ai réalisé, celui-ci s'exécute lors du click sur un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Evènement lors d'un clique sur le bouton
    $$('.block-menu-button').each(function(element) {
        element.observe('click', function() {
            // Boucle sur les 2 DIV
            $$('.block-menu-haut','.block-menu-bas').each(function(element) {
                Effect.toggle(element,'Blind');
            });
        });
    });
    Le défaut de ce code est son exécution, en effet lorsque je clique sur le bouton en question, il ne m'effectue qu'une exécution par click, c'est à dire que le premier click effectue un toggle sur la première div, et un second click permet d'effectuer le toggle sur l'autre DIV.

    Logiquement vu que je boucle sur les 2 éléments, le toggle est censé se faire sur les 2 DIV dans le même click ?

  2. #2
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Bonjour,

    Je ne vois pas de problème sur ton code si ce n'est que Blind devrait être écrit sans la majuscule (blind)

    On peut voir ton HTML ?
    EDIT: rien à voir avec ton problème, mais ton code peut aussi s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Evènement lors d'un clique sur le bouton
    $$('.block-menu-button').invoke("observe", "click", function() {
      // Boucle sur les 2 DIV
      $$('.block-menu-haut','.block-menu-bas').each(function(element) {
        Effect.toggle(element,'blind');
      });
    });
    on ne dit pas "ça ne marche pas" on dit "je suis incapable de faire fonctionner correctement les outils mis à ma disposition"
    Pas de question technique par MP

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    "element" est déjà une propriété de l'objet Event, l'utiliser comme nom de variable est assez maladroit et déconseillé.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Mon HTML est tout ce qu'il y a de plus basique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <div class="block-menu">
        <div class="block-menu-haut">
            <span class="block-menu-button">
            // Image
            </span>
        </div>
        <div class="block-menu-bas">
            <span class="block-menu-button">
                // Image
            </span>
        </div>
    </div>
    Etant donné que je viens tout juste de commencer prototype, c'est encore frais et je ne connais pas encore bien le système.
    Il est donc très possible que j'écrive pas mal d'erreurs .

  5. #5
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Mais dans ton exemple, tes deux elements sont visibles du debut, donc lors du premier click, tu vas masquer les deux...
    on ne dit pas "ça ne marche pas" on dit "je suis incapable de faire fonctionner correctement les outils mis à ma disposition"
    Pas de question technique par MP

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Non du tout. En fait, le script toggle est stocké dans une fonction. Voila comment tout se déroule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    document.observe("dom:loaded", function() {
        $$('.block-menu-bas').invoke('toggle');
        toogleMenu();
    });
     
    function toogleMenu() {
    // Fonction lancant le toggle
    }
    => du coup j'ai bien un seul div ouvert .

    EDIT:
    Par contre, à l'origine la fonction toggle de scriptacoulous s'execute avec l'id de l'élement, hors je l'utilise ici en utilisant le nom de la classe de l'élement, donc je ne sais pas si ca peut agir sur le fonctionnement de la fonction toggle.

  7. #7
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Citation Envoyé par Nelieru Voir le message
    Par contre, à l'origine la fonction toggle de scriptacoulous s'execute avec l'id de l'élement, hors je l'utilise ici en utilisant le nom de la classe de l'élement, donc je ne sais pas si ca peut agir sur le fonctionnement de la fonction toggle.
    Non, ce que tu fais est bien.

    Peux tu essayer sans les effets :
    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
     
    document.observe("dom:loaded", function() {
        $$('.block-menu-bas').invoke('toggle');
        toogleMenu();
    });
     
    function toogleMenu() {
      // Evènement lors d'un clique sur le bouton
      $$('.block-menu-button').invoke("observe", "click", function() {
        // Boucle sur les 2 DIV
        $$('.block-menu-haut','.block-menu-bas').each(function(elem) {
          elem.toggle();
           //Effect.toggle(elem,'blind');
        });
      });
    }
    on ne dit pas "ça ne marche pas" on dit "je suis incapable de faire fonctionner correctement les outils mis à ma disposition"
    Pas de question technique par MP

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Avec la fonction element.toggle() ca fonctionne.

    EDIT:
    Mais je souhaite utilisé cependant l'effet slide de scriptaculous et donc, Effect.toggle('slide') ou Effect.toggle('blind').

    Le problème reste qu'il ne veut pas effectuer plusieurs toggle lors d'un même click...

  9. #9
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Et bien il fallait aller au fond de la cave pour voir le souci:
    Par défaut, le Effect.toggle limite la pile d'effets à 1 élément. Du coup seul un des deux était pris.

    La solution consiste donc à préciser une option queue sans limite, mais avec un scope...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function toogleMenu() {
      // Evènement lors d'un clique sur le bouton
      $$('.block-menu-button').invoke("observe", "click", function() {
        // Boucle sur les 2 DIV
        $$('.block-menu-haut','.block-menu-bas').each(function(elem) {
          Effect.toggle(elem,'blind',{queue:{scope:'global'}});
        });
      });
    }
    @+
    on ne dit pas "ça ne marche pas" on dit "je suis incapable de faire fonctionner correctement les outils mis à ma disposition"
    Pas de question technique par MP

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Et bien écoute, à force de persévérance, on a enfin pu trouver la solution et ca marche je viens de tester .

    Donc je vous remercie encore pour le temps que vous avez passé à m'aider à résoudre mon problème.

    Nelieru

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/08/2011, 11h03
  2. [script.aculo.us] Effet toggle conteneur fermé à l'ouverture de la page
    Par polo42 dans le forum Bibliothèques & Frameworks
    Réponses: 6
    Dernier message: 07/10/2009, 09h12
  3. Réponses: 4
    Dernier message: 30/09/2009, 14h48
  4. Effet toggle UI jquery
    Par valkiki dans le forum jQuery
    Réponses: 2
    Dernier message: 07/09/2009, 11h16

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