Skip to content

Instantly share code, notes, and snippets.

@shimondoodkin
Created January 7, 2013 15:47
Show Gist options
  • Select an option

  • Save shimondoodkin/4475979 to your computer and use it in GitHub Desktop.

Select an option

Save shimondoodkin/4475979 to your computer and use it in GitHub Desktop.
InnerHTML & setAttribute for ie6-ie8 that do not suffer from restriction
//innerHTML of these elements in internet explorer are read only:
//COL, COLGROUP, FRAMESET, HEAD, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR, SELECT.
//example:
// function createtable(deal)
// {
// var table = document.createElement('table');
// table.className='infotable';
// //table.innerHTML='<tbody><tr><td>123</td></tr></tbody>' // will not work in internet explorer
// setInnerHTML(table,'<tbody><tr><td>123</td></tr></tbody>')
// return table;
// }
// also:
// eltable.className = "infotable"; // works well in all browsers
// or
// setAttribute(eltable,'class',"infotable") // only if you need to use setAttribute for strange values like class.
//
var msie= navigator && navigator.userAgent.match( /MSIE/i )?true:false
var msiever=-1;if(msie){if (/MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(navigator.userAgent) != null) msiever = parseFloat( RegExp.$1 );}
function setAttribute(targetdomobj,name,value)
{
if(!msie ){targetdomobj.setAttribute(name,value); return;} // if not msie then it works normal
var attr = document.createAttribute(name);
attr.value = value;
targetdomobj.setAttributeNode(attr);
}
//in Internet explorrer you cant set innerHMTL to a table workaround: crate div, append a table, use the table ,delete the div
function setInnerHTML(targetdomobj,html)
{
if(!msie){targetdomobj.innerHTML=html; return;} // if not msie then it works normal
if(!setInnerHTML_holderobj)setInnerHTML_holderobj=document.createElement("div");
var holderobj=setInnerHTML_holderobj;
//innerHTML of these elements in internet explorer are read only:
//COL, COLGROUP, FRAMESET, HEAD, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR, SELECT.
//not fixed:
//, , FRAMESET, HEAD, HTML, STYLE, , , , , TITLE, .
//they .. can be fixed with document.write on iframe, for ie5.5 an existing one
//
var targettagname=targetdomobj.tagName.toUpperCase();
if(targettagname=="TR") //html.match( /^\s*\<TD/i)||html.match( /^\s*\<TH/i)
{
html='<table><tbody><tr>'+html+'</tr></tbody></table>'
holderobj.innerHTML=html;
setInnerHTML_replaceDomChildren(targetdomobj,holderobj,3)
}
else if(targettagname=="TBODY") //html.match( /^\s*\<TR/i)
{
html='<table><tbody>'+html+'</tbody></table>'
holderobj.innerHTML=html;
setInnerHTML_replaceDomChildren(targetdomobj,holderobj,2)
}
else if(targettagname=="TABLE") //html.match( /^\s*\<TBODY/i) || html.match( /^\s*\<TFOOT/i) || html.match( /^\s*\<THEAD/i) || html.match( /^\s*\<COLGROUP/i)
{
html='<table>'+html+'</table>'
holderobj.innerHTML=html;
setInnerHTML_replaceDomChildren(targetdomobj,holderobj,1)
}
else if(targettagname=="COLGROUP")//html.match( /^\s*\<COL/i)
{
html='<table><colgroup>'+html+'</colgroup></table>'
holderobj.innerHTML=html;
setInnerHTML_replaceDomChildren(targetdomobj,holderobj,2)
}
else if(targettagname=="SELECT")
{
html='<select>'+html+'</select>'
holderobj.innerHTML=html;
setInnerHTML_replaceDomChildren(targetdomobj,holderobj,1)
}
}
var setInnerHTML_holderobj;
function setInnerHTML_replaceDomChildren(targetdomobj,holderobj,level)
{
// emptytarget
while (targetdomobj.hasChildNodes())
targetdomobj.removeChild(targetdomobj.firstChild);
// move children from holder to target
if(level==1)
{
while (holderobj.firstChild.hasChildNodes())
targetdomobj.appendChild( holderobj.firstChild.removeChild(holderobj.firstChild.firstChild) );
}
else
if(level==2)
{
while (holderobj.firstChild.firstChild.hasChildNodes())
targetdomobj.appendChild( holderobj.firstChild.firstChild.removeChild(holderobj.firstChild.firstChild.firstChild) );
}
else
if(level==3)
{
while (holderobj.firstChild.firstChild.firstChild.hasChildNodes())
targetdomobj.appendChild( holderobj.firstChild.firstChild.firstChild.removeChild(holderobj.firstChild.firstChild.firstChild.firstChild) );
}
// empty holder object after use
while (holderobj.hasChildNodes())
holderobj.removeChild(holderobj.firstChild);
}
//
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment