Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana klasy elementu
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Włodzimierz
Witam.
Tworzę stronę wizytówkę swojej małej firmy, i potrzebuję wykonać rozwijane menu po kliknięciu na element.
Moim celem jest wykorzystanie jak najkrótszego kodu, czyli importowanie biblioteki nie wchodzi w grę.

Mniej więcej chce uzyskać taki efekt:
  1. <button>Menu</button>
  2. <div id="zm" class="klasa1">Linki<div>

a po kliknięciu na button:
  1. <button>Menu</button>
  2. <div id="zm" class="klasa2">Linki</div>


Szukając po internecie natrafiłem na coś takiego:
  1. <!DOCTYPE html>
  2. function changeColor(newColor) {
  3. var elem = document.getElementById("para1");
  4. elem.style.color = newColor;
  5. }
  6. </script>
  7. </head>
  8. <p id="para1" style="color: red;">Some text here</p>
  9. <button onclick="changeColor('blue');">blue</button>
  10. <button onclick="changeColor('red');">red</button>
  11. </body>
  12. </html>


Powyższy kod działa, lecz jedynie zmienia kolor, i potrzebuje dwóch buttonów. Próbowałem go zmodyfikować, lecz nic z tego nie wychodziło.

Proszę o pomoc smile.gif Jeżeli będzie trzeba chętnie za jako taką pomoc zapłacę.
Pozdrawiam.
Włodzimierz
Dzięki działa, ale niestety w jedną stronę.
Co zrobić, by po ponownym kliknięciu na ten button przywrócił on poprzednią klasę (bym mógł zwinąć menu)?
Crozin
Cytat
Moim celem jest wykorzystanie jak najkrótszego kodu, czyli importowanie biblioteki nie wchodzi w grę.
Skąd taki dziwny cel?

[JAVASCRIPT] pobierz, plaintext
  1. (function(window) {
  2. "use strict";
  3.  
  4. var element = window.document.getElementById("divElement");
  5. var trigger = window.document.getElementById("buttonElement");
  6.  
  7. trigger.addEventListener("click", function() {
  8. element.className = (element.className === "klasa1" ? "klasa2" : "klasa1");
  9. }, false);
  10. })(window)
[JAVASCRIPT] pobierz, plaintext
Powyższy kod:
1. Nie zadziała na wszystkich przeglądarkach.
2. Nie poradzi sobie w przypadku, gdy element będzie miał jeszcze jakieś dodatkowe klasy.
Włodzimierz
Nie chcę importować biblioteki ze względu na czas ładowania strony (no może te 80kB to nie wiele, ale jednak wink.gif ), a nie umiem tego cachować.

Znalazłem pewien temat, gdzie opisane jest jak to zrobić w czystym JS, ale instrukcje w odpowiedziach są podzielone, i kompletnie nie wiem jak je złożyć w całość:
http://stackoverflow.com/questions/195951/...with-javascript

@Crozin również nie wiem jak użyć Twojego kodu.
com
up dodaj sobie spr czy wywołana została już funkcja np zrób to tak:
[JAVASCRIPT] pobierz, plaintext
  1. var t = 0;
  2. function myFunction()
  3. {
  4. if(t == 0){
  5. var h=document.getElementsByTagName("H1")[0];
  6. var typ=document.createAttribute("class");
  7. typ.nodeValue="democlass1";
  8. h.attributes.setNamedItem(typ);
  9. t = 1;
  10. }
  11. else
  12. {
  13. var h=document.getElementsByTagName("H1")[0];
  14. var typ=document.createAttribute("class");
  15. typ.nodeValue="democlass";
  16. h.attributes.setNamedItem(typ);
  17. t = 0;
  18. }
  19. }
[JAVASCRIPT] pobierz, plaintext
Crozin
Cytat
Nie chcę importować biblioteki ze względu na czas ładowania strony (no może te 80kB to nie wiele, ale jednak wink.gif ), a nie umiem tego cachować.
Serio... 80 KiB? Przecież pierwszy lepszy obrazek na stronie będzie tyle zajmować. Zresztą i tak jest to pobierane tylko raz. A jak podlinkujesz z CDN-a (jQuery'owski, Google'owski), bardzo prawdopodobne, że będzie to już zcacheowane w przeglądarce użytkownika nim w ogóle otworzy Twoją stronę.

Założyłem, że chodzi Ci o jQuery (80 KiB), a masz jeszcze całą masę innych bibliotek lżejszych pod względem objętości: http://en.wikipedia.org/wiki/Comparison_of...ript_frameworks

PS. Jeżeli uwzględnić poza minimalizacją kodu jego kompresję (gzip) będzie to zapewne 40 - 60 KiB danych jedynie przy pierwszym pobraniu. W porównaniu do średniej krajowej, która niby ma wynosić 24 mbps (http://cdn.infographicsarchive.com/wp-cont...d-and-costs.jpg) to na prawdę zerowe obciążenie.
com
@up zgadzam się, ale ta średnia krajowa na sierpień 2010 to mnie rozbroiła laugh.gif
Włodzimierz
@com eureka

@Crozin o tym, że jQuery jest cachowane automatycznie nie wiedziałem. W takim razie zmienia to moje podejście do sprawy- biblioteka jQ+ kilka linijek kodu będzie się szybciej wczytywać niż kilkanaście linijek w czystym JS smile.gif

------

Jednak chyba użyję czystego JS. Wyczytałem, że jQ trzeba umieć cachować.

Więc mam coś takiego:
  1. <!DOCTYPE html>
  2.  
  3. function myFunction()
  4. {
  5. var h=document.getElementsByTagName("H1")[0];
  6. var typ=document.createAttribute("class");
  7. typ.nodeValue="democlass";
  8. h.attributes.setNamedItem(typ);
  9. }
  10.  
  11. var t = 0;
  12. function myFunction()
  13. {
  14. if(t == 0){
  15. var h=document.getElementsByTagName("H1")[0];
  16. var typ=document.createAttribute("class");
  17. typ.nodeValue="democlass1";
  18. h.attributes.setNamedItem(typ);
  19. t = 1;
  20. }
  21. else
  22. {
  23. var h=document.getElementsByTagName("H1")[0];
  24. var typ=document.createAttribute("class");
  25. typ.nodeValue="democlass";
  26. h.attributes.setNamedItem(typ);
  27. t = 0;
  28. }
  29. }
  30.  
  31. <style>.democlass{display:none;} .democlass1{display:block;}</style>
  32. </head>
  33.  
  34. <h1 id="h1" class="democlass">Hello World</h1>
  35. <button onclick="myFunction()">Menu</button>
  36.  
  37. </body>
  38. </html>


Problem w tym, że skrypt szuka znaczników H1, a nie np. div'a z określonym ID. Próbowałem zamienić
  1. getElementsByTagName
na
  1. getElementById
, ale niestety nie działa.
PrinceOfPersia
Musi działać, pewnie nie umiesz tego używać wink.gif (wrzuć to, co ci nie działa)

Btw:
Cytat
var h=document.getElementsByTagName("H1")[0];
var typ=document.createAttribute("class");
(...)
var h=document.getElementsByTagName("H1")[0];
var typ=document.createAttribute("class");

Copy-paste programming nie jest zbyt dobra technika, duplikujesz kod niepotrzebnie pisząc 2razy to samo.. (Lepiej wywalić duplikatu i przenieść kod przed if'a

EDIT:

A do podmiany klasy używa sie zmiennej className, nie musisz tworzyć ręcznie żadnych atrybutów

Spróbuj tak:

document.getElementById('identyfikator-elementu').className = 'klasa1 klasa2 klasa3';
(Do className możesz przypisać kilka klas oddzielonych stacjami)
Włodzimierz
Nie wiem, czy Cię dobrze zrozumiałem (nie działa): [edit: działa zapomniałem zamknąć- "}", lecz jedynie dodaje klasę"klasa2" do class="", i działa w jedną stronę]
  1. <!DOCTYPE html>
  2.  
  3. function myFunction()
  4. {
  5. document.getElementById('nav').className = 'klasa1 klasa2';
  6. }
  7.  
  8. <style>.klasa1{display: none;} .klasa2{display: block;}</style>
  9. </head>
  10.  
  11. <div id="nav" class="klasa1">Linki</div>
  12. <button onclick="myFunction()">menu</button>
  13.  
  14. </body>
  15. </html>




Cytat
Musi działać, pewnie nie umiesz tego używać wink.gif (wrzuć to, co ci nie działa)

JS to dla mnie czarna magia wink.gif Kod który nie działa:
  1. <!DOCTYPE html>
  2.  
  3. function myFunction()
  4. {
  5. var h=document.getElementById("nav")[0];
  6. var typ=document.createAttribute("class");
  7. typ.nodeValue="democlass";
  8. h.attributes.setNamedItem(typ);
  9. }
  10.  
  11. var t = 0;
  12. function myFunction()
  13. {
  14. if(t == 0){
  15. var h=document.getElementById("nav")[0];
  16. var typ=document.createAttribute("class");
  17. typ.nodeValue="democlass1";
  18. h.attributes.setNamedItem(typ);
  19. t = 1;
  20. }
  21. else
  22. {
  23. var h=document.getElementById("nav")[0];
  24. var typ=document.createAttribute("class");
  25. typ.nodeValue="democlass";
  26. h.attributes.setNamedItem(typ);
  27. t = 0;
  28. }
  29. }
  30.  
  31. <style>.democlass{display: none;} .democlass1{display: block;}</style>
  32.  
  33. </head>
  34.  
  35. <div id="nav" class="democlass">Linki</div>
  36. <button onclick="myFunction()">menu</button>
  37.  
  38. </body>
  39. </html>



Cytat
Lepiej wywalić duplikatu i przenieść kod przed if'a

Nie bardzo wiem o co chodzi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.