Hi Matej. Have you read the the forwarded part of the last message? Because that is where I explained the behavior. Basically in Firefox if I replace a panel with two subpanels the second subpanel doesn't get replaced. Please check out the message bellow, the one I forwarded.
If you see the org/apache/wicket/ajax/wicket-ajax.js in wicket-1.3.0-beta4.jar. You will see the code for the * Wicket.replaceOuterHtml* In there, I understand that there are two main things going on: 1) There is some code that it is not used and so, in our version we commented it. 2) And most important, we fixed a the issue for us by moving the nodes in the tree herarchy that appears wrongly in the get * range.createContextualFragment*() function from the Gecko (firefox) engine. If there are many subpanels, the range uncorrectly parses the content, resulting in a fragment that contains many childs instead of one. The HTML is explained bellow, if that explanation fails I'll try to send you a file. ok? Our function basically call the *Wicket.replaceOuterHtml=function(){ blah, blah* to replace the one in the framework with the fixed one. And we call the replacement on a window.setTimeOut() on the specific page in which we have the panel with subpanels. thanks, f(t) On 10/30/07, Matej Knopp <[EMAIL PROTECTED]> wrote: > > Sorry, I'm not sure I follow. > > there is some code in replaceOuterHtml that seems redundant so it could > be like this: > > Wicket.replaceOuterHtml = function(element, text) { > > if (Wicket.Browser.isIE()) { > Wicket.replaceOuterHtmlIE(element, text); > } else if (Wicket.Browser.isSafari() || Wicket.Browser.isOpera()) { > Wicket.replaceOuterHtmlSafari(element, text); > } else /* GECKO */ { > // create range and fragment > var range = element.ownerDocument.createRange(); > range.selectNode(element); > var fragment = range.createContextualFragment(text); > > element.parentNode.replaceChild(fragment, element); > } > } > > Still I'm not sure what the problem is that your code solves. Can you > please provide me a html file where the replaceOuterHtml call fails? > > -Matej > > > Francisco Diaz Trepat - gmail wrote / napĂsal(a): > > Hi a cowerker here might have found something here. We have fix the > issue by > > replacing the *Wicket.replaceOuterHtml* function. > > > > Could this be a BUG? > > > > I have forwarded the initial message that explains the behavior. > > > > Here is the code that fixed our problem: > > > > f(t) > > > > > > > > // > > > -------------------------------------------------------------------------------- > > // Hack that demonstrates a possible fix for a problem with Gecko based > > browsers. > > // The problem happens in this line: > > // var fragment = range.createContextualFragment(text); > > // If there are many subpanels, the range uncorrectly parses the > content, > > resulting > > // in a fragment that contains many childs instead of one. > > // The first child is the first subpanel, and the rest are the other > > subpanels, > > // which are incorrectly hang at the same level as the main panel, > instead > > of being > > // childs of it. > > > > function replaceWicketReplaceOuterHtml() { > > Wicket.replaceOuterHtml = function(element, text) { > > if (Wicket.Browser.isIE()) { > > Wicket.replaceOuterHtmlIE(element, text); > > } else if (Wicket.Browser.isSafari() || Wicket.Browser.isOpera()) { > > Wicket.replaceOuterHtmlSafari(element, text); > > } else /* GECKO */ { > > // create range and fragment > > var range = element.ownerDocument.createRange(); > > range.selectNode(element); > > var fragment = range.createContextualFragment(text); > > > > // The following code seems useless, and then is commented out > > // get the elements to be added > > //var elements = new Array(); > > //for (var i = 0; i < fragment.childNodes.length; ++i) > > //elements.push(fragment.childNodes[i]); > > > > // move additional subnodes to the correct place in the dom > > if (fragment.childNodes.length > 1) { > > // the for clause intentionally starts from 1, > > // to fix only the wrongly hanging subnodes. > > for (var i = 1; i < fragment.childNodes.length; ++i) { > > var otherNode = fragment.childNodes[i]; > > > > fragment.childNodes[0].childNodes[0].appendChild(otherNode); > > } > > } > > > > element.parentNode.replaceChild(fragment, element); > > } > > } > > } > > > > window.setTimeout(replaceWicketReplaceOuterHtml, 1000); > > // > > > -------------------------------------------------------------------------------- > > > > > > ---------- Forwarded message ---------- > > From: Francisco Diaz Trepat - gmail <[EMAIL PROTECTED]> > > Date: Oct 23, 2007 10:27 PM > > Subject: Re: Ajax Panel Replacement Issue on Fireforx only (Kind of > Complex > > Scenario) > > To: users@wicket.apache.org > > > > Thanks Matej, I will but further ahead. I'll try to see what is going on > > with more detail by using FIREBUG toolbar or something of the sort. > > > > > > > > > > If everything else fails I'll provide a QuickStart. > > > > > > Thanks, > > f(t) > > > > On 10/23/07, Matej Knopp <[EMAIL PROTECTED]> wrote: > >> Can you provide a quickstart? > >> > >> -Matej > >> > >> On 10/23/07, Francisco Diaz Trepat - gmail > >> <[EMAIL PROTECTED]> wrote: > >>> Hi. I'm going to try to explain the best that I can and without > posting > >> code > >>> at first the issue that is happening. > >>> > >>> I have the following panels A and C. A has two instances of B nested > >> inside > >>> of it. C is empty: > >>> > >>> [ > >>> > >>> ==PANEL-A== > >>> > >>> [ > >>> > >>> ==PANEL-B1== > >>> > >>> ] > >>> > >>> [ > >>> > >>> ==PANEL-B2== > >>> > >>> ] > >>> > >>> ] > >>> > >>> > >>> [ > >>> ==PANEL-C== > >>> ] > >>> > >>> What happens is that on another Panel that represent the Page content, > >> lets > >>> call it ContentPanel I need to toggle between panels A and C with the > >> click > >>> of an Ajax Link. > >>> > >>> The first state is with panel C that it is empty (actually with lots > of > >>> HiddenFields, but empty visually). On click I need to Show the A panel > >> that > >>> has viewable content. Finally on another click I need to go back to > the > >>> original state of C panel. > >>> > >>> So far so good. The issue is as follows: > >>> > >>> The problem happens on Firefox only (latest version 2.0.0.8) (on IE 6 > >> and 7 > >>> it is not an issue as everything works fine). > >>> > >>> What happens is that I click on the link, and panel A shows perfectly. > >> But > >>> when I click again to put the C panel back, the A panel gets Partially > >>> removed, that is panel A's first panel B instance B1 gets removed, but > >> B2 is > >>> not removed and it is still visible, plus I get the C panel, as C > panel > >>> doesn't have viewable content it doesn't add to the visual problem. > >> *Ej*: > >>> [ > >>> > >>> ==PANEL-A== > >>> > >>> > >>> [ > >>> > >>> ==PANEL-B2== > >>> > >>> ] > >>> > >>> ] > >>> > >>> [ > >>> ==PANEL-C== > >>> ] > >>> > >>> Now If I click again, I get Panel A with "2 instances of B2" as panel > B2 > >> was > >>> not removed. > >>> [ > >>> > >>> ==PANEL-A== > >>> > >>> [ > >>> > >>> ==PANEL-B1== > >>> > >>> ] > >>> > >>> [ > >>> > >>> ==PANEL-B2== > >>> > >>> ] > >>> > >>> [ > >>> > >>> ==PANEL-B2== > >>> > >>> ] > >>> > >>> ] > >>> > >>> So and so forth every click and click, I get panel A partially removed > >> and > >>> when added again I have another instance of B2 as it is never removed. > >>> > >>> > >>> > >>> Any Ideas? > >>> > >>> thanks, > >>> > >>> f(t) > >>> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > >> For additional commands, e-mail: [EMAIL PROTECTED] > >> > >> > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > >