Avatar billede newcoma Nybegynder
27. maj 2009 - 11:55 Der er 31 kommentarer og
1 løsning

jquery .next problem

Hej

Jeg har en masse rækker i en tabel med et linklayer-btn som skal vise en hidden tr når man klikker på det. Jeg har forsøgt med nedenstående script men det påvirker ikke tr med show-hide-layer. Hvad skal jeg gøre?

html

<tr><td>
<a class="layer-btn">testlink</a>       
</td>
<tr>
<tr class="show-hide-layer">
<td>
content
</td>
</tr>

javascript

function initMenu() {
  $('.show-hide-layer').hide();
  $('.layer-btn').click(
    function() {
        $(this).next()
.slideToggle('900', 'easeOutQuart'); 
      });
  }
$(document).ready(function() {initMenu();});
Avatar billede softspot Forsker
27. maj 2009 - 12:07 #1
Jeg vil tro det er fordi du skal have fat i

$(this).parents("tr").next()

i stedet for

$(this).next()
Avatar billede newcoma Nybegynder
27. maj 2009 - 12:41 #2
OK nu virker funktionen med $p(this).parents('tr').next().slideToggle('900', 'easeOutQuart');

problemet er bare at tr bliver sat til display block hvilket får den til at stå forkert i tabellen. Kan jeg gøre noget andet?
Avatar billede softspot Forsker
27. maj 2009 - 12:52 #3
Nu er jeg ikke lige 100 meter mester i display-modes, men mon ikke du kan finde en display-værdi, som benyttes i forbindelse med tabeller... (kig i CSS-definitionerne).

Jeg vil tro du kan sætte denne værdi efter slideToggle() afslutter sin animation:

$(this)
  .parents('tr')
  .next()
  .slideToggle('900', 'easeOutQuart')
  .css({'display':'table-row'});


NB: display:table-row er bare en tilfældig værdi jeg lige har grebet ud af mit syge hoved - du skal naturligvis finde den rigtige værdi :-)

Alternativt skal du lave din egen animation, men se lige om den nævnte metode ikke kan bruges først...
Avatar billede newcoma Nybegynder
27. maj 2009 - 13:06 #4
Det virker med $p(this).parents('tr').next().css({'display':'table-row'});

Men kan ikke bruge slideToggle. Jeg skal vel så lave et tjek på hver trom den er table-row når der klikkes?
Avatar billede softspot Forsker
27. maj 2009 - 14:01 #5
Hvad er det der går galt når du bruger slideToggle på table-row?
Avatar billede newcoma Nybegynder
27. maj 2009 - 14:09 #6
den indsætter bare display:block på tr...

$p(this).parents('tr').next().slideToggle('900', 'easeOutQuart').css({'display':'table-row'});
Avatar billede softspot Forsker
27. maj 2009 - 14:50 #7
Prøv lige med:

$(this).parents('tr').next().slideToggle('900', function() {
  $(this).css({'display':'table-row'});
});

Hvad gør den sidste streng-parameter i din version? Det burde være en callback-funktion der angives på den plads, så jeg undrer mig over hvad 'easyOutQuart' gør...
Avatar billede newcoma Nybegynder
27. maj 2009 - 15:26 #8
Nu skjuler den tr i et splitsekund og viser den igen. easyOutQuart er bare et kald til en easing funktion.
Avatar billede softspot Forsker
27. maj 2009 - 15:38 #9
OK, jamen, så er jeg pt. lidt blank med hensyn til hvad du så kan gøre. Callback-funktionen skal jo så tage stilling til om der foldes ind eller ud...

Jeg har desværre ikke mere tid til overs lige nu, så jeg er nød til at lade din tråd ligge lidt. Det kan være der kommer en anden forbi, som kan nogle tricks med jQuery... :-)

Jeg tænker lige lidt over den og vender måske tilbage med en løsning imorgen...
Avatar billede newcoma Nybegynder
27. maj 2009 - 17:58 #10
Jeg forsøger at lave noget ala dette 
$p('.layer-btn').click(
function() {
$p(this).parents('tr').next().css({'display':'table-row'});
$p(this).addClass('active');
});   
 
$p('.layer-btn').click(
function() {
if ($p(this).parents('tr').next().is(":visible")){
          $p(this).parents('tr').next().css({'display':'none'});
}
});   

For at lave en display/hide funktion, men uden succes :)
Avatar billede softspot Forsker
27. maj 2009 - 23:00 #11
Prøv lige at oprette en ny html-fil og smid nedenstående smøre ind i filen og gem den. Kør den derefter i din browser og sig mig om det er noget i den retning du søger...

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <title>Test af vis/skjul tabelrække</title>
    <script src="http://www.google.com/jsapi/" type="text/javascript"></script>
    <script type="text/javascript">google.load("jquery", "1.3");</script>
  <script type="text/javascript">
  $(document).ready(
    function() {
      $(".show-hide-layer").find("div").hide();
      $(".layer-btn").click(function() {
        $(this)
          .parents("tr")
          .next(".show-hide-layer")
          .find("div")
          .slideToggle('900')
      });
    }
  );
  </script>
</head>
<body>

  <table border="0">
    <tr>
      <td>
        <a href="#" class="layer-btn">testlink</a>       
      </td>
    </tr>
    <tr class="show-hide-layer">
      <td>
        <div>
        content weroiwueirouoweru oiweru oiu wer
        wer oiweru oweru oiuwer oweiru wer
        wer oiweur ouwe irouwoeir uowieru wer
        </div>
      </td>
    </tr>

    <tr>
      <td>
        <a href="#" class="layer-btn">testlink</a>       
      </td>
    </tr>
    <tr class="show-hide-layer">
      <td>
        <div>
        content weroiwueirouoweru oiweru oiu wer
        wer oiweru oweru oiuwer oweiru wer
        wer oiweur ouwe irouwoeir uowieru wer
        </div>
      </td>
    </tr>
  </table>

</body>
</html>


Som du kan se, har jeg smidt et duv-element omkring indholdet i cellen for at komme omkring det med de specielle display-modes for tabel-rækker. Jeg ved ikke om dette er muligt for dig at styre i din HTML, men det ser i det mindste ud til at fungere i IE 7.0.
Avatar billede softspot Forsker
27. maj 2009 - 23:02 #12
Det fungerer i øvrigt også med jQuery 1.2.6, hvis det skulle have nogen relevans - og i FireFox 2.0 :-)
Avatar billede newcoma Nybegynder
28. maj 2009 - 14:51 #13
Det virker fint. Nu forsøger jeg at sætte en .active klasse på .layer-btn når den er valgt men jeg kan ikek helt fange den med:

$p(document).ready(
function() {
$p(".layer-btn").click(function() {
$p(this)
.parents("tr")
.next(".show-hide-layer")
.find("div")
.slideToggle(function(){
$p(this)
.parents("tr")
.next(".layer-btn")
.addClass('active');           
})
});
  }
  );     

Kan du sætte mig på rette spor?
Avatar billede softspot Forsker
28. maj 2009 - 15:20 #14
Kan du ikke bare sætte den som det første i kæden: 

$(document).ready(function() {
  $(".layer-btn")
    .click(function() {
      $(this)
        .addClass("active")
        .parents("tr")
        .next(".show-hide-layer")
        .find("div")
        .slideToggle();
    }
  }
}
Avatar billede softspot Forsker
28. maj 2009 - 15:30 #15
Hvis du vil have class-atributten på når en "layer-btn" er åben, kan du benytte .toggleClass i stedet for .addClass. Så vil den blive fjernet samtidig med at "show-hide-layer" elementet foldes sammen igen...
Avatar billede newcoma Nybegynder
28. maj 2009 - 15:56 #16
Alle tiders. Har dog lige opdaget at når jeg klikker en .show-hide-layer åben, springer siden op i toppen i IE :(
Avatar billede softspot Forsker
28. maj 2009 - 16:40 #17
Du kan blot fjerne href="#" fra linket, så burde den ikke springe nogen steder... :-)
Avatar billede newcoma Nybegynder
28. maj 2009 - 16:56 #18
Det hjælper desværre ikke. Heller ikke hvis jeg laver a om til div
Avatar billede softspot Forsker
28. maj 2009 - 17:07 #19
OK, det fungerer ellers i IE 7.0 (hvis det altså er selve linket du snakker om - der sker slet ikke noget, hvis jeg klikker på rækken med klassen .show-hide-layer)...

Hvordan ser din ".show-hide-layer åben" helt præcis ud?
Avatar billede softspot Forsker
28. maj 2009 - 17:09 #20
Jeg synes nu også det fungerer som forventet i IE 8.0, så du skal nok lige forklare helt præcis hvad det er du ikke kan få til at fungere og hvad det er for noget kode og html du så forsøger at køre koden på...
Avatar billede newcoma Nybegynder
29. maj 2009 - 10:00 #21
Du har ret. Det var noget andet script der konfliktede.

Jeg synes det ville fuldende scriptet hvis .show-hide-layer lukker når man klikker på den næste, så der kun kan være en åben af gangen.

Er det besværligt at tilføje?
Avatar billede softspot Forsker
29. maj 2009 - 10:52 #22
Prøv med denne blok:

  $(document).ready(
    function() {
      $(".show-hide-layer").find("div").hide();
      $(".layer-btn").click(function() {
        if(!$(this).hasClass("open")) {
          var $lbn = $(".open");

          if($lbn.length != 0) {
            $lbn.click();
          }
        }
       
        $(this)
          .toggleClass("open")
          .parents("tr")
          .next(".show-hide-layer")
          .find("div")
          .slideToggle('600');
      });
    }
  );
Avatar billede newcoma Nybegynder
29. maj 2009 - 12:04 #23
Jeg har allerede en $(document).ready( om kring så den vil jeg fjerne men hvilke af de sidste
});
}
);

skal også væk?
Avatar billede softspot Forsker
29. maj 2009 - 12:27 #24
Ja, det var blot for at give dig en komplet kode som kan det du efterspørger :-)
Avatar billede newcoma Nybegynder
29. maj 2009 - 12:53 #25
Men jeg er lidt i tvivl om hvilke af
});
}
);

Som skal væk?
Avatar billede softspot Forsker
29. maj 2009 - 13:02 #26
Det kommer jo an på hvordan din kode ser ud nu... ;-)
Avatar billede softspot Forsker
29. maj 2009 - 13:03 #27
Det der er tilføjet er jo i bund og grund dette (hvilket du nok også ved nærmere eftersyn af koden vil opdage), så det er jo bare at få det flettet ind:

        if(!$(this).hasClass("open")) {
          var $lbn = $(".open");

          if($lbn.length != 0) {
            $lbn.click();
          }
        }
Avatar billede newcoma Nybegynder
29. maj 2009 - 13:16 #28
Sådan ser min kode ud. Der er noget der ikke balancerer helt som det skal.

$(document).ready(function(){   
function() {
      $(".layer-btn").click(function() {
  if(!$(this).hasClass("active")) {
          var $lbn = $p(".active");

          if($lbn.length != 0) {
            $lbn.click();
          }
        }
       
        $(this)
          .toggleClass("active")
          .parents("tr")
          .next(".notes-layer")
          .find("div")
          .slideToggle('fast', 'easeOutQuad')       
    });
   
});
Avatar billede softspot Forsker
29. maj 2009 - 14:02 #29
$(document).ready(function(){   
  $(".layer-btn").click(function() {
    if(!$(this).hasClass("active")) {
      var $lbn = $p(".active");

      if($lbn.length != 0) {
        $lbn.click();
      }
    }
       
    $(this)
      .toggleClass("active")
      .parents("tr")
      .next(".notes-layer")
      .find("div")
      .slideToggle('fast', 'easeOutQuad');
  });
});

(stringent indrykning kan afhjælpe mange kodeoverbliksproblemer ;-))
Avatar billede newcoma Nybegynder
29. maj 2009 - 16:00 #30
Suverænt.

Nu virker alt som det skal, jeg siger 1000 tak for hjælpen.
Avatar billede softspot Forsker
29. maj 2009 - 16:06 #31
Velbekomme :-)
Avatar billede softspot Forsker
02. juni 2009 - 10:18 #32
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester