Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] wyświetlanie divów
Forum PHP.pl > Forum > XML, AJAX
zonkerman
Witam

Mam takie coś:
  1. <li id="wiz">
  2. <div id="glowne">Tutaj główne opcje</div>
  3. <div id="wiecej">Tutaj dodatkowe info</div>
  4. <div id="opcje"><a id="pokazwiecej" href="#">Więcej</a></div>
  5. </li>


I tutaj mam fragment jQuery:
Kod
$("ol#wizytowka div#wiecej").hide();

$("a#pokazwiecej").click(function(){
        $(this).prev("div#wiecej").slideToggle(500)
        return false;
           });


I nie działa mi to. Czego oczekuję:
Na początku po wczytaniu wszystkie divy#wiecej są niewidoczne (to działa). Teraz chcę, aby po kliknięciu na więcej chcę aby div#wiecej pokazywał się lub chował, ale do poszczególnego <li>. I nie wiem jak to zrobić sad.gif
kreciko
Musisz wiedzieć, że na stronie nie może być kilku znaczników z tym samym id. Więc chyba zamiast id="więcej" powinieneś użyć class="więcej". To się tyczy znacznika li i div w Twoim przypadku. A jak to rozwiązać? musisz pokombinować.
zonkerman
Czemu nie może być? Wtedy tylko rozdzielasz wpisując w uchwytach np a#wiecej ; p#wiecej itd. Zależy co chcesz wziąć. Kombinuje cały czas. Bo jeśli nie mam tego diva#opcje , to wtedy działa. Więc jakoś jego muszę przeskoczyć.
kreciko
Tu masz dlaczego: http://www.w3.org/TR/xhtml1/#h-4.10
Tak jest w specyfikacji. I jeżeli się odwołujesz do elementu o id=wiecej, to silnik javascripta nie wie, czasami się odwoła do jednego, czasami do drugiego, czasami do obu, a czasami nie zadziała, zależy jaka przeglądarka(jaki silnik). Ja bym to zrobił tak: "$("li#wiz").next("div#wiecej").toggle()"
zonkerman
Akurat u mnie nie ma kliku id. Chyba, że chodzi Ci o to, że np mam kilka wyświetlonych li. Ale może być kilka choćby dlatego (punkt 7):
http://www.webdesignerwall.com/tutorials/j...-for-designers/
Jak będzie trzeba to pominę tego <div id="opcje"> ale jednak wolałbym, aby on był. A Twój sposób jakoś nie bardzo chce działać.
kreciko
Piszesz to w php, czy w html? Mógłbyś podać kontekst w którym to masz? Spróbuj swoją stronę zwalidować.
zonkerman
W php. Tutaj jest fragment kodu (pętla w php):

  1. <ol id="wizyt">
  2. <?php
  3. (zapytanie MySQL i trochę php)
  4. while($wynik = mysql_fetch_assoc($zapyt))
  5. { ?>
  6.  
  7. <li id="wiz">
  8. <div id="glowne">Tutaj główne opcje</div>
  9. <div id="wiecej">A tutaj dodatkowe</div>
  10. <a id="pokazwiecej" href="#">Więcej</a>
  11. </li>
  12.  
  13. <?php } i trochę skryptu php ?>
  14. </ol>

A tutaj jQuery:
Kod
$(document).ready(
    function()
    {
        $("ol#wizyt div#wiecej").hide();
        
        $("a#pokazwiecej").click(function(){
        $(this).prev("div#wiecej").slideToggle(500);        
        return false;
           });
    });


Teraz akurat nie mam możliwości zrobić walidacji, bo nie mam stronki na serwerze, tylko piszę ją lokalnie. ale może tego nie trzeba robić.
kreciko
Ja bym sobie to zprametryzował ten kod html.


Jak masz zapytanie do mysql, to pewnie zwraca Ci jakąś unikatową wartość, np. id, albo hash
  1. <ol id="wizyt">
  2. <?php
  3. (zapytanie MySQL i trochę php)
  4. while($wynik = mysql_fetch_assoc($zapyt))
  5. { ?>
  6.  
  7. <li id="<?php echo $wynik['id']; ?>">
  8. <div id="glowne">Tutaj główne opcje</div>
  9. <div id="<?php echo "d".$wynik['id'];?>">A tutaj dodatkowe</div>
  10. <a class="pokazwiecej" id="<?php echo "a"$wynik['id']?>" href="#">Więcej</a>
  11. </li>
  12.  
  13. <?php } i trochę skryptu php ?>
  14. </ol>
  15.  


a w jQuery tak:
  1. $("a.pokazwiecej").click(function(){
  2. var id = $(this).attr("id").
  3. $("div#d".id).toggle();
  4. });
zonkerman
Akurat tego nie chcę parametryzować smile.gif To ma być stałe, dopiero dane w div'ach będą wyświetlały dane z bazy. Więc chcę, aby to wyglądało tak:
  1. <ol id="wizyt">
  2. <?php
  3. (zapytanie MySQL i trochę php)
  4. while($wynik = mysql_fetch_assoc($zapyt))
  5. { ?>
  6.  
  7. <li id="wiz">
  8. <div id="glowne">Tutaj główne dane pobrane z bazy</div>
  9. <div id="wiecej">Tutaj dodatkowe dane pobrane z bazy</div>
  10. <div id="opcje"><a id="pokazwiecej" href="#">Więcej</a></div>
  11. </li>
  12.  
  13. <?php } i trochę skryptu php ?>
  14. </ol>


Dlatego chcę, aby był ten div#opcje ,to w stylach chcę go sobie odpowiednio poformatować. Próbowałem nawet coś kombinować w prevUntil, ale też mi to nie chciało działać.
kreciko
Sprawdziłbym jeszcze konsole błędów. Albo zrobiłbym, tak:

Zamiast tego:

  1. $(this).prev("div#wiecej").slideToggle(500);


Dałbym to:

  1. $(this).prev().prev().slideToggle(500);


ewentualnie napisać, tak jak jest tutaj:
http://api.jquery.com/prev/ - pierwszy przykład, obczaj kod.
zonkerman
Jeśli mam:
  1. <li id="wiz">
  2. <div id="glowne">Tutaj główne opcje</div>
  3. <div id="wiecej">Tutaj dodatkowe opcje</div>
  4. <a id="pokazwiecej" href="#">Więcej</a>
  5. </li>

I w skrypcie napiszę:
  1. $(this).prev().prev().slideToggle(500);

To chowa mi div#glowne.

A jeśli mam:
  1. <li id="wiz">
  2. <div id="glowne">Tutaj główne opcje</div>
  3. <div id="wiecej">Tutaj dodatkowe opcje</div>
  4. <div id="opcje"><a id="pokazwiecej" href="#">Więcej</a></div>
  5. </li>


To nic się nie dzieje. Konsola błędów nic nie pokazuje. Nawet jak robię różne kombinacje do tego prev() tzn wpisuje tam różne div'y to i tak nie działa :/ Przykład działa, nawet na 2 .prev() , ale do swojego nie mogę użyć :/

Sposób z id też nie działa.
#luq
Nie rozumiem dlaczego nie słuchasz ludzi którzy starają Ci pomóc. Musisz mieć unikalne id, taka jest idea całego atrybutu id, bo jeśli by tak nie było to czym by się różniło od atrybutu class? Zresztą atrybut id jako pole z bazy to jest marny pomysł.

Ja bym nie krył za pomocą JS`a bo jeśli nie zostanie wczytane całe drzewko DOM to ten tekst będzie widoczny co sprawi przy wolniejszych łączach efekt takiego niefajnego mrugnięcia/zniknięcia...

Nie używaj taga <a/> jeśli nie jest to link. To kłóci się z tym co ma reprezentować ten znacznik.

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <head>
  3. <title>Disable</title>
  4. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  5. <script type="text/javascript" src="./js/jquery.js"></script>
  6.  
  7. <script type="text/javascript">
  8. $(document).ready(function(){
  9. $( '#wizyt li div.opcje' ).click(function(){
  10. $(this).prev().toggle();
  11. });
  12. });
  13. </script>
  14.  
  15. <style type="text/css">
  16. #wizyt li div.wiecej { display: none; }
  17. #wizyt li div.opcje { cursor: pointer; }
  18. </style>
  19.  
  20. </head>
  21.  
  22. <ol id="wizyt">
  23. <li>
  24. <div class="glowne">Tutaj główne dane pobrane z bazy</div>
  25. <div class="wiecej">Tutaj dodatkowe dane pobrane z bazy</div>
  26. <div class="opcje">Więcej</div>
  27. </li>
  28. <li>
  29. <div class="glowne">Tutaj główne dane pobrane z bazy</div>
  30. <div class="wiecej">Tutaj dodatkowe dane pobrane z bazy</div>
  31. <div class="opcje">Więcej</div>
  32. </li>
  33. </ol>
  34.  
  35. </body>
  36. </html>
zonkerman
Dzięki smile.gif To działa. Musze tylko przerobić parę rzeczy pod siebie. Wielki dzięki.

==EDIT==
Tylko 1 problem. Jak mam w tym div#opcje linki <a> to wtedy każdy mi otwiera tego diva#wiecej . Wiec jak zrobić, aby tylko na przycisk Więcej reagował?
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.