Home > AJAX, ASP .NET, Javascript > jQuery effects not working after UpdatePanel Asynchronous request is over

jQuery effects not working after UpdatePanel Asynchronous request is over

A few days ago I was working on a project that involves a really good looking design and it had some fancy effects on a page with the help of jQuery library

The fancy effect was about showing a button over the picture with the title “View larger” when the mouse hovered over it and it went off and on with the fade effect and some good looking collapsible panels. The items were shown on the basis of a filtering criteria given by the user and I put that section in an UpdatePanel control. On first page load every thing was working A-OK but as soon as there was any Asynchronous Post back, whether from a drop down list or from any check box, all the jQuery effects just vanished.

So the problem was quite vague when I first looked at it, it wasn’t clear as to why the application is behaving this way so I started testing every peace of javascript I could find and mind you I didn’t know any thing about jQuery by that time so when I came up to this I started googling it too, studied how it worked.

Then I came to know that there’s an event called the Ready event, which is fired once to DOM is fully loaded. and I noticed in the code that there were lots of things that were getting initialized in this event which was found in three different files in my case. So I took out the code in the “ready” events and put them in 3 separate JavaScript functions, called them from the ready event AND then did the part that ACTUALLY solved the issue. WHAT WAS THE ISSUE?? Well, the issue was that after an async post back the ready event isn’t fired. So I had to find a way to actually call a JavaScript function after ANY Async post back. After a little Googling I came up to this fine link

http://zeemalik.wordpress.com/2007/11/27/how-to-call-client-side-javascript-function-after-an-updatepanel-asychronous-ajax-request-is-over/

where Zeeshan Malik explains how to do that. So I did it like this:

I wrote this function in the master page

function load(){
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
}

function EndRequestHandler(){

ReadyFunction1();

ReadyFunction2();

ReadyFunction3();

}

and called this in the onload event the body tag  as

<body onload=”load()”>

And the problem got knocked out!

For your convenience, here are some useful links.

http://www.sitepoint.com/article/ajax-jquery/

http://docs.jquery.com/Tutorials:AJAX_and_Events

Happy Programming Folks!

  1. November 7, 2008 at 10:39 am | #1

    Hi Imran

    I found an alternative solution that could also work. The problem seems to be like you said: the jQuery ready function is not called on an async postback. The pageLoad() ASP.NET ajax method is called however.

    It seems that ASP.NET ajax and jQuery don’t get along together when it comes to the DOM load event, and ASP.NET ajax takes preference to the jQuery ready function.

    So in short replace all jQuery: $(document).ready() instances in your code with function pageLoad(). This I think is a more elegant solution then intercepting the end_request event and altering the master page.

    Hope this adds to your useful article.

    • Shijith
      May 26, 2009 at 8:33 am | #2

      Thank you very much … its a very good article and helped me a lot …. thanks again :)

      • Imran Akram
        May 26, 2009 at 9:09 am | #3

        Thanks, I appreciate the comment.

    • Elif
      September 8, 2009 at 8:21 am | #4

      Thank you very much for this simple solution.

  2. imak47
    November 7, 2008 at 11:07 am | #5

    Hi there,

    Thanks for sharing the info, really appreciate this. Yes I think its a much more elegant solution, I’ll definately try and implement that on my end and see what happens.

    Cheers.

  3. wicherq
    January 2, 2009 at 8:22 pm | #6

    thanks, very useful, i believe in jquery again :)

  4. January 13, 2009 at 12:36 am | #7

    Dnoxs, thank you vary much: it works as you described. You made my day. Just a clarification for novices like me: you need to include the word ‘function’, i.e. ‘function pageLoad()’, not just ‘pageLoad()’.

    • imak47
      January 13, 2009 at 5:55 am | #8

      Glad to know that, you’re most welcome

  5. Arun Prasad
    March 30, 2009 at 12:11 pm | #9

    Hi dnoxs,’

    Thanks a lot!!! Your suggestion worked for me!!!
    thanks again.

  6. June 26, 2009 at 10:53 pm | #10

    dnoxs,

    You rule! Plain and simple… Thanks for the quick tip on the pageLoad function.

  7. Jason
    June 30, 2009 at 1:53 am | #11

    Exactly what I was looking for, dnoxs! Thanks a lot; you made my night.

  8. amjad
    July 10, 2009 at 7:37 am | #12

    Just the solution i was looking for thanks!

  9. Mudassar
    July 17, 2009 at 5:36 am | #13

    Thanks. Nice informaton

  10. July 30, 2009 at 7:21 am | #14

    Hi dude

    thanks for the nice solution

    • Imran Akram
      July 30, 2009 at 7:23 am | #15

      hey yo! Thanks man, I really appreciate the comment.

  11. July 30, 2009 at 10:33 am | #16

    Really it work’s great…..
    i’m trying since couple of hour
    this is exactly what i’looking :)

  12. August 7, 2009 at 7:27 am | #17

    thank you, you’re awesome :-)

  13. Michal
    August 17, 2009 at 11:19 am | #18

    Hi there,

    I got the same problem, anyone mind helping me out?

    in init.js i use:

    jQuery.noConflict();
    jQuery(document).ready(function($){
    CODE
    });

    Can’t seem to figure out where to place
    function pageLoad()

  14. Sergio Cardoso
    August 20, 2009 at 3:00 pm | #19

    Thanks a lot.
    I had spend 3 days developing a new Web User Control, and when I added to the main project, it don’t work.
    You have saved my day.

  15. Cromax
  16. October 21, 2009 at 12:13 am | #21

    Great post, thanks a lot!

  17. October 22, 2009 at 8:17 am | #22

    I was using the following JQuery tooltip which was not working on post backs:

    $(document).ready(function(){
    $(‘.tTip’).betterTooltip({speed: 150, delay: 300});
    });

    I change this to the following to get it working on post backs:

    function pageLoad(){
    $(‘.tTip’).betterTooltip({speed: 150, delay: 300});
    }

  18. LCMS
    November 5, 2009 at 4:38 pm | #23

    nice, that got me what i needed

  1. No trackbacks yet.