Navigation per Javascript OnClick-Event
| Autor | Nachricht |
|---|---|
|
Verfasst am: 18. 04. 2012 [10:51]
|
|
|
TheJoker
Themenersteller
Dabei seit: 04.01.2011
Beiträge: 31
|
Guten Tag allerseits Ich steh mal wieder total aufm Schlauch und verzweifle fast. Ich hab folgende Menüstruktur: HTML - 0
- 1
- 2
- 3
- 3.1
- 3.2
- 3.3
- 4
- 4.1
- 4.2
- 5
etc.Die Navigation beginnt erst im Layer 2, sprich "0" wird nicht angezeigt. Das Ziel ist es, dass man am Anfang nur die Punkte 1,2,3,4,5 sieht, aber per OnClick auf 3 die Elemente 3.1 -3.3 ein bzw. wieder ausblendet. Also eigentlich ein ganz einfachen JAVASCRIPT getElementById('xy').style.display=block;Mein Problem ist jetzt, ich krieg das im TS net gebacken. Es passiert eigentlich einfach gar nichts. Mein TS für die Navi(Basis, ohne irgendwelche Tests für die OnClick-Sache): TYPOSCRIPT subparts.navi = HMENU subparts.navi.entryLevel =1 subparts.navi { 1 = TMENU 1 { wrap = <ul class="menu">|</ul> expAll = 1 NO.wrapItemAndSub = <li class="nav">|</li> ACT < .NO ACT = 1 } # Zweite Ebene 2 = TMENU 2 { wrap = <ul class="subnav">|</ul> NO.allWrap = <li class="nav">|</li> } } Im CSS ist die Class subnav auf Display:none gestellt. Ich hab auch schon über "id={elementUid}" perobiert, allerdings schreibt er es mir so direkt als id="{elementUid}" innen Quellcode. Auch mit Dr. Google bin ich zu keinem Ergebis gekommen. Ich hoffe Ihr könnt mir weiterhelfen. lg Pascal mfg Pasal
|
|
Verfasst am: 18. 04. 2012 [23:35]
|
|
|
karlchen
Dabei seit: 19.10.2006
Beiträge: 1002
|
ich würde dir die Integration von jQuery empfehlen, damit macht sich der ganze JavaScript kram m einiges einfacher das folgende wäre dann z.B. ein Ausgangspunkt TYPOSCRIPT page.includeJSlibs.jquery = //ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js page.includeJSlibs.jquery{ external = 1 disableCompression = 1 excludeFromConcatenation = 1 } page.jsInline.10 = TEXT page.jsInline.10.value( $('document').ready(function(){ $('li.nav').on('click', function(e){ var subnav = $(this).find('ul.subnav'); if(subnav.length > 0){ e.preventDefault(); subnav.slideToggle(); } }); }); ) kurze Erläuterung: erst wird jQuery von einem google CDN geholt, so ist es schön klein superfix und eventuell bei deinem Besucher schon im browsercache, weil es andere Seite auch so einbinden. und dann binden wir unter page.jsInline.10 inline Javascript im Kopf der Seite ein und registrieren einen eventhandler beim click auf die li's mit der class nav, somit musst du nicht in jeden Link innerhalb eines li einen OnClick handler schreiben. "$('li.nav').on('click', function(){ ..." Danach suchen wir innerhalb des li-tags nach einem ul mit der class subnav und und wenn es wirklich eines gibt, dann soll es auf sliden bzw. nach einem zu sliden. Also in der Theorie sollte es funktionieren. Wenn du bei reinem Javascript bleiben willst, musst du den Links natürlich noch den Oncklick handler mitgeben und die Links dein UL muss auch noch die ID bekommenm damit du es mit getElementByID auch findest. [Dieser Beitrag wurde 2mal bearbeitet, zuletzt am 18.04.2012 um 23:37.] |
|
Verfasst am: 27. 04. 2012 [08:06]
|
|
|
TheJoker
Themenersteller
Dabei seit: 04.01.2011
Beiträge: 31
|
Wow besten Dank. Das ists. Bitte entschuldige, dass ich mich erst jetzt melde, aber ich war noch im Urlaub Daran, dass ganze per JQuery zu lösen hab ich gar nicht erst gedacht. Es funktioniert jetzt fast so, wie es sollte. Leider klappt es auch bei einem Klick auf die Subnav zu, aber das krieg ich selber hin, warscheinlich muss ich kurz die Klassen anpassen Besten dank und einen schönen Tag lg Pascal €dit: Ok so ganz Trivial ist das Problem scheinbar doch nicht. Das Problem ist, dass sobald die navigation geöffnet wird, bei einem Klick auf einen Untermenüpunkt der Effekt wieder getoggelt wird. Ich habe auch schon versucht den Toggle durch einen slideDown zu ersetzten, jedoch funktionieren auch so die Links nicht. Erst per Rechtsklick->Öffnen kann ich mir den Inhalt anzeigen lassen. Ich nehme an es ist, weil der Effekt auf den LI-Tag geht, und die Subnav ja ein Child-Element davon ist. Das OnClick Event wird demnach schon vom jQuery übernommen, auch wenn es dies gar nicht sollte. Kennt jemand dafür die Lösung? Danke LG Pascal [Dieser Beitrag wurde 1mal bearbeitet, zuletzt am 27.04.2012 um 16:28.] mfg Pasal
|
|
Verfasst am: 27. 04. 2012 [17:38]
|
|
|
TheJoker
Themenersteller
Dabei seit: 04.01.2011
Beiträge: 31
|
So ich hab das Problem gelöst. Für alle die auch mal vor dem gleichen Problem stehen: Der Toggleeffekt wird durch einen Klick auf einen <a> - Tag aufgerufen. HTML page.jsInline.10 = TEXT
page.jsInline.10.value(
$('document').ready(function(){
$("a"<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />.click(function(){
if($(this).next("ul.subnav"<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />.length > 0)
{
$(this).next("ul.subnav"<img src="typo3conf/ext/mm_forum//res/smilies/icon_wink.gif" alt="icon_wink.gif" />.slideToggle();
return false;
}
});
});
)Besten Dank und ein schönes Wochenende lg Pascal [Dieser Beitrag wurde 1mal bearbeitet, zuletzt am 27.04.2012 um 17:39.] mfg Pasal
|
|
Verfasst am: 30. 04. 2012 [10:10]
|
|
|
TheJoker
Themenersteller
Dabei seit: 04.01.2011
Beiträge: 31
|
Ein Kleiner Nachtrag meiner Seits: Ich hatte das Problem, dass die Navi nicht offen blieb, wenn eine Neue Seite geladen wurde. Dieses Problem habe ich nun nach etwa 4 Stunden endlich gelöst. Um euch die Ewige Sucherei zu ersparen hier das TS: TYPOSCRIPT [...] page.jsInline.10 = TEXT page.jsInline.10.value( $('document').ready(function(){ $( "ul.subnav" ).hide(); $(this).find('a.active').parent().parent().show(); $( "a" ).click(function(){ if($(this).next( "ul.subnav" ).length > 0) { $(this).next( "ul.subnav" ).slideToggle(); return false; } }); }); ) [...] subparts.navi = HMENU subparts.navi.entryLevel =1 subparts.navi { 1 = TMENU 1 { wrap = <ul class="menu active">|</ul> expAll = 1 NO.wrapItemAndSub = <li class="nav">|</li> NO.ATagParams = class = "topnav" ACT < .NO ACT = 1 #ACT.allWrap = <span class="active">|</span> #ACT.ATagParams = class="active" } # Zweite Ebene 2 = TMENU 2 { wrap = <ul class="subnav">|</ul> NO.allWrap = <li class="subnavLI">|</li> ACT < .NO ACT = 1 ACT.ATagParams = class="active" } } Ich weiss, es ist vielleicht nicht die Schöneste Methode, aber es Funktioniert In diesem Sinne Schönen Tag und ich hoffe ich kann damit jemanden viele Stunden arbeit ersparen lg Pascal Edit: Btw: Hier gibts nen Bug mit der Codeanzeige. Es werden Codefragmente durch smilies ersetzt [Dieser Beitrag wurde 2mal bearbeitet, zuletzt am 30.04.2012 um 10:15.] mfg Pasal
|



