views:

56

answers:

2

Hello,

I'm using this script to switch layouts in a page:

$("span.switcher").click(function () {
    $("span.switcher").toggleClass("swap"); /*!*/
    $("ol.search-results").fadeOut("fast", function() {
        $(this).fadeIn("fast").toggleClass("grid");
});

The script works fine, the problem I have is that if the switch view is down the page, the layout changes and then the page jumps back up.

If I add 'return false' right where you see the /* ! */ in the second line the script doesn't work.

Also, as you can see, I'm using < span > instead of < a > since I was told that using other element other than < a > would stop the page from jumping.

Any idea how to fix the jumping of the page?

Thanks.

+1  A: 

You need to reference the event in the function call and stopPropagation on it:

$("span.switcher").click(function (event) {

    event.stopPropagation();

    $("span.switcher").toggleClass("swap"); /*!*/
    $("ol.search-results").fadeOut("fast", function() {
        $(this).fadeIn("fast").toggleClass("grid");
    });

});

This stops the click from being notified to anything other than this binding.

mVChr
Unfortunately your suggestion didn't work :(. It stops the switch view altogether. Any other ideas?Thanks.
Ricardo Zea
You might need the stopPropagation() at the end. Otherwise, I'll think about it when I have a moment and get back to you.
mVChr
A: 

As this blog post mentions, the page is scrolled up because

fadeOut sets the css property display to none.

The solution, also given in the blog, would be to use fadeTo() instead of fadeOut() and fadeIn(), like this:

$("span.switcher").click(
    function () {
        $("span.switcher").toggleClass("swap");
        $("ol.search-results").fadeTo("fast", 0,
            function () {
                $(this).fadeTo("fast", 1).toggleClass("grid");
            }
        );
    }
);



Regarding using an a element instead of span, you can do several things to prevent the default behaviour of the link (which would be to jump to the top of the page if its href attribute was "#"). How to do this and the effects of it is discussed in this SO question.

Simen Echholt
This one worked 50%. The page doesn't jump back up... all the way, it jumps back up to the middle of the page (maybe a little bit lower than the middle, but still jumps).Any other suggestions? Thanks.
Ricardo Zea
Too bad :/ [This](http://pastebin.com/4VWqfn7U) is the HTML/JS i used to test with. Maybe you can get something useful out of it :)
Simen Echholt
Thanks for your help Simen. Yes, that test code does actually jump back up the page as well, as I said, not all the way, just a little below the middle of the page :(.Thanks again though, appreciate your help and your time.
Ricardo Zea
Interesting, what browser are you using?
Simen Echholt
I test in all these: IE6, IE7, IE8, FF3.6.x, Chrome, Safari 3.2.x, Safari 4.x, Opera 10.x
Ricardo Zea