You have to keep in mind that JSF Ajax updates component content, not
the Html elements. Therefore, any component have to has enclosing Html
element ( <div> , <span> whatever else ) with id attribute generated as
the component clientId to be compatible with Ajax. In your case, you
have to create placeholder element ( probably <div> ) that encapsulates
both of your elements.

On 04/06/2010 09:42 AM, Werner Punz wrote:
> Hello everyone, I ran into an issue regarding the update, which is
> closely related to a behavior jsf2 exposes regarding component rendering
> in the update cycle.
> 
> The main issue is following: If we have a component which we trigger
> with following code:
> 
>  <myComp:javascriptTestComponent
> id="myTestComponent"></grv:javascriptTestComponent>
>                 <a href="#" name="mego3"
>                   
> onclick="jsf.ajax.request(this,event,{execute:'myTestComponent',
> render:'myTestComponent'}); return false;">submit
>                     me</a>
> 
> and the component itself renders following in its renderer:
> 
>         ResponseWriter writer = context.getResponseWriter();
>         writer.startElement(DIV, component);
>         writer.writeAttribute(ID,component.getClientId(context), null );
>         writer.write("hello world"+Math.random());
>         writer.endElement(DIV);
> 
>         writer = context.getResponseWriter();
>         writer.startElement(DIV, component);
>        
> writer.writeAttribute(ID,component.getClientId(context)+":_second", null );
>         writer.write("hello world"+Math.random());
>         writer.endElement(DIV);
> 
> 
> the resulting ppr response now looks like following:
> 
> |<update id="myTestComponent">
> 
> <![CDATA||[<div id="myTestComponent">hello world0.8619488403376933</div>
> <div id="myTestComponent:_second">hello|| world0.25176272071402683</div>]]>
> 
> </update>...|
> 
> Now the problem is, since the update part of the response is already
> opened the component author cannot really influence the response
> rendering in any meaningful way (the correct solution would be to issue
> two update commands here)
> Now the javascript has to react on the client side to resolve that
> situation.
> 
> Now MyFaces just replaced the original
> 
> |myTestComponent|
> 
> with the update code and hence the result was a div wandering down (aka
> wrong update)
> 
> hello world0.48748236239247755
> hello world0.6020541783857698
> hello world0.7181842402648805
> hello world0.2803064696069696
> (after a handful of requests, with the lowest line being the first
> second div being dran)
> 
> now due to being incorrect a user gave me rightfully a bug issue. I dug
> deeper and ran the same example
> against Mojarra, now Mojarra does cherry pick the delivered first div
> and replaces the original div, and omits the second one.
> The Problem is Mojarra just does it for newer browsers, it does the same
> just updating the  original element with the replacement code
> (and hence producing a wandering div) for IE6+7-
> 
> My question is, first, how to handle that problem correctly. Secondly,
> is this even a problem for us or more one for the component author?
> In the end the main problem would not exist if they ajax api could be
> used on the component side properly without being enforced already into
> an update (or to allow nested updates, inserts within an update)
> 
> 
> Werner
> 

Reply via email to