Details
Description
http://www.nabble.com/bug%3A-iframe-get-request-done-2x-after-ajax-change-in-IE-to14598132.html
We have a page that has an iframe and an ajax button.
When the ajax button is clicked, the iframe is replaced by a new iframe with specific src.
We have encountered the phenomenon where the iframe src is requested
two times to the server after the button gets clicked.
After some debugging, the problem was pinned down and
lies within the file org\apache\wicket\ajax\wicket-ajax.js
The problem is within the function "replaceOuterHtmlIE".
There is some kind of "hack" to read the <script> tags within the received html...
First the content of the div is filled with a table containing received ajax component markup:
tempDiv.innerHTML = '<table style="display:none">' + text + '</table>';
This way script tags can be retrieved. Afterwards the innerHTML is replaced by a div containing received text.
tempDiv.innerHTML = '<div style="display:none">' + text + '</div>';
Both statements cause IE to fetch the urls within the contained text (in our case <iframe src="someurl"></iframe> tags).
We patched this the following way ...
The first occurence of tempDiv.innerHTML, The content of the div is filled with a table containing a div.
tempDiv.innerHTML = '<table style="display:none"><div style="display:none">' + text + '</div></table>';
After the script tags are retrieved, the table gets removed from the structure,
and the div within the table is connected to tempDiv.
var table=tempDiv.firstChild;
var childDiv=table.firstChild.firstChild;
tempDiv.removeChild(table);
tempDiv.appendChild(childDiv);
Would it be possible to apply this patch to the next wicket version?
We experienced some problems with the patch, below is the updated version that we use.
var table=tempDiv.firstChild;
tempDiv.removeChild(table);
if(tempDiv.childNodes.length==0) {
var childDiv=table.firstChild.firstChild;
table.firstChild.removeChild(childDiv);
tempDiv.appendChild(childDiv);
}
else {
tempDiv.removeChild(tempDiv.lastChild); // slash table
tempDiv.removeChild(tempDiv.lastChild); // div
var childDiv=document.createElement("div");
childDiv.style.display="none";
var child;
while(tempDiv.childNodes.length>0)
tempDiv.appendChild(childDiv);
}