Uno de los inconvenientes que pueden presentar las aplicaciones AJAX es que para presentar el código HTML, suelen hacer uso de la propiedad innerHTML, la cual si bien está soportada por los principales navegadores, no es estándar sino un invento de Microsoft.

Si bien usar innerHTML en sí no es una mala opción, puesto que se obtienen resultados satisfactorios, surge el hecho de que aún no es estándar, y por ese motivo, podría pretenderse buscar una alternativa.

En este caso, mostraré un ejemplo usando el método DOMParser, y su equivalente en entornos Microsoft, el objeto ActiveX DOMDocument.

Para cargar el XML, el método DOM y el ActiveX de Microsoft utilizan métodos distintos, parseFromString y loadXML respectivamente.

Luego, estas funciones devuelven un documento ya procesado, con todos sus métodos DOM.

La implementación multiplataforma de éstos sería la siguiente:


DocParser=function() {
var xmlDOM=null;
if (window.DOMParser) {
xmlDOM = new DOMParser();
} else if (Web.Application.get_type() == Web.ApplicationType.InternetExplorer) {
var progIDs = [ 'Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.3.0'];
for (var i = 0; i < progIDs.length; i++) {
try {
xmlDOM = new ActiveXObject(progIDs[i]);
xmlDOM.parseFromString=function(s) {
this.loadXML(s);
}
} catch (err) {;};
}
}
return xmlDOM;
};

Luego, el código que anteriormente era x.innerHTML=msg; deberá reemplazarse por lo siguiente:

var doc=DocParser();
doc.parseFromString("<xml>"+msg+"</xml>","application/xml");
while (x.hasChildNodes())  x.removeChild(x.lastChild); /* Se limpia todo lo que tenía antes */
while (DOMParser.childNodes.length) {
x.appendChild(x.importNode(doc.childNodes[0], true));
doc.removeChild(doc.childNodes[0]); /* Se elimina el primer hijo de doc, después de agregarse a la capa x */
}

De esta forma, tenemos, aunque más compleja, una implementación casi estándar de la funcionalidad de innerHTML.

Espero que resulte útil.