myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Werner Punz (JIRA)" <...@myfaces.apache.org>
Subject [jira] Issue Comment Edited: (MYFACES-2586) wrong calling order for ajax script autorun
Date Thu, 04 Mar 2010 15:52:27 GMT

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


Mime
View raw message