Side navigation
#4059 closed bug (wontfix)
Opened February 04, 2009 09:16AM UTC
Closed April 01, 2011 02:31AM UTC
AppendTo not working under IE7 when select element from another frame.
Reported by: | fournaise | Owned by: | |
---|---|---|---|
Priority: | low | Milestone: | 1.next |
Component: | manipulation | Version: | 1.4.4 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
Hello,
I have 2 frames; in bottom frame I select a element in the other frame and try to append the selected element to a existing element in the bottom frame.
Works under FF3, but failed in IE6 and IE7.
Hereafter the test :
--- index.html ---
<frameset rows="50%,50%" > <frame src="haut.html" name="haut" frameborder="yes"> <frame src="bas.html" name="bas" frameborder="yes"> </frameset>
--- haut.html ----
<html><head></head> <body> <div class="classRecup">TEST</div> </body> </html>
--- bas.html ---
<html><head> <script language="javascript" src="jquery-1.3.1.min.js"></script> <script language="javascript"> $().ready(function() { $(".classRecup",parent.haut.document).appendTo("#divTitrePage"); }); </script> </head> <body><div id="divTitrePage" style="border:solid 1px blue">Mon texte :</div> </body> </html>
Attachments (0)
Change History (11)
Changed August 09, 2009 01:03AM UTC by comment:1
component: | unfilled → core |
---|---|
priority: | major → minor |
Changed February 16, 2010 10:14PM UTC by comment:2
I was able to reproduce this error in jQuery 1.3.2 and 1.4.1. The error is "htmlfile: Invalid argument." This sounds like the same issue encountered in bug #4348.
I have another example of this behavior between a parent document and a child document within an iframe.
parent.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Parent</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.js" type="text/javascript"></script> </head> <body> <iframe src="child.html" id="childIframe"></iframe> <script type="text/javascript"> $("#childIframe").load(function () { var childElements = $(this).contents().find(".pullup"); //childElements.appendTo("body"); $("body").append(childElements); }); </script> </body> </html>
child.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Child</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.js" type="text/javascript"></script> </head> <body> Child <div class="pullup">Pull-up Element</div> <div class="pushup">Push-up Element</div> <script type="text/javascript"> $(".pullup").add(".pushup").mouseover(function () { $(this).append("."); }); $(function () { var childElements = $(this).find(".pushup"), topBody = top.jQuery("body"); //childElements.appendTo(topBody); topBody.append(childElements); }); </script> </body> </html>
Both trying to pull the elements up from the parent and pushing the elements up from the child both fail in the "clean" method with the error "htmlfile: Invalid argument." in IE7. The code works fine in FF 3.5.
Here's part of the stack:
append domManip clean - line "fragment.appendChild( ret[i] );"
Changed February 18, 2010 07:41PM UTC by comment:3
I believe the problem is because you cannot appendChild when the fragment and the element (ret[i] in this case) don't have the same ownerDocument. You have to use importNode or adoptNode and IE7 doesn't support these. I'm looking into a solution like the one found at http://www.alistapart.com/articles/crossbrowserscripting/.
More on my research can be found here: http://stackoverflow.com/questions/2284356/cant-appendchild-to-a-node-created-from-another-frame/2291553#2291553
Changed February 18, 2010 09:06PM UTC by comment:4
I was able to fix this by changing
fragment.appendChild( ret[i] );
on line 4500 to
if (document.adoptNode || fragment.ownerDocument == ret[i].ownerDocument) { fragment.appendChild( ret[i] ); } else { fragment.appendChild(_importNode(fragment, ret[i], true )); ret[i].parentNode.removeChild(ret[i]); }
and adding this function
_importNode = function(document, node, allChildren) { /* find the node type to import */ switch (node.nodeType) { case 1: /* create a new element */ var newNode = document.createElement(node.nodeName); /* does the node have any attributes to add? */ if (node.attributes && node.attributes.length > 0) /* add all of the attributes */ for (var i = 0, il = node.attributes.length; i < il;) newNode.setAttribute(node.attributes[i].nodeName, node.getAttribute(node.attributes[i++].nodeName)); /* are we going after children too, and does the node have any? */ if (allChildren && node.childNodes && node.childNodes.length > 0) /* recursively get all of the child nodes */ for (var i = 0, il = node.childNodes.length; i < il;) newNode.appendChild(_importNode(document, node.childNodes[i++], allChildren)); return newNode; break; case 3: case 4: case 8: return document.createTextNode(node.nodeValue); break; } };
Changed June 20, 2010 08:15PM UTC by comment:5
component: | core → manipulation |
---|
Changed October 29, 2010 07:01PM UTC by comment:7
keywords: | → needsreview bikeshed |
---|---|
milestone: | 1.3.2 |
priority: | minor → low |
version: | 1.3.1 → 1.4.3 |
Changed January 19, 2011 04:48PM UTC by comment:9
description: | Hello, \ I have 2 frames; in bottom frame I select a element in the other frame and try to append the selected element to a existing element in the bottom frame. \ Works under FF3, but failed in IE6 and IE7. \ \ Hereafter the test : \ \ --- index.html --- \ \ <frameset rows="50%,50%" > \ <frame src="haut.html" name="haut" frameborder="yes"> \ <frame src="bas.html" name="bas" frameborder="yes"> \ </frameset> \ \ \ --- haut.html ---- \ \ <html><head></head> \ <body> \ <div class="classRecup">TEST</div> \ </body> \ </html> \ \ --- bas.html --- \ \ <html><head> \ <script language="javascript" src="jquery-1.3.1.min.js"></script> \ <script language="javascript"> \ $().ready(function() { \ $(".classRecup",parent.haut.document).appendTo("#divTitrePage"); \ }); \ </script> \ </head> \ <body><div id="divTitrePage" style="border:solid 1px blue">Mon texte :</div> \ </body> \ </html> → Hello, \ I have 2 frames; in bottom frame I select a element in the other frame and try to append the selected element to a existing element in the bottom frame. \ Works under FF3, but failed in IE6 and IE7. \ \ Hereafter the test : \ \ --- index.html --- \ {{{ \ <frameset rows="50%,50%" > \ <frame src="haut.html" name="haut" frameborder="yes"> \ <frame src="bas.html" name="bas" frameborder="yes"> \ </frameset> \ }}} \ \ --- haut.html ---- \ {{{ \ <html><head></head> \ <body> \ <div class="classRecup">TEST</div> \ </body> \ </html> \ }}} \ --- bas.html --- \ {{{ \ <html><head> \ <script language="javascript" src="jquery-1.3.1.min.js"></script> \ <script language="javascript"> \ $().ready(function() { \ $(".classRecup",parent.haut.document).appendTo("#divTitrePage"); \ }); \ </script> \ </head> \ <body><div id="divTitrePage" style="border:solid 1px blue">Mon texte :</div> \ </body> \ </html> \ }}} |
---|---|
milestone: | → 1.next |
version: | 1.4.3 → 1.4.4 |
Changed January 19, 2011 04:51PM UTC by comment:10
_comment0: | #8010 is a duplicate of this ticket. → 1295455901076075 |
---|
#8010 is a duplicate of this ticket.
#8010 holds additional http://jsfiddle.net test cases
Changed April 01, 2011 02:31AM UTC by comment:11
keywords: | needsreview bikeshed |
---|---|
resolution: | → wontfix |
status: | new → closed |
There are many other issues with trying to manipulate elements across a frame boundary, including memory leaks and security issues if the frame navigates to a different domain. Perhaps someone could write a plugin to do this safely?