[ 
https://issues.apache.org/jira/browse/MYFACES-2640?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12853827#action_12853827
 ] 

Werner Punz commented on MYFACES-2640:
--------------------------------------

Ok this is a rather rare usecase, but having slept over it it can happen on 
component level.

Ok lets sum this up, if you have a component renderer and it renders multiple 
nodes we have to deal with them,
The fault clearly is at the javascript side, on our javascript side here.

The obvious solution would be to have insert the replace + add the sibling 
nodes, but this does not work out entirely. Running recursively over all nodes 
also can fail in some cases (if the subnodes
are not existing yet)

I am not sure how to resolve this in a proper and clean manner yet.. I have 
some testing to do, give me a few days for a proper fix.

The workaround for now is, to always use a root element on the code side where 
you have your main element and your decorations in, I probably have to work 
with that construct as well, for the dom manipulation to have a clean handling 
of this case (For now this seems the only viable option to me to handle this 
properly)



> (JSF.js) Ajax Render component problem, replace with whole fragment not one 
> element.
> ------------------------------------------------------------------------------------
>
>                 Key: MYFACES-2640
>                 URL: https://issues.apache.org/jira/browse/MYFACES-2640
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-314
>    Affects Versions: 2.0.0-beta-3
>         Environment: tomcat 6.0.20 java (mac os x )
>            Reporter: Mark Li
>   Original Estimate: 4h
>  Remaining Estimate: 4h
>
> after ajax submit, jsf.js will re-render some element depending on 
> jsf.ajax.request({render:" some elements "});
> but this js code will cause some problem.
> jsf.js:
> myfaces._impl._util._Utils.replaceHtmlItem = function (request, context, 
> itemIdToReplace, newTag, form) {
> ......
>                     var fragment = range.createContextualFragment(newTag);
>                     evalNode = item.parentNode.replaceChild(fragment, item)
> .....
> }
> sometime fragment will has more than one childNodes, or the childNode not has 
> clientId, but the childNode of childNode has clientId.
> this will cause html unstable.
> Please fix it.
> this is my suggestion:
> myfaces._impl._util._Utils.replaceHtmlItem = function (request, context, 
> itemIdToReplace, newTag, form) {
>            .............
>               Orginal:
>                     var fragment = range.createContextualFragment(newTag);
>                     evalNode = item.parentNode.replaceChild(fragment, item)
>               fix:
>                     var fragment = range.createContextualFragment(newTag);
>                     var replaceItem = 
> myfaces._impl._util._Utils.findHtmlItemFromFragment(fragment, 
> itemIdToReplace);
>                     if(replaceItem == null)replaceItem = fragment;
>                     evalNode = item.parentNode.replaceChild(replaceItem, item)
>        ..................
> }
>     myfaces._impl._util._Utils.findHtmlItemFromFragment = function(fragment, 
> itemId){
>       if(fragment.childNodes == null)
>               return null;
>       for(var i = 0; i < fragment.childNodes.length ; i++ ){
>               var c = fragment.childNodes[i];
>               if(c.id == itemId)
>                       return c;
>       }
>       for(var i = 0; i < fragment.childNodes.length ; i++ ){
>               var c = fragment.childNodes[i];
>               var item = 
> myfaces._impl._util._Utils.findHtmlItemFromFragment(c, itemId);
>               if(item != null)
>                       return item;
>       }
>       return null;
>     };

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to