Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ JavaScript _ [jQuery] jak "złapać" najbliższy element w kontenerze z klasą?

Napisany przez: siutek 21.03.2018, 08:13:14

Witam, mam menu w postaci jak poniżej:

  1. <http://december.com/html/4/element/ul.html>
  2. <http://december.com/html/4/element/li.html><http://december.com/html/4/element/a.html>txt 1</http://december.com/html/4/element/a.html></http://december.com/html/4/element/li.html>
  3. <http://december.com/html/4/element/li.html class="menu-item-has-children">
  4. <http://december.com/html/4/element/a.html>posiada podmenu</http://december.com/html/4/element/a.html>
  5. <http://december.com/html/4/element/ul.html class="sub-menu">
  6. <http://december.com/html/4/element/li.html><http://december.com/html/4/element/a.html>txt 1</http://december.com/html/4/element/a.html></http://december.com/html/4/element/li.html>
  7. <http://december.com/html/4/element/li.html class="menu-item-has-children">
  8. <http://december.com/html/4/element/a.html>posiada podmenu</http://december.com/html/4/element/a.html>
  9. <http://december.com/html/4/element/ul.html class="sub-menu">
  10. <http://december.com/html/4/element/li.html><http://december.com/html/4/element/a.html>txt 1</http://december.com/html/4/element/a.html></http://december.com/html/4/element/li.html>
  11. <http://december.com/html/4/element/li.html><http://december.com/html/4/element/a.html>txt 2</http://december.com/html/4/element/a.html></http://december.com/html/4/element/li.html>
  12. <http://december.com/html/4/element/li.html><http://december.com/html/4/element/a.html>txt 3</http://december.com/html/4/element/a.html></http://december.com/html/4/element/li.html>
  13. </http://december.com/html/4/element/ul.html>
  14. </http://december.com/html/4/element/li.html>
  15. <http://december.com/html/4/element/li.html><http://december.com/html/4/element/a.html>txt 3</http://december.com/html/4/element/a.html></http://december.com/html/4/element/li.html>
  16. </http://december.com/html/4/element/ul.html>
  17. </http://december.com/html/4/element/li.html>
  18. <http://december.com/html/4/element/li.html><http://december.com/html/4/element/a.html href="">txt 3</http://december.com/html/4/element/a.html></http://december.com/html/4/element/li.html>
  19. <http://december.com/html/4/element/li.html class="menu-item-has-children">
  20. <http://december.com/html/4/element/a.html>posiada podmenu</http://december.com/html/4/element/a.html>
  21. <http://december.com/html/4/element/ul.html class="sub-menu">
  22. <http://december.com/html/4/element/li.html><http://december.com/html/4/element/a.html>txt 1</http://december.com/html/4/element/a.html></http://december.com/html/4/element/li.html>
  23. <http://december.com/html/4/element/li.html><http://december.com/html/4/element/a.html>txt 2</http://december.com/html/4/element/a.html></http://december.com/html/4/element/li.html>
  24. <http://december.com/html/4/element/li.html><http://december.com/html/4/element/a.html>txt 3</http://december.com/html/4/element/a.html></http://december.com/html/4/element/li.html>
  25. </http://december.com/html/4/element/ul.html>
  26. </http://december.com/html/4/element/li.html>
  27. </http://december.com/html/4/element/ul.html>


Kod jQuery:
  1. var $ = jQuery;
  2. $(function() {
  3. $( ".menu-item-has-children a" ).click(function() {
  4.  
  5. $( ".sub-menu", this ).next().toggle(200);
  6.  
  7. });
  8. });


oraz kod css:
  1. a {
  2. padding:20px;
  3. display:block;
  4. background-color:silver;
  5. width:100px;
  6. cursor: pointer;
  7. text-align: center;
  8. }
  9. li {
  10. margin: 15px 0;
  11. padding: 15px;
  12. background-color: grey;
  13. display: block;
  14. width:140px;
  15. }
  16. .sub-menu {
  17. display: none;
  18. }


Nie wiem jak sprawić by naciśnięcie odnośnika A, który znajduje się wewnątrz <li></li> z klasą .menu-item-has-child spowodowało pokazanie podmenu z klasą .sub-menu, które znajduje się w bezpośrednim sąsiedztwie, tak bym mógł otwierać kolejne zagnieżdzęnia.

Od razu uprzedzam dociekliwych: jestem noga z JS i jQuery :/ więc jeśli zobaczycie coś dziwnego w kodzie, to jest to wynik mojej niewiedzy.

Napisany przez: trueblue 21.03.2018, 08:23:15

Po prostu

  1. $(this).next()


Ale dlaczego używasz <a> do otwierania podmenu? Kliknięcie dodawaj bezpośrednio na <li> i również w nim zawrzyj tekst, który obecnie jest w linku.

Napisany przez: siutek 21.03.2018, 08:43:44

nie mogę na <li> dlatego, że mam menu wielopoziomowe. i ponowne kliknięcie w element o klasie .menu-item-has-child powoduje zwinięcie tego co przed chwilą rozwinąłem. Dlatego musiałem się ograniczyć do <a> który swym zasięgiem nie obejmuje kolejnych .sub-menu. Nie wiem czy dobrze wytłumaczyłem...

Jeśli któryś element <li> na najwyższym poziomie ma klasę .menu-item-has-children, to kliknięcie w niego powoduje rozwinięcie .submenu, które znajduje się w nim. I teraz, jeśli w tym submenu kolejny element <li> ma klasę .menu-item-has-children to chciałbym móc je rozwinąć, niestety klikając w niego klikam jednocześnie w cały <li> nadrzędny z pierwszego poziomu, co skutkuje owszem rozwinięciem tego co chce, ale jednocześnie zwijam element nadrzędny...

https://codepen.io/siutek/pen/EEWLRr

Napisany przez: trueblue 21.03.2018, 09:58:10

https://jsfiddle.net/0p7wm7s2/

Napisany przez: siutek 21.03.2018, 10:33:24

@trueblue usunąłeś linka <a>posiada podmenu</a>, a ja niestety nie mogę tak zrobić, gdyż wykonuję te wszystkie operacje na menu wygenerowanym przez wordpressa, w którym A będzie zawsze (bez większej rzeźby), bez względu na to czy ma podmenu czy nie.

Napisany przez: aras785 21.03.2018, 10:38:43

https://jsfiddle.net/0p7wm7s2/7/

lub

https://jsfiddle.net/0p7wm7s2/9/

Napisany przez: siutek 21.03.2018, 11:37:45

Cytat(aras785 @ 21.03.2018, 11:38:43 ) *
https://jsfiddle.net/0p7wm7s2/7/

lub

https://jsfiddle.net/0p7wm7s2/9/


pierwszy link! bingo!
działą elegancko smile.gif

dziękuję, kłaniam się nisko smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)