Originariamente inviato da andr3a
non so quanto sia "old", non so quanti abbiano risolto ... mentre facevo una pagina di demo per un parser mi sono accorto del fastidiosissimo problema del tag PRE su IE.

Il sunto è questo:
codice:
<pre id="test"></pre>
<script type="text/javascript"><!--//
	document.getElementById("test").innerHTML = "hello\nworld";
//--></script>
una cosa tanto banale quanto non scontata come risultato, la scritta diventa "hello world" in linea su tutti gli IE, dal 4 al 7.

Come risolvere ?
Leggendo in rete ho visto soprattutto tricks che sfruttano innerText, con altri tricks che sfruttano altri metodi per rendere innerText compatibile con Netscape o browsers che non lo supportano.

Il problema di innerText
se usate questo metodo una sola volta, andate tranquilli, se riusate innerText per 2 volte, andate (o meglio mandate) a benedire il pre, soprattutto se ci sono tags come strong, span o altro al suo interno, questi vengono mostrati.

... e quindi ? Come risolvere ?
Semplicemente sfruttando il fatto che IE è stupido, quindi senza scomodare tutti gli altri che si comportano come dei browsers, quali sono, a differenza di IE, che ha sempre avuto, e probabilmente sempre avrà, dei comportamenti anomali (leggi fa schifo).

Prendere in giro IE ? ... basta outerHTML
codice:
<pre id="test"></pre>
<script type="text/javascript"><!--//
	function ie() {
		var	browser = navigator.userAgent.toUpperCase();
		return (browser.indexOf("MSIE") >= 0 && browser.indexOf("OPERA") < 0);
	};
	if(!ie())
		document.getElementById("test").innerHTML = "hello\nworld";
	else
		document.getElementById("test").outerHTML = "<pre id=\"test\">hello\nworld</pre>";
//--></script>
Facile ?
piccola aggiunta, se la compatibilità con IE 4 non interessa si puo' fare cosi':
compatibile con IE 5+
(il 7 non so come ragiona, ma finche' non viene rilasciato lo includiamo, in realtà se supportasse il comportamento standard basterebbe cambiare il commento condizionale

usiamo il commento condizionale cosi' non occorre sniffare IE:


codice:
/*@cc_on
if(0)
@*/
document.getElementById("test").innerHTML= "hello\nworld";
/*@cc_on
document.getElementById("test").outerHTML="<pre id=\"test\">hello\nworld</pre>";
@*/
ps: questo metodo ha uno svantaggio PERDE tutti gli attributi di pre, quindi bisognerebbe riscriverli con una for in

ps2:volendo si puo escludere il 1o commento ovvero
codice:
/*@cc_on
if(0)
@*/