I bug di IE paiono non avere fine, in questi giorni ne ho scoperti addirittura 3 riguardanti solamente il document object model. Dovrei aprire un blog al riguardo
Vediamoli uno ad uno e come possono essere risolti.
Bug 1: document.getElementById non fa distinzioni tra gli attributi name e id.
Il document.getElementById di Internet Explorer ( Opera idem ) è soggetto a un grave errore, ovvero quello di prendere l’elemento anche dall’attributo name. Ciò può essere motivo di confusione: se ad esempio abbiamo un elemento div con id="description", il getElementById potrebbe prendere invece il tag meta con name="description".
Workaround
Creiamoci una funzione che controlli se l’elemento preso ha veramente un id uguale alla stringa passata:
-
document.$getElementById =(function() {
-
if(document.all)
-
return function(id) {
-
var el = document.getElementById(id);
-
if(el.id == id)
-
return el;
-
for(var i = 0, l = document.all.length; i!=l; i++) {
-
if(document.all[i].id == id) return document.all[i];
-
}
-
}
-
else return function(id) {
-
return document.getElementById(id)
-
}
-
})();
Bug 2 ( risolto in IE7 ): i nodi commento hanno una proprietà tagName.
Questo è veramente divertente. Secondo IE6 e IE5 i nodi commento sono degli elementi html! Essi hanno persino una proprietà tagName uguale a "!", il chè nessuno ha mai capito cosa significhi. Fatto stà che passando il selettore universale "*" al metodo document.getElementsByTagName i nodi commento verranno inclusi nella NodeList restituita.
Workaround
Bisogna verificare che la proprietà nodeType sia uguale a 1. In alternativa è anche possibile controllare che la proprietà tagName sia diversa da "!".
-
document.$getElementsByTagName =(function() {
-
if(navigator.appName == "Microsoft Internet Explorer" && !XMLHttpRequest)
-
return function(tag) {
-
var elems = document.getElementsByTagName(tag);
-
if(tag != "*") return elems;
-
for(var i = 0, l = elems.length, res = []; i!=l; i++) {
-
if(elems[i].nodeType == 1) res.push(elems[i]);
-
}
-
return res;
-
}
-
else return function(tag) {
-
return document.getElementsByTagName(tag)
-
}
-
})();
Bug 3: non è possibile utilizzare l’operatore delete su elementi html.
L’operatore delete è l’unico modo per cancellare una proprietà di un oggetto definitivamente ( settarla a null o ad undefined non lo fa ). Potrebbe essere molto utile con gli elementi html per settare dei flag temporanei ed eliminarli una volta terminato il ciclo. Purtroppo delete funziona solo su discendenti della classe nativa Object, e guarda caso gli elementi html in IE non soddisfano questo requisito.
Workaround
La soluzione esiste anche in questo caso ma è alquanto sporca. L’unico modo per un elemento html di avere una proprietà cancellabile definitivamente è quello di usare gli attributi. Il mio consiglio è, se proprio volete usare questa soluzione, cercate di inventarvi nomi complicati pieni di trattini che nessuno possa sovrascrivere per sbaglio.
-
//Non funziona con IE
-
var el = document.getElementById("el");
-
el.prop = "value";
-
try {
-
delete(el.prop);
-
} catch(err) {
-
alert("Stai di certo usando IE");
-
}
-
-
//Metodo alternativo e funzionante con IE
-
var el = document.getElementById("el");
-
el.setAttribute("prop", "value");
-
el.removeAttribute("prop");
-
alert("prop" in el.attributes); //E’ false anche in IE
La lista è ancora lunga. E ciò a dire il vero mi fa un pò paura.