jQuery Dropdownmenü "click" zuklappen

  • Hallo zusammen,

    Ich habe mir aus dem Inet ein Script für ein Dropdownmenü geholt.
    Nun war das aber ein "mouseover" Script und ich habe es durch "click" ersetzt.

    Jetzt ist das Problem, dass wenn das Dropdownmenüü einmal geöffnet ist, es sich nicht wieder schliesst.

    Deshalb möchte ich so einen Aktionsreienfolge:

    Code
    click: Dropdownliste erscheint
     |-> click: Dropdownliste verschwindet
     |-> click irgendwo anders hin: Dropdownliste verschwindet auch

    Wie kann ich das machen?

    Wie sehen dann die Aktionen aus?

    Vielen Dank
    the_zoker_09

  • Mal davon abgesehen, dass ich nicht der große JavaScript-Experte bin, ist das, was du da vorhast, völlig benutzerunfreundlich. Ich muss erst irgendwo klicken, damit das Menü verschwindet? Das ist doch grausam!

    Ich schätze mal, du wirst da was mit onFocus machen müssen, aber wie gesagt, JavaScript ist nicht meine Welt.

  • Das ist in vielen vBulletin Foren so.
    Und ich finde das überhaupt nicht User unfreundlich.
    Man klickt auf den Namen und das Dropdownmenü öffnet sich.
    Dann klickt man nochmal auf den Namen oder irgendwo anders hin und das Dropdownmenü schließt sich wieder.

    Ich mein das ist mit Windows nicht anders:
    Drückst du auf Start, öffnet sich ein "Dropdownmenü".
    Klickst du nochmal auf Start oder irgendwo auf den Desktop, schließt sich das Start Menü wieder.

  • Der Trick liegt darin einen Listener zu schreiben, der auf die gesamte Seite bezogen ist, etwa:

    Code
    $('body').bind( "click", function() {
      // schließe offene Menüs
    });

    ... da es eben kein Gegenteil von klicken gibt - kein unclick oder so :P

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • naja das is bei deinem fertigen script nicht soo einfach zu machen, du brauchst jetzt zusätzlich etwas, das zeigt welches element aktiv ist...

    mal ein auszug aus deinem script:

    du hast hover durch click ersetzt, also ist das, was im callback steht deine schliessen-funktion

    Code
    ,
                    function(e){
                        $(this).children("ul:eq(0)").fadeOut(jquerycssmenu.fadesettings.outduration)
                    }


    der callback wird durch das komma (ich habs mal mitkopiert) in der hover-function gekennzeichnet (ne funktion nach nem komma ist nahezu immer die callback-funktion)

    da in der ganzen faxe mit $(this) auf das aktuelle element referenziert wird, brauchst du nun einen identifier sagen wir mal ein klassenname der muss in der click-action gesetzt werden.

    zB so

    Code
    $targetul.addClass('js_myActiveMenu');

    und dann nimmste mal die callback-funktion aus dem click raus, denn so müsste eigentlich das menu wieder zu sein bevor du es wirklich offen gesehen hast :)

    und haust die in eine eigene funktion rain, wie der teron oben bereits beschrieben hatte.

    Code
    $(document).bind( "click", function() {
    function(e){          $('.js_myActiveMenu').fadeOut(jquerycssmenu.fadesettings.outduration)
            }  });

    du solltest hier nur noch sicherstellen, dass die parameter:

    jquerycssmenu.fadesettings.outduration

    auch in dieser funktion verfügbar sind oder einfach eigene setzen ;)

    das ganze gescripte von mir hier oben ist UNGETESTET und soll dir nur den way to go zeigen

  • Also sollte der Code dann so ausehen oder?

    Ich habe ausserdem das Problem, dass ich den

    Code
    <div id="myjquerymenu" class="jquerycssmenu">

    Eintrag mehrmals auf der Seite brauche, er aber nur bei dem ersten Dropdown Menü funktioniert. Beiden anderen nicht. Kann es sein, dass so ein "id=..." nur einmal vorkommen darf?

    Wie kann ich das so ändern, dass es auch mehrmals funktioniert?

    Vielen Dank
    the_zoker_09

    Einmal editiert, zuletzt von the_zoker_09 (14. Oktober 2011 um 13:05)

  • Grundlagen...
    Wenn du schreibst

    Code
    $("#myjquerymenu").menu(...);


    Dann wird WAS angesprochen?
    Richtig, das Element mit der ID myjquerymenu, welches wie oft existieren darf?
    Daraus folgt:

    Code
    $(".jquerycssmenu").bind();

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Denk nochmal nach. ID ganz heisst "Identdifier" zu deutsch "Indentifikation". Der Personalausweis auf Englsich heisst auch "ID".
    IDs in HTML dürfen deshalb nur einmal im gesammten dokument vergeben werden. Wenn du also mehrmals

    HTML
    <div id="myjqeruymenu" class="jquerycssmenu"></div>


    in deinem Quelltext hast, findet der browser nur eins, denn:

    Code
    $("#myjquerymenu") == $(document.getElementById("myjqerymenu"));

    Aber du hast noch etwas anderes, was beliebig oft verwendet werden darf - Klassen. Und die werden per CSS mit einem . angesprochen, z.B.

    Code
    .jquerycssmenu {
    }


    im CSS spricht alle divs mit der Klasse "jquerycssmenu" an. Muss ich noch mehr sagen?

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Nein. Du sollst

    Code
    $("#myjquerymenu").menu(...);


    in

    Code
    $(".jquerycssmenu").menu(...);


    ändern.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Eigentlich meinte ich diese Zeile:

    Code
    jquerycssmenu.buildmenu("myjquerymenu", arrowimages);


    Bei einem Blick in den Code ist mir aber aufgefallen, dass dein Skript ja nach der ID fragt. Hab das ganze jetzt geändert. Benutz dashier

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Ok vielen Dank.

    Das mit dem mehrmals öffnen funktioniert.

    Und wie kann ich das jetzt noch ändern, dass man das Dropdownmenü auch wieder schließen kann?

    Und zwar:

    • Wenn man wieder auf den Link klickt
    • Wenn man irgendwo anders hinklickt (also weder auf den Link, weil dann gehts ja über 1. noch auf einen Eintrag in dem Dropdownmenü, weil dann soll es sich ja nicht schliessen)

    Vielen Dank
    the_zoker_09

  • Wenn du es geschafft hast, "mouseover" durch "klick" zu ersetzen, kannst du das auch. Setz dich mit JS auseinander, dann klappt das.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Benutz schon click. Was dir helfen wird ist das Stichwort "event-bubbling", darunter die Eigenschaft event.cancelBubble.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!