Algunos trucos para IE

3 Oct

Internet Explorer no cesa de sorprenderme. Los últimos dos temas que tuve, fueron con la función javascript addEvent, y con la función .innerHTML.

Respecto a addEvent, algunas versiones de IE revientan como una chinche cuando se carga la página, sin dar mayores explicaciones. La solución entonces, está en cambiar addEvent por attachEvent. No tengo muy clara la diferencia, peo con attachEvent IE se queda contento.

El otro tema fue al querer usar en una función javascript innerHTML para cargar las opciones de un select. Explorer corta el primer option. Parece que es un bug que está abierto desde hace unos 7 años. La solución, que encontré por acá:

http://elmicoxcodes.blogspot.com/2007/02/innerhtml-and-select-option-in-ie.html

Consiste en lugar de usar innerHTML, usar la función de más abajo. De manera que si antes teníamos:

document.getElementById(“my_select”).innerHTML = “<option value=’1′>not</option> <option value=’2′>work</option>”;

Ahora tendríamos:

var inner = “<option value=’1′>Now</option> <option value=’2′>work</option>”;
select_innerHTML(document.getElementById(“my_select”),inner);”


La función maravillosa:

function select_innerHTML(objeto,innerHTML){
 /******
 * select_innerHTML - corrige o bug do InnerHTML em selects no IE
 * Veja o problema em: http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
 * Versão: 2.1 - 04/09/2007
 * Autor: Micox - Náiron José C. Guimarães - micoxjcg@yahoo.com.br
 * @objeto(tipo HTMLobject): o select a ser alterado
 * @innerHTML(tipo string): o novo valor do innerHTML
 *******/
 objeto.innerHTML = ""
 var selTemp = document.createElement("micoxselect")
 var opt;
 selTemp.id="micoxselect1"
 document.body.appendChild(selTemp)
 selTemp = document.getElementById("micoxselect1")
 selTemp.style.display="none"
 if(innerHTML.toLowerCase().indexOf("<option")<0){//se não é option eu converto
 innerHTML = "<option>" + innerHTML + "</option>"
 }
 innerHTML = innerHTML.toLowerCase().replace(/<option/g,"<span").replace(/<\/option/g,"</span")
 selTemp.innerHTML = innerHTML
for(var i=0;i<selTemp.childNodes.length;i++){
 var spantemp = selTemp.childNodes[i];
if(spantemp.tagName){
 opt = document.createElement("OPTION")
if(document.all){ //IE
 objeto.add(opt)
 }else{
 objeto.appendChild(opt)
 }
//getting attributes
 for(var j=0; j<spantemp.attributes.length ; j++){
 var attrName = spantemp.attributes[j].nodeName;
 var attrVal = spantemp.attributes[j].nodeValue;
 if(attrVal){
 try{
 opt.setAttribute(attrName,attrVal);
 opt.setAttributeNode(spantemp.attributes[j].cloneNode(true));
 }catch(e){}
 }
 }
 //getting styles
 if(spantemp.style){
 for(var y in spantemp.style){
 try{opt.style[y] = spantemp.style[y];}catch(e){}
 }
 }
 //value and text
 opt.value = spantemp.getAttribute("value")
 opt.text = spantemp.innerHTML
 //IE
 opt.selected = spantemp.getAttribute('selected');
 opt.className = spantemp.className;
 }
 }
 document.body.removeChild(selTemp)
 selTemp = null
 }

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: