Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #11350: ie_innerhtml_link_fix.diff

File ie_innerhtml_link_fix.diff, 3.2 kB (added by jdalton, 3 months ago)

Updated patch to fix insert(), replace(), and update() methods

  • dom.js

    old new  
    941941    if (Object.isElement(content)) return element.update().insert(content); 
    942942     
    943943    content = Object.toHTML(content); 
    944     var tagName = element.tagName.toUpperCase(); 
     944    var stripped = content.stripScripts(), tagName = element.tagName.toUpperCase(); 
    945945     
    946946    if (tagName in Element._insertionTranslations.tags) { 
    947947      $A(element.childNodes).each(function(node) { element.removeChild(node) }); 
    948       Element._getContentFromAnonymousElement(tagName, content.stripScripts()
     948      Element._getContentFromAnonymousElement(tagName, stripped
    949949        .each(function(node) { element.appendChild(node) }); 
    950950    } 
    951     else element.innerHTML = content.stripScripts(); 
     951    else{ 
     952      element.innerHTML = stripped; 
     953      Element._fixAnchorsAfterUpdate(element, stripped); 
     954    } 
    952955     
    953956    content.evalScripts.bind(content).defer(); 
    954957    return element; 
     
    966969    } 
    967970 
    968971    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(); 
    970974     
    971     if (Element._insertionTranslations.tags[tagName]) { 
     975    if (Element._insertionTranslations.tags[tagName] || /<a[^>]+\/?>/i.test(stripped)) { 
    972976      var nextSibling = element.next(); 
    973       var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); 
     977      var fragments = Element._getContentFromAnonymousElement(tagName, stripped); 
    974978      parent.removeChild(element); 
    975979      if (nextSibling) 
    976980        fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); 
    977981      else  
    978982        fragments.each(function(node) { parent.appendChild(node) }); 
    979983    } 
    980     else element.outerHTML = content.stripScripts()
     984    else element.outerHTML = stripped
    981985     
    982986    content.evalScripts.bind(content).defer(); 
    983987    return element; 
     
    994998Element._getContentFromAnonymousElement = function(tagName, html) { 
    995999  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; 
    9961000  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); 
    9981004    t[2].times(function() { div = div.firstChild }); 
    999   } else div.innerHTML = html; 
     1005  } else{ 
     1006    div.innerHTML = html; 
     1007    Element._fixAnchorsAfterUpdate(div, html); 
     1008  } 
    10001009  return $A(div.childNodes); 
    10011010}; 
    10021011 
     1012Element._fixAnchorsAfterUpdate = Prototype.K; 
     1013 
     1014//fix IE innerHTML issue with links and relative hrefs 
     1015if (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 
    10031029Element._insertionTranslations = { 
    10041030  before: function(element, node) { 
    10051031    element.parentNode.insertBefore(node, element);