[JS] zmiana zawartości diva (znika treść, a nie powinna)

0

Problem pewnie będzie banalny, ale zwyczajnie już nie wiem jak. A piszę, bo zdaję sobie sprawę, że ktoś, kto się zna, pomoże mi w 5 minut. Przynajmniej taką mam nadzieję...

http://xxx

co muszę dodać do skryptu, który mam na wyżej podanej stronie, aby przy kliknięciu w pierwszej lub drugiej kolumnie nie znikała treść w kolumnie następnej?

<script type="text/javascript"> 
function menu1(element) { 
 i = 0; 
 while (e = document.getElementById("m" + i++)) {
   e.style.display = "none";
 } 
 document.getElementById(element).style.display = "inline"; 
} 
menu1('m0');
 
function menu2(element) { 
 i = 5; 
 while (e = document.getElementById("m" + i++)) { 
   e.style.display = "none";
 } 
 document.getElementById(element).style.display = "inline"; 
} 
menu2('m5');
 
function menu3(element) { 
 i = 10; 
 while (e = document.getElementById("m" + i++)) { 
   e.style.display = "none";
 } 
 document.getElementById(element).style.display = "inline"; 
} 
menu3('m10');
</script>

Z góry dzięki za pomoc!

pozdrawiam

0

Obawiam się, że ten skrypt to w ogóle nadaje się na śmietnik :/.

Od razu widać, że totalnie przeczy podstawowej zasadzie rozsądnego programowania: DRY. Poza tym, może troszkę za sprytnie używa rzeczy typu użycie operatora przypisania w warunki pętli while, a do tego jeszcze inkrementacja indeksu w tym samym wyrażeniu. I na pewno nazwa argumentu element jest bardzo zła. To nie jest element (obiekt DOM), tylko ID elementu (String).

Czemu to nie działa? To oczywiste. Na początku każdej z funkcji ukrywasz wszystkie elementy w dokumencie, które mają ID z literą m oraz liczbą począwszy od pewnej wartości w górę. Czyli: od pewnej liczby, do końca. A Ty chyba chcesz tylko ukryć elementy z pewnego zakresu, prawda? Tzn. w przypadku drugiej kolumny elementy m5-m9, a nie m5-[do końca].

Skoro liczbę elementów w menu masz zakodowaną na stałe, to możesz też użyć tej liczby i iterować się przez elementy o ID w pewnym zakresie. Naturalniejsze byłoby tu użycie pętli for zamiast while.

Takie zakodowane na stałe menu byłoby jednak nieelastyczne (teraz też jest).

Rozumiem, że funkcja musi schować wszystkie elementy z danej sekcji oprócz jednego? Lepiej byłoby, żeby np. funkcja dla pierwszej kolumny pobierała wszystkie elementy p znajdujące się w #menu1, iterowała się przez nie i ukrywała je (tak naprawdę, to #menu1 powinno być tagiem

  • , a nie
, a poszczególne elementy , a nie

). Następnie pokazywany by był ten element do pokazania. Aha: i tam raczej nie powinno się zmieniać display na "inline", tylko na "block".

Powinieneś usunąć też duplikację. Zobacz, posiadasz trzy prawie takie same funkcje: menu1, menu2, menu3. Zamiast tego zrób jedną i daj tam dodatkowy parametr oznaczający numer kolumny. I wywołasz to nie menu1("m2"), tylko menu(1, m2). Wewnątrz funkcji możesz sobie obliczyć wartość i, mnożąc pierwszy parametr przez 5. Wiesz co? Ten parametr określający kolumnę w ogóle nie jest potrzebny. Wystarczy podać id elementu, który ma być pokazany. Do pozostałych można się łatwo dostać korzystając z metod i własności DOM. Jeśli masz element o id idElementu, to wszystkie elementy z danej kolumny możesz pobrać, wywołując document.getElementById(idElementu).parentNode.getElementsByTagName('p') (zdecydowanie należy rozbić to wyrażenie co najmniej na dwie instrukcje).

Co Ci mogę poradzić? Naucz się DOM i JavaScriptu, a jeśli ktoś ma to wszystko zrobić za Ciebie, to lepiej leć do działu Praca i daj za to jakieś rozsądne wynagrodzenie.

0

thx, dokładnie o coś takiego mi chodziło. żeby ktoś... naprowadził mnie na sposób myślenia js. jakkolwiek to brzmi :) ostatecznie i tak trzeba to opanować, a na teraz zastosuję jakieś inne rozwiązanie.

pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1