Newsgroup: it.comp.lang.javascript
Titolo: [IE] Aggiungere un figlio se possibile...

Salve.
Torno a chiedere aiuto.
Ho la seguente problema.
Ho il solito editor di testo in WYSIWYG. Il problema arriva quando devo
applicare uno stile Hn (es H1, H2 ecc...).
Con il metodo parentTextElement riesco a recuperare il padre della
selezione. E' un metodo per IE ma nel mio caso va bene.
A questo punto io potrei fare una cosa veloce tipo:
padre.innerHTML = '<H1>' + padre.innerHTML + '</H1>';
La cosa funziona però solo se padre ammette l'inserimento di un nodo
H1. Se per esempio con come padre P, la cosa non può essere eseguita.
Quindi chiedo a voi come possa fare in modo di andare a ritroso
nell'albero e poter trovare il primo padre che possa contenere il
figlio Hn.
Situazione di esempio:
<div>
  <p> Ciao sono io </p>
  <p> <b> Ciao, sei tu </b> </p>
</div>
In pratica selezionando applicando ad entrambi i testi dovrebbe venire
fuori qualcosa come:
<div>
  <h1> <p>Ciao sono io</p> </h1>
  <h2> <p> <b> Ciao, sei tu </b> </p> </h2>
</div>
Vi ringrazio per l'eventuale aiuto.

Scusate l'italiano ma stavo scrivendo con un prof che mi stava
cacciando dall'aula.
Ad ogni modo il problema è capire quale sia il nodo che secondo il DTD
permette l'inserimento del nodo H.
Nell'esempio un nodo H dentro uno P non è possibile. Quindi dovrei
andare a ritroso e trovare il primo nodo che mi permetta di
aggiungergli come figlio il nodo H e quindi inserirvi i figli
precedenti.
Nell'esempio sopra dovrebbe andare a ritroso fino al DIV e quindi
aggiungergli i figlio H e ad H appendergli come figlio, il vecchio
figlio P (con figli al seguito).
Grazie e alla prossima...

 </div>
Presupponendo che "padre" sia il primo "P", e andando a ritroso fino a 
incontrare "div", applicando il codice da te scritto otterresti:
<div>
	<h1><p>Ciao sono io </p>
	<p><b>Ciao, sei tu </b> </p></h1>
</div>
Anche se è un po' una cosa da "teppisti", per ottenere il risultato che 
vuoi potresti fare la seguente cosa (mai provata).
Con padre "P":
	padre.outerHTML="<h1>"+padre.outerHTML+"</h1>";
Ma sinceramente ti consiglio di dare un'occhiata ai metodi dell'oggetto 
textRange, c'è sicuramente un modo per rendere più "pulito" il processo.
Per quanto riguarda invece lo scorrere a ritroso per capire se un dato tag 
può contenerne un'altro, sta a te. Devi scrivere tu a livello di codice js 
ciò che dice la DTD e permettere in base al tag che vuoi inserire se può 
essere contenuto nel punto in cui vuoi metterlo, e se può avere come figli 
i tag che hai selezionato in quel momento.
-- 
~ Solo la stupidità umana può dare l'idea dell'infinito.



Scusate il triplo post ma avevo problemi con la wireless e mi ha
spedito il messaggio 3 volte.
Per quanto riguarda il problema, ti ringrazio per le dritte. Alla fine
però ho propenso per un controllo manuale dei tag che permettono di
avere il tag H e quindi vado a ritroso fino a quando non ne trovo uno.
Una soluzione poco pulita ma efficace.
Ciao e alla prossima...

 Una soluzione poco pulita ma efficace.
Che è la stessa cosa che ti ho detto io:
"Per quanto riguarda invece lo scorrere a ritroso per capire se un dato tag 
può contenerne un'altro, sta a te."
Ciò che ho focalizzato nel post precedente non era la ricerca a ritroso del
tag, quanto il codice per l'inserimento del tag H una volta appurato che
può essere contenuto nel tag in questione.
Se rileggi gli esempi che tu hai fatto, l'uso di innerHTML dà un esito
diverso da quello che ti aspetteresti, e quindi non va bene come soluzione.
Ti ho suggerito, in quel particolare contesto, di usare outerHTML, ma come
ti ho scritto sarebbe sicuramente meglio usare i metodi dell'oggetto
TextRange invece che queste cose.
