Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zmiana klasy elementu
Włodzimierz
post 30.11.2013, 20:43:08
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 30.11.2013

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
com
post 30.11.2013, 21:09:08
Post #2





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


http://www.w3schools.com/jsref/met_namedno...etnameditem.asp
Go to the top of the page
+Quote Post
Włodzimierz
post 30.11.2013, 21:20:34
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 30.11.2013

Ostrzeżenie: (0%)
-----


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)?

Ten post edytował Włodzimierz 30.11.2013, 21:20:59
Go to the top of the page
+Quote Post
Crozin
post 30.11.2013, 21:24:39
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Crozin 30.11.2013, 21:25:13
Go to the top of the page
+Quote Post
Włodzimierz
post 30.11.2013, 21:34:23
Post #5





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 30.11.2013

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
com
post 30.11.2013, 21:38:39
Post #6





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


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


Ten post edytował com 30.11.2013, 21:38:53
Go to the top of the page
+Quote Post
Crozin
post 30.11.2013, 21:48:04
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Crozin 30.11.2013, 21:52:54
Go to the top of the page
+Quote Post
com
post 30.11.2013, 21:56:03
Post #8





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


@up zgadzam się, ale ta średnia krajowa na sierpień 2010 to mnie rozbroiła laugh.gif

Ten post edytował com 30.11.2013, 21:56:17
Go to the top of the page
+Quote Post
Włodzimierz
post 1.12.2013, 13:07:26
Post #9





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 30.11.2013

Ostrzeżenie: (0%)
-----


@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.
Go to the top of the page
+Quote Post
PrinceOfPersia
post 1.12.2013, 13:49:10
Post #10





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


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)

Ten post edytował PrinceOfPersia 1.12.2013, 13:55:51


--------------------
Go to the top of the page
+Quote Post
Włodzimierz
post 1.12.2013, 14:17:24
Post #11





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 30.11.2013

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Włodzimierz 1.12.2013, 14:23:45
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 15.05.2025 - 09:42