Ticket #11350: ie_innerhtml_link_fix.diff
| File ie_innerhtml_link_fix.diff, 3.2 kB (added by jdalton, 3 months ago) |
|---|
-
dom.js
old new 941 941 if (Object.isElement(content)) return element.update().insert(content); 942 942 943 943 content = Object.toHTML(content); 944 var tagName = element.tagName.toUpperCase();944 var stripped = content.stripScripts(), tagName = element.tagName.toUpperCase(); 945 945 946 946 if (tagName in Element._insertionTranslations.tags) { 947 947 $A(element.childNodes).each(function(node) { element.removeChild(node) }); 948 Element._getContentFromAnonymousElement(tagName, content.stripScripts())948 Element._getContentFromAnonymousElement(tagName, stripped) 949 949 .each(function(node) { element.appendChild(node) }); 950 950 } 951 else element.innerHTML = content.stripScripts(); 951 else{ 952 element.innerHTML = stripped; 953 Element._fixAnchorsAfterUpdate(element, stripped); 954 } 952 955 953 956 content.evalScripts.bind(content).defer(); 954 957 return element; … … 966 969 } 967 970 968 971 content = Object.toHTML(content); 969 var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); 972 var parent = element.parentNode, tagName = parent.tagName.toUpperCase(), 973 stripped = content.stripScripts(); 970 974 971 if (Element._insertionTranslations.tags[tagName] ) {975 if (Element._insertionTranslations.tags[tagName] || /<a[^>]+\/?>/i.test(stripped)) { 972 976 var nextSibling = element.next(); 973 var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());977 var fragments = Element._getContentFromAnonymousElement(tagName, stripped); 974 978 parent.removeChild(element); 975 979 if (nextSibling) 976 980 fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); 977 981 else 978 982 fragments.each(function(node) { parent.appendChild(node) }); 979 983 } 980 else element.outerHTML = content.stripScripts();984 else element.outerHTML = stripped; 981 985 982 986 content.evalScripts.bind(content).defer(); 983 987 return element; … … 994 998 Element._getContentFromAnonymousElement = function(tagName, html) { 995 999 var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; 996 1000 if (t) { 997 div.innerHTML = t[0] + html + t[1]; 1001 html = t[0] + html + t[1]; 1002 div.innerHTML = html; 1003 Element._fixAnchorsAfterUpdate(div, html); 998 1004 t[2].times(function() { div = div.firstChild }); 999 } else div.innerHTML = html; 1005 } else{ 1006 div.innerHTML = html; 1007 Element._fixAnchorsAfterUpdate(div, html); 1008 } 1000 1009 return $A(div.childNodes); 1001 1010 }; 1002 1011 1012 Element._fixAnchorsAfterUpdate = Prototype.K; 1013 1014 //fix IE innerHTML issue with links and relative hrefs 1015 if (Prototype.Browser.IE) { 1016 (Element._fixAnchorsAfterUpdate = function(element, html){ 1017 var i,popupLinks,popup = arguments.callee.popup, 1018 links = element.getElementsByTagName('A'); 1019 if (i=links.length){ 1020 with(popup.document){ 1021 open();write(html);close(); 1022 } 1023 popupLinks = popup.document.getElementsByTagName('A'); 1024 while (i) links[--i].href = popupLinks[i].getAttribute('href', 2); 1025 } 1026 }).popup = window.createPopup(); 1027 } 1028 1003 1029 Element._insertionTranslations = { 1004 1030 before: function(element, node) { 1005 1031 element.parentNode.insertBefore(node, element);