Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][jQuery] Problem z dynamicznym rozwijaniem treści
Forum PHP.pl > Forum > Przedszkole
seniu123
Witam,

mam problem z rozwijanymi treściami. Problem polega na tym że gdy mam wyświetlone powyżej jednej wiadomości to mogę jedynie pierwszą rozwinąć. Z innymi nie da się nic zrobić.

Oto mój kod dla dwóch wiadomości:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  4. <title>Cos</title>
  5. <script type="text/javascript" src="jquery.js"></script>
  6. <script type="text/javascript">
  7. $(function()
  8. {
  9.  
  10. $("#mostrar").click(function(event) {
  11. event.preventDefault();
  12. $("#caja").slideToggle();
  13. });
  14.  
  15. $("#caja .close").click(function(event) {
  16. event.preventDefault();
  17. $("#caja").slideUp();
  18. });
  19. });
  20. <style type="text/css">
  21. body {
  22. font-family: Verdana, Arial, Helvetica, sans-serif;
  23. font-size: 11px;
  24. color: #666666;
  25. }
  26. a{color:#993300; text-decoration:none;}
  27. #caja {
  28. width:70%;
  29. display: none;
  30. padding:5px;
  31. border:2px solid #FADDA9;
  32. background-color:#FDF4E1;
  33. }
  34. #mostrar{
  35. display:block;
  36. width:70%;
  37. padding:5px;
  38. border:2px solid #D0E8F4;
  39. background-color:#ECF8FD;
  40. }
  41. </head>
  42. <a href="#" id="mostrar">Wiadmosc 1</a>
  43.  
  44. <div id="caja">
  45. <a href="#" class="close">[x]</a>
  46. <p>bla bla ba</p>
  47. </div>
  48.  
  49. <a href="#" id="mostrar">Wiadomosc 2</a>
  50.  
  51. <div id="caja">
  52. <a href="#" class="close">[x]</a>
  53. <p>bla bla bla</p>
  54. </div>
  55. </body>
  56. </html>


Z góry dzięki za pomoc smile.gif
tomm
masz dla kilku elementów to samo ID? użyj klasy i this
mortus
tomm ma rację, ale postaram się bardziej rozjaśnić. Specyfikacja W3C dotycząca języka (X)HTML mówi, że w dokumencie może istnieć tylko jeden element o danym identyfikatorze (id). Jeżeli będziemy mieć tych elementów więcej, to JavaScript i tak wybierze pierwszy, ponieważ pozostałe dla JS nie istnieją. Rozwiązaniem problemu jest wykorzystanie klas, dla elementów, które mają się powtarzać i wyglądać tak samo.
seniu123
Po zastosowaniu class teraz otwierają się wszystkie naraz. A co teraz zrobić żeby otwierały się pojedynczo? Z góry dzięki za pomoc smile.gif

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  4. <title>Cos</title>
  5. <script type="text/javascript" src="jquery.js"></script>
  6. <script type="text/javascript">
  7. $(function()
  8. {
  9.  
  10. $(".mostrar").click(function(event) {
  11. event.preventDefault();
  12. $(".caja").slideToggle();
  13. });
  14.  
  15. $(".caja .close").click(function(event) {
  16. event.preventDefault();
  17. $(".caja").slideUp();
  18. });
  19. });
  20. <style type="text/css">
  21. body {
  22. font-family: Verdana, Arial, Helvetica, sans-serif;
  23. font-size: 11px;
  24. color: #666666;
  25. }
  26. a{color:#993300; text-decoration:none;}
  27. .caja {
  28. width:70%;
  29. display: none;
  30. padding:5px;
  31. border:2px solid #FADDA9;
  32. background-color:#FDF4E1;
  33. }
  34. .mostrar{
  35. display:block;
  36. width:70%;
  37. padding:5px;
  38. border:2px solid #D0E8F4;
  39. background-color:#ECF8FD;
  40. }
  41. </head>
  42. <a href="#" class="mostrar">Wiadmosc 1</a>
  43.  
  44. <div class="caja">
  45. <a href="#" class="close">[x]</a>
  46. <p>bla bla ba</p>
  47. </div>
  48.  
  49. <a href="#" class="mostrar">Wiadomosc 2</a>
  50.  
  51. <div class="caja">
  52. <a href="#" class="close">[x]</a>
  53. <p>bla bla bla</p>
  54. </div>
  55. </body>
  56. </html>
thek
Ja bym zamiast bawić się w kilka klas z wszystkim zrobił jedną na clicku i użył this by pokazać o jaki konkretnie element chodzi.
mortus
Cytat(thek @ 6.04.2010, 13:39:34 ) *
Ja bym zamiast bawić się w kilka klas z wszystkim zrobił jedną na clicku i użył this by pokazać o jaki konkretnie element chodzi.

To właśnie trzeba zrobić. Zastępujesz $(".caja") w linii 13 i 18 tym $(this + " .caja")
seniu123
po zamianie na $(this + " .caja") to teraz nic się nie otwiera
mortus
Sorki, miałem w głowie jeszcze inny kod. Tak to rzeczywiście nie zadziała. Trzeba trochę inaczej to zorganizować.
  1. <div class="klasa">
  2. <a href="#" class="mostrar">Wiadmosc 1</a>
  3. <div class="caja">
  4. <a href="#" class="close">[x]</a>
  5. <p>bla bla ba</p>
  6. </div>
  7. </div>
i do tego wspomniane linie:
Kod
$($(this).parent() + " .caja")
Powinno działać.
seniu123
czy mógłbyś to wstawić w ten mój kod, bo jak ja wstawiam to coś mi nie działa to co podałeś winksmiley.jpg Jak trzeba zdefiniować tą nową klase "klasa" żeby wszystko działało?

Kod teraz wygląda następująco:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  4. <title>Cos</title>
  5. <script type="text/javascript" src="jquery.js"></script>
  6. <script type="text/javascript">
  7. $(function()
  8. {
  9.  
  10. $(".mostrar").click(function(event) {
  11. event.preventDefault();
  12. $($(this).parent() + " .caja").slideToggle();
  13. });
  14.  
  15. $(".caja .close").click(function(event) {
  16. event.preventDefault();
  17. $($(this).parent() + " .caja").slideUp();
  18. });
  19. });
  20. <style type="text/css">
  21. body {
  22. font-family: Verdana, Arial, Helvetica, sans-serif;
  23. font-size: 11px;
  24. color: #666666;
  25. }
  26. a{color:#993300; text-decoration:none;}
  27. .caja {
  28. width:70%;
  29. display: none;
  30. padding:5px;
  31. border:2px solid #FADDA9;
  32. background-color:#FDF4E1;
  33. }
  34. .mostrar{
  35. display:block;
  36. width:70%;
  37. padding:5px;
  38. border:2px solid #D0E8F4;
  39. background-color:#ECF8FD;
  40. }
  41. </head>
  42. <div class="klasa">
  43. <a href="#" class="mostrar">Wiadmosc 1</a>
  44. <div class="caja">
  45. <a href="#" class="close">[x]</a>
  46. <p>bla bla ba</p>
  47. </div>
  48. </div>
  49. </body>
  50. </html>
mortus
Funkcja parent() działa jednak trochę inaczej, ale przy jej pomocy możemy uzyskać właściwy efekt. Kod:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  5. <title>Cos</title>
  6. <script type="text/javascript" src="jquery.js">
  7. </script>
  8. <script type="text/javascript">
  9. $(function(){
  10. $(".mostrar").click(function(event){
  11. event.preventDefault();
  12. $(this).parent().find(".caja").slideToggle();
  13. });
  14. $(".caja .close").click(function(event){
  15. event.preventDefault();
  16. $($(this).parent(".caja")).slideUp();
  17. });
  18. });
  19. </script>
  20. <style type="text/css">
  21. body {
  22. font-family: Verdana, Arial, Helvetica, sans-serif;
  23. font-size: 11px;
  24. color: #666666;
  25. }
  26.  
  27. a {
  28. color: #993300;
  29. text-decoration: none;
  30. }
  31.  
  32. .caja {
  33. width: 70%;
  34. display: none;
  35. padding: 5px;
  36. border: 2px solid #FADDA9;
  37. background-color: #FDF4E1;
  38. }
  39.  
  40. .mostrar {
  41. display: block;
  42. width: 70%;
  43. padding: 5px;
  44. border: 2px solid #D0E8F4;
  45. background-color: #ECF8FD;
  46. }
  47. </style>
  48. </head>
  49. <body>
  50. <div class="klasa">
  51. <a href="#" class="mostrar">Wiadmosc 1</a>
  52. <div class="caja">
  53. <a href="#" class="close">[x]</a>
  54. <p>
  55. bla bla ba
  56. </p>
  57. </div>
  58. </div>
  59. <div class="klasa">
  60. <a href="#" class="mostrar">Wiadomosc 2</a>
  61. <div class="caja">
  62. <a href="#" class="close">[x]</a>
  63. <p>
  64. bla bla bla
  65. </p>
  66. </div>
  67. </div>
  68. </body>
  69. </html>
EDIT:
klasa jest wykorzystywana tylko do nadania odpowiedniego formatowania elementu div i w sumie nie musi jej być.
seniu123
mortus Wielkie dzięki za pomoc! smile.gif Wszystko działa winksmiley.jpg

Mam jeszcze jedno pytanie winksmiley.jpg
Co zrobić żeby jak otworzy się jedna wiadomość i kliknię się w drugą żeby pierwsza się zamkneła? winksmiley.jpg
mortus
Kod
                $(".mostrar").click(function(event){
                    event.preventDefault();
                    if (!$(this).parent().find(".caja").hasClass("active")) {
                        $(".active").slideUp();
                        $(".active").removeClass("active");
                    }
                    $(this).parent().find(".caja").addClass("active");
                    $(this).parent().find(".caja").slideToggle();
                });
seniu123
Znowu jest problem....

Po przekształceniu kodu na php pojawił się problem rozsuwaniem tych wiadomości... Gdy jest parzysta liczba to nie otwierają się (tzn. otworzą się i zamkną), a gdy jest nie parzysta liczba wiadomości to otworzą się (tzn. kilka razy dana wiadomość otworzy się i zamknie). Nie mam zielonego pojęcia co robić żeby normalnie się otwierały i zamykały...


Oto część mojego kodu:

  1. if(mysql_num_rows($wynik) > 0) {
  2. /* jeżeli wynik jest pozytywny, to wyświetlamy dane */
  3. $roz = "<script type='text/javascript'>
  4. $(function(){
  5. $('.mostrar').click(function(event){
  6. event.preventDefault();
  7. if (!$(this).parent().find('.caja').hasClass('active')) {
  8. $('.active').slideUp();
  9. $('.active').removeClass('active');
  10. }
  11. $(this).parent().find('.caja').addClass('active');
  12. $(this).parent().find('.caja').slideToggle();
  13. });
  14.  
  15.  
  16. });
  17. </script>";
  18.  
  19. echo"<script type='text/javascript' src='jquery.js'>
  20. </script>";
  21. echo "<style type='text/css'>
  22. body {
  23. font-family: Verdana, Arial, Helvetica, sans-serif;
  24. font-size: 11px;
  25. color: #666666;
  26. }
  27.  
  28. a {
  29. color: #993300;
  30. text-decoration: none;
  31. }
  32.  
  33. .caja {
  34. width: 70%;
  35. display: none;
  36. padding: 5px;
  37. border: 2px solid #FADDA9;
  38. background-color: #FDF4E1;
  39. }
  40.  
  41. .mostrar {
  42. display: block;
  43. width: 70%;
  44. padding: 5px;
  45. border: 2px solid #D0E8F4;
  46. background-color: #ECF8FD;
  47. }
  48. </style>";
  49. while($r = mysql_fetch_assoc($wynik)) {
  50.  
  51.  
  52. echo "$roz";
  53.  
  54. $obrazek1 = "<script language='JavaScript' src='muza/audio-player.js'></script>
  55. <object type='application/x-shockwave-flash' data='muza/player.swf' id='audioplayer1' height='24' width='290'>
  56. <param name='movie' value='muza/player.swf'>
  57. <param name='FlashVars' value='playerID=audioplayer1&soundFile=".$r['numer'].">
  58. <param name='quality' value='high'>
  59. <param name='menu' value='false'>
  60. <param name='wmode' value='transparent'>
  61. </object>";
  62. echo "<div class='klasa'>";
  63. echo "<a href='#' class='mostrar'>".$r['nazwa']."</a>";
  64. echo "<div class='caja'><p>".$r['nazwa']."</p><br>$obrazek1</div>";
  65. echo "</div>";
  66. }
  67.  
  68. }
  69.  


Zauważyłem jeszcze że ten div wysuwa się i wsuwa w zależności od ilości wyświetlanych wiadomości. np. Gdy jest 6 wiadomości to zrobi 3 razy cały cykl (rozwinie się i zwinie).
mortus
Źle to robisz. Zauważ, że kilka razy w pętli while umieszczasz skrypt, zarówno ten do rozwijania div-ów, jak i jakiś audio-plajer.js. Prawidłowo powinno to wyglądać tak
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  5. <title>Cos</title>
  6. <script type="text/javascript" src="jquery.js">
  7. </script>
  8. <script type="text/javascript" src='muza/audio-player.js'>
  9. </script>
  10. <script type="text/javascript">
  11. $(function(){
  12. $(".mostrar").click(function(event){
  13. event.preventDefault();
  14. if (!$(this).parent().find(".caja").hasClass("active")) {
  15. $(".active").slideUp();
  16. $(".active").removeClass("active");
  17. }
  18. $(this).parent().find(".caja").addClass("active");
  19. $(this).parent().find(".caja").slideToggle();
  20. });
  21. $(".caja .close").click(function(event){
  22. event.preventDefault();
  23. $($(this).parent(".caja")).slideUp();
  24. });
  25. });
  26. </script>
  27. <style type="text/css">
  28. body {
  29. font-family: Verdana, Arial, Helvetica, sans-serif;
  30. font-size: 11px;
  31. color: #666666;
  32. }
  33.  
  34. a {
  35. color: #993300;
  36. text-decoration: none;
  37. }
  38.  
  39. .caja {
  40. width: 70%;
  41. display: none;
  42. padding: 5px;
  43. border: 2px solid #FADDA9;
  44. background-color: #FDF4E1;
  45. }
  46.  
  47. .mostrar {
  48. display: block;
  49. width: 70%;
  50. padding: 5px;
  51. border: 2px solid #D0E8F4;
  52. background-color: #ECF8FD;
  53. }
  54. </style>
  55. </head>
  56. <body>
  57. <?php
  58. // ustanawiamy połączenie z serwerem baz danych
  59. $connectionLink = mysql_connect('localhost', 'username', 'password');
  60. // wybieramy bazę danych
  61. $selectedDatabase = mysql_select_db('database');
  62. // budujemy zapytanie
  63. $query = "SELECT * FROM tabela";
  64. // wykonujemy zapytanie
  65. $result = mysql_query($query) or die('Błąd zapytania: '.mysql_error());
  66. if (mysql_num_rows($result) > 0) {
  67. while ($row = mysql_fetch_array($result)) {
  68. ?>
  69. <div class="klasa">
  70. <a href="#" class="mostrar"><?php echo $row['nazwa']; ?></a>
  71. <div class="caja">
  72. <a href="#" class="close">[x]</a>
  73. <p>
  74. <?php echo $row['nazwa']; ?>
  75. </p>
  76. <br/>
  77. <object type="application/x-shockwave-flash" data="muza/player.swf" id="audioplayer1" height="24" width="290">
  78. <param name="movie" value="muza/player.swf">
  79. <param name="FlashVars" value="playerID=audioplayer1&soundFile=<?php echo $row['numer']; ?>">
  80. <param name="quality" value="high">
  81. <param name="menu" value="false">
  82. <param name="wmode" value="transparent">
  83. </object>
  84. </div>
  85. </div>
  86. <?php
  87. }
  88. }
  89. ?>
  90. </body>
  91. </html>
Jeśli sama treść znajduje się w innym pliku niż layout strony, to nie ma to mniejszego znaczenia. Skrypty js umieszczamy wtedy pomiędzy znacznikami <head> i </head> w pliku z layoutem, a treść możemy dołączać za pomocą include.
seniu123
Dzięki!!!! Wszystko działa teraz w najlepszym porządku smile.gif
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.