You don't need .each(), and if you want reduce your code you can, with
chaining, do it all in a one line of jQuery:

CSS (to initially hide all the contents):
p.contents{
        display:none;
}

HTML ('contents' class added for easier selecting):
<ul>
    <li>
        <p>Item 1</p>
        <p class="contents">Hidden contents 1</p>
        <p><a href="up" class="change">Click to show</a></p>
    </li>
    <li>
        <p>Item 2</p>
        <p class="contents">Hidden contents 2</p>
        <p><a href="up" class="change">Click to show</a></p>
    </li>
    <li>
        <p>Item 3</p>
        <p class="contents">Hidden contents 3</p>
        <p><a href="up" class="change">Click to show</a></p>
    </li>
</ul>

JS:

$('a.change').click(function(){
        $(this).text('Click to '+($(this).hasClass
('open')?'show':'hide')).toggleClass('open').closest('li').children
('p.contents').slideToggle().end().siblings().children
('p.contents').slideUp().next('p').children('a.change').text('Click to
show').removeClass('open');
        return false;
});


On Mar 14, 12:34 pm, Jsbeginner <jsbegin...@monarobase.net> wrote:
> Thankyou, I've at last got it working, I used the href attribute to
> specify if the text is hidden or not (I will add the html code with
> javascript and will supply a PHP version for navigators that are not
> compatible with javascript), to begin with I wanted to use the toggle
> function but I needed to be able to skip a status and didn't know if
> this was even possible. I don't know if there is a better way but here
> is how I ended up doing it (any advice to make my code better would be
> great :)) :
>
> Here is my code :
> JS :
> -----
> $("a.change").each(function(){
>      $(this).click(function(){
>         if($(this).attr("href") == "up"){
>             $("a.change").each(function(){
>                 if($(this).attr("href") == "down"){
>                     $(this).parent("p").prev("p").slideUp(300);
>                     $(this).attr("href","up");
>                     $(this).text("Click to show");
>                 }
>             });
>              $(this).parent("p").prev("p").slideDown(300);
>             $(this).attr("href","down");
>             $(this).text("Click to hide");
>         } else {
>                  $(this).parent("p").prev("p").slideUp(300);
>                 $(this).attr("href","up");
>                 $(this).text("Click to show");
>         }
>         return false;
>     });});
>
> -----
> HTML :
> -----
> <ul>
>     <li>
>         <p>Item 1<p>
>         <p>Hidden contents 1</p>
>         <p><a href="up" class="change">Click to show</a></p>
>     </li>
>     <li>
>         <p>Item 2<p>
>         <p>Hidden contents 2</p>
>         <p><a href="up" class="change">Click to show</a></p>
>     </li>
>     <li>
>         <p>Item 3<p>
>         <p>Hidden contents 3</p>
>         <p><a href="up" class="change">Click to show</a></p>
>     </li>
> </ul>
> -----
>
> Jonathan wrote:
> > .each() should do what you want.
>
> > It will iterate through each element that has the class "Item" and
> > will set "this" to that individual element. So no $(this) will not be
> > the same as $(.item)  e.g with this markup
>
> > <div class="item"/>
> > <span class="item"/>
>
> > $(".item").each() will execute twice with "this" being the DIV then
> > the SPAN.
>
> > Jsbeginner wrote:
>
> >> Hello again, I've been continuing my search and it seems that the .each
> >> function is not working the way I wanted it to...
>
> >>  From what I've understood $(".item").each(function(){}) just counts how
> >> many elements have the 'item' class, and then executes the code that
> >> number of times with $(this) being the same as $(".item").
>
> >> How would I go about running a function on each element ? would I have
> >> to do something with a counter an the next function to achieve this ? or
> >> is there an easier way ?
>
> >> Thankyou.
>
> >> Jsbeginner wrote :
>
> >>> Hello,
>
> >>> I've been struggling with a very simple code that I can't get to work ...
>
> >>> Simplified html :
>
> >>> <ul>
> >>>    <li>
> >>>        <p>Item 1<p>
> >>>        <p class="toggle">Hidden contents 1</p>
> >>>        <p><a href="#" class="down">Click to show</a></p>
> >>>    </li>
> >>>    <li>
> >>>        <p>Item 2<p>
> >>>        <p class="toggle">Hidden contents 2</p>
> >>>        <p><a href="#" class="down">Click to show</a></p>
> >>>    </li>
> >>>    <li>
> >>>        <p>Item 3<p>
> >>>        <p class="toggle">Hidden contents 3</p>
> >>>        <p><a href="#" class="down">Click to show</a></p>
> >>>    </li>
> >>> </ul>
>
> >>> This is what I want to do :
>
> >>> When you click on a Click to show link it shows the hidden contents
> >>> contained in the item's "toggle" paragraphe and changes the link text
> >>> to "Click to hide".
> >>> I also want to only be able to have one hidden contents showing at a
> >>> time, so I would like to be able to hide any other visible hidden
> >>> contents before showing the hidden contents asked for.
>
> >>> I know my code isn't perfect but the following code works to some
> >>> extent : I can show or hide the contents but not hide all other
> >>> contents before showing new contents.
> >>> --------------------------
> >>> function down() {
> >>>    $("a.down").each(function(){
> >>>        $(this).click(function(){
> >>>            reinit();
> >>>            $(this).parent("p").prev("p").slideDown(300);
> >>>            $(this).parent("p").html("<a href=\"#\" class=\"up\">Click
> >>> to hide</a>");
> >>>            up();
> >>>            return false;
> >>>        });
> >>>         });
> >>> }
>
> >>> function up() {
> >>>    $("a.up").each(function(){
> >>>        $(this).click(function(){
> >>>            $(this).parent("p").prev("p").slideUp(300);
> >>>            $(this).parent("p").html("<a href=\"#\"
> >>> class=\"down\">Click to show</a>");
> >>>            down();
> >>>            return false;
> >>>        });
> >>>         });
> >>> }
>
> >>> function reinit(){
> >>>    $(".toggle").each(function(){
> >>>        $(this).slideUp(300);
> >>>        $(this).next("p").html("<a href=\"#\" class=\"down\">Click to
> >>> show</a>");
> >>>    });
> >>>   }
>
> >>> $(document).ready(function(){
> >>>    down();
> >>> });
> >>> --------------------------
>
> >>> There is just one line that doesn't work it's in the reinit function :
>
> >>> $(this).next("p").html("<a href=\"#\" class=\"down\">Click to show</a>");
>
> >>> I've been trying lots of ways to get this working without success... I
> >>> thought it would work with the next function but no luck.
>
> >>> If it will help you to find what I've done wrong I've put all the
> >>> necessary code (except the jquery library) in one html file, I've not
> >>> added it to this help request to not make it too long,  but if you
> >>> find it difficult to follow me I can post it's contents so you can
> >>> test it.
>
> >>> Thankyou.

Reply via email to