Search code examples
javascriptliferayicefaces

How to make sure that a Javascript function is called after EVERY postback in Liferay/ICEFaces?


I have very little experience with Liferay and ICEFaces. I need to build a portlet that calls a specific Javascript function every time a postback occurs.

In fact, when the form is submitted through AJAX, a loading screen appears and blocks the screen. When the postback completes, I need to take it out and give control to user again.

I have tried to put the <script> snippet in the portlet's body and it succeeds in executing when the page is first loaded (it's ok) and also when a postback changes the page's HTML content.

The problem is, when the server doesn't change the HTML (ie. a search returned with no result, you search again and you still get no results) the function is not executed again.

Even if I could post some code, I have very little idea of the architecture the web application is built on. What I gave here is all the information I have. By editing the javascript function to emit alerts when it's called I found the behaviour of the page.

Can you help me with that?


Solution

  • I made it using a weird trick with random numbers I want to share.

    First, in the backing bean property I created a method

    public String getLoadFunction()
    {
        return "functionName("+ new Random().nextDouble() +");";
    }
    

    and then

    <script>
        #{MyViewBean.loadFunction}
    </script>
    

    "Simply", ICEFaces is so smart it checks if the HTML has been modified or not when processing AJAX requests. This trick is very similar to appending a random number to HTTP URLs to avoid caches.