Newsgroup: it.comp.lang.javascript
Titolo: inserire </BASE> via DOM

Ciao,
all'interno di una pagina html ho uno script che controlla se il
sorgente ha il tag <BASE> all'interno della sezione HEAD. Ciò che
vorrei è aggiungere - via DOM - il rispettivo tag di chiusura </BASE>.
Purtroppo:
- createElement non si può fare con </BASE> e <BASE></BASE> non crea
il tag di chiusura;
- l'innerHTML su HEAD non è ammesso;
- insertAdjacentHTML non ammette </BASE>;
- insertAdjacentElement non ammette </BASE>.
La pagina deve funzionare con IE6.
Vi ringrazio,

 vorrei è aggiungere - via DOM - il rispettivo tag di chiusura </BASE>.
Non devi. Il tag "base" non ammette il tag di chiusura in HTML4; e in
XHTML è considerato "empty", alla stregua di "br", "link" o "meta".
-- 
~ Neanche il futuro e' piu' quello di una volta.

 XHTML è considerato "empty", alla stregua di "br", "link" o "meta".
Ciao,
la pagina deve essere eseguita con IE6 e se non inserisco il tag di
chiusura tutto ciò che segue il <BASE> è considerato figlio di <BASE>
nel DOM.
Per una spiegazione approfondita puoi leggere 
http://mg.to/2006/04/29/your-body-is-in-your-head
.

 chiusura tutto ciò che segue il <BASE> è considerato figlio di <BASE>
Capisco; quindi riprendendo il tuo precedente post, se ho capito bene
vorresti aggiustare le pagine in cui è presente il tag "base" nel tag
"head" su Internet Explorer 6.
Per curiosità, questo comportamento di IE6 che problemi ti causa? Nel
layout? O in cos'altro?
Comunque, a naso un approccio potrebbe essere questo:
	function fixIE6BaseBehavior(){	
		var 	tagBase = document.getElementsByTagName("base")[0],
			tagHtml = document.getElementsByTagName("html")[0],
			nd = null;
 
		while ( (nd = tagBase.childNodes[0]) ){
			if ( nd.tagName == "BODY" ){												
				tagHtml.appendChild( nd );
			}else{
				tagBase.parentNode.insertBefore(nd,tagBase);
			}
		}
 
		tagBase.innerHTML = "";
 
	}
	window.onload = fixIE6BaseBehavior;
-- 
~ "Sono diventato un medico per le stesse ragioni di tutti:
Donne, soldi, potere, e donne." (Dr. Cox)

 vorrei è aggiungere - via DOM - il rispettivo tag di chiusura </BASE>.
C'è un errore concettuale in questa frase. Il DOM è un'albero. Non ci sono
"tag" nel DOM, ma elementi con certe relazioni gerarchiche. Aggiungere un
tag di chiusura via DOM è un'operazione che non ha senso. Se la mancanza di
"</base>" nel sorgente porta certi nodi ad essere erronamente figli di
"base", puoi usare le API del DOM per modificare le relazioni gerarchiche
esistenti (ad esempio, estraendo i children di 'base' e mettendoli dove
dovrebbero stare).
Max

 > vorrei è aggiungere - via DOM - il rispettivo tag di chiusura </BASE>.
Ciao,
la soluzione che ho trovato percorre una via che non è DOM. Prendo il
contenuto della pagina con l'innerHTML e su questo, con regular
expression, vado ad aggiungere il </BASE> per salvare poi il tutto.
Per completezza vi riporto le regular expression:
var re = new RegExp()
var reFineBase = new RegExp();
re = /(<BASE[^>]+href\s*=\s*"*[^"]*"*[^>]*\/>)/gi;
reFineBase = /<\/BASE>/gi;
if (reFineBase.test(temp_html) == false) {
temp_html = temp_html.replace(re, '$1' + '</BASE>');
}

 temp_html = temp_html.replace(re, '$1' + '</BASE>');
Qui c'è un errore. In pratica vai a cercare un <BASE href=... />, in
cui c'è lo slash finale di chiusura, ma poi ci accodi </BASE>, senza
prima rimuovere lo slash finale. Quindi ottieni una cosa tipo:
	<BASE href=
http://www.google.it
 /></BASE>
Che non è ciò che vuoi.
Bisogna inoltre andare a vedere dove si trova questo script, dove si
trova il tag BASE, e di quale elemento andrai a fare l'innerHTML: in
talune situazioni, IE6 te lo potrebbe impedire (vedasi i riferimenti
in memoria di cui sopra).
In ogni caso, dopo tutte la manipolazioni del caso, controlla che il
tag BASE non abbia più nulla al suo interno, giusto per sicurezza:
	alert( document.getElementsByTagName("base")[0].innerHTML );
Hope it helps.
-- 
~ "Un uomo è più 'grande' di un altro solo se sale sulle sue spalle."
(Bertold Brecht)