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

Werner Punz edited comment on MYFACES-2586 at 3/4/10 3:50 PM:
--------------------------------------------------------------

Ok I think I have a solution, but I need a second eye to check it before commit 
the insert code now should be as follows to trigger the right order:
if (newTag != "") {
                var evalNode = null;
                if (typeof window.Range != 'undefined'
                        && typeof Range.prototype.createContextualFragment == 
'function') {
                    var range = document.createRange();
                    range.setStartBefore(item);
                    var fragment = range.createContextualFragment(newTag);
                    evalNode = item.parentNode.replaceChild(fragment, item);
                } else {
                    item.insertAdjacentHTML('beforeBegin', newTag);
                    evalNode = item.previousSibling;
                    item.parentNode.removeChild(item);
                }

                // and remove the old item
                //first we have to save the node newly insert for easier access 
in our eval part
                if (myfaces._impl._util._Utils.isManualScriptEval()) {
                    myfaces._impl._util._Utils.runScripts(request, context, 
evalNode);
                }
                return;
            }
            // and remove the old item, in case of an empty newtag and do 
nothing else
            item.parentNode.removeChild(item);

We get a slightly different behavior on IE6 and ie7 due to having to revert to 
insertAdjacentHTML due to lack of W3C range objects. (We should rethink
the usage of innerHTML for those browsers to get the same behavior), but since 
neither ie6 and ie7 do any auto eval I can live with a slightly different 
render behavior on those browsers for now. 
Anyway I gave it a testing on ie8 ie8 compatbilitymode ie7 mozilla, safari and 
opera and so far the solution works out quite well, in case of auto eval the 
problematic double dom entries are removed and in case of ie the eval is 
triggered after the dom is in a clean state. I guess I will commit the fix.


      was (Author: werpu):
    Ok I think I have a solution, but I need a second eye to check it before 
commit the insert code now should be as follows to trigger the right order:
if (newTag != "") {
                var evalNode = null;
                if (typeof window.Range != 'undefined'
                        && typeof Range.prototype.createContextualFragment == 
'function') {
                    var range = document.createRange();
                    range.setStartBefore(item);
                    var fragment = range.createContextualFragment(newTag);
                    evalNode = item.parentNode.replaceChild(fragment, item);
                } else {
                    item.insertAdjacentHTML('beforeBegin', newTag);
                    evalNode = item.previousSibling;
                    item.parentNode.removeChild(item);
                }

                // and remove the old item
                //first we have to save the node newly insert for easier access 
in our eval part
                if (myfaces._impl._util._Utils.isManualScriptEval()) {
                    myfaces._impl._util._Utils.runScripts(request, context, 
evalNode);
                }
                return;
            }
            // and remove the old item, in case of an empty newtag and do 
nothing else
            item.parentNode.removeChild(item);

We get a slightly different behavior on IE6 and ie7 due to having to revert to 
insertAdjacentHTML due to lack of W3C range objects. (We should rethink
the usage of innerHTML for those browsers to get the same behavior), but since 
neither ie6 and ie7 do any auto eval I can live with a slightly different 
render behavior on those browsers for now. 

Anyway please have a look at this and as soon as everyone agrees I can commit 
this.

  
> wrong calling order for ajax script autorun
> -------------------------------------------
>
>                 Key: MYFACES-2586
>                 URL: https://issues.apache.org/jira/browse/MYFACES-2586
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-314
>    Affects Versions: 2.0.0-beta-2
>         Environment: Javascript
>            Reporter: Ganesh Jung
>
> First the new element is inserted, then the scripts are run, then the old 
> element is removed. This is wrong, see this example:
>               <h:inputText value="#{myBean.test}">
>                               <f:ajax render="test" />
>               </h:inputText>
>               <h:panelGroup id="test">
>                           <script type="text/javascript">
>                                       alert("running");
>                               </script>
>                       <h:inputText value="#{myBean.test}" />
>               </h:panelGroup>
> Correct order would be: First the new element is inserted, then the old 
> element is removed, then the scripts are run.

-- 
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