Newsgroup: it.comp.lang.javascript
Titolo: Lavorare su elements annidati

Salve a tutti,
dovrei fare alcune trasformazioni sul del testo nel momento in cui questo 
viene visualizzato sulla mia pagina. Parto da una situazione di questo tipo:
<td id="include">
  testo 1, testo 2, testo 3
  <a href="
http://www.sitoutente.it
" id="exclude1">sito utente</a>
  testo a, testo b, testo c
</td>
Dovrei accedere da javascript all'elemento con id "include" e fare, che sò, 
un toUpperCase() del suo contenuto (e fin qui nessun problema); vorrei però 
escludere dalla mia trasformazione gli n href che potrei incontrare per 
arrivare ad un risultato come questo (dove l'href rimane invariato):
<td id="include">
  TESTO 1, TESTO 2, TESTO 3
  <a href="
http://www.sitoutente.it
" id="exclude1">sito utente</a>
  TESTO A, TESTO B, TESTO C
</td>
Esiste qualche soluzione 'elegante' a proposito?
Grazie,
Claudio 

 Claudio
Prego. :)
-- 
"When you have eliminated the impossible, whatever remains, however
improbable, must be the truth."

 e` lasciar da parte javascript. I CSS esistono proprio per questo:
No, purtroppo parlavo di toUpperCase() giusto per fare un esempio, in
realtà la mia trasformazione esegue un operazione di replace tramite
regexp e volevo appunto evitare che tra trasformazione riguardasse i
possibili href che andrei ad incontrare.
Grazie

 possibili href che andrei ad incontrare.
Andrebbe capito allora se il testo e` contenuto solo nell'elemento td,
o se ci sono altri sottonodi che devi considerare. Intendo dire se hai
questa casistica:
 
	<td>foo bar<a href="#">link</a>bar foo</td>
Oppure questa:
	<td>foo bar<a href="#">link</a>bar <em>foo</em></td>


 <td>foo bar<a href="#">link</a>bar <em>foo</em></td>
Ho la prima casistica nel senso che non ho altri sottonodi, al max potrei 
trovare piů href:
<td>foo bar<a href="#1">link1</a>bar foo bar <a href="#2">link2</a> foo bar 
foo bar</td>
Grazie,
Claudio 

 possibili href che andrei ad incontrare.
Potresti adottare una soluzione di questo tipo:
<html>
<head>
<script type=text/javascript>
window.onload=function() {
var yy=document.getElementById("match").innerHTML.replace(/(\d+|(<.*>))|(<.*>)/g,"$2").replace(/\w+/g,function(aa){return aa.substr().toUpperCase()}).replace(/(<.*>)/g,function(bb){return bb.substr().toLowerCase()});
document.getElementById("match").innerHTML=yy;
}
</script>
</head>
<body>
<table>
<tbody>
<tr>
<td id="match">testo 1, testo 21, testo 3
<a href="
http://www.sitoutente.it
">utente 14 utente 5</a>
testo 63, testo 7, testo 8</td>
</tr></tbody></table>
</body></html>
-- 
    * b *
  *   y   *
*   Piero   *
[ /panem et circenses/ ] 

 foo bar</td>
Prova una cosa del genere:
     function up(node){
         node.nodeValue = node.nodeValue.toUpperCase();
     }
     var nds = document.getElementById("include").childNodes;
     for(var i = 0; (nd = nds[i++]); nd.nodeType==3 && up(nd) );
In pratica ti recupera i nodi figli dell'elemento con ID pari a
"include", ed esegue la funzione up() per ciascuno dei textnode
che trova.
Ovviamente la funzione up() puo` fare ben altre operazioni, che
il semplice upperCase.


 Potresti adottare una soluzione di questo tipo:
Direttamente dall'UCAS, eh? :)
Stai attento, mi sa che sei fin troppo vicino all'antipattern "Golden 
Hammer".. :)


 il semplice upperCase.
Grazie mille ZERO, è esattamente quello che mi serviva!
Peraltro studiando il tuo codice ho scoperto funzionalità del DOM
utili che non conoscevo affatto (a partire dalle costanti nodeType
come il TEXT_NODE che hai utilizzato).
Grazie ancora,
Claudio

 document.getElementById("match").innerHTML=yy;}
Grazie Piero

 il semplice upperCase.
Infatti, usando le regexp come ha richiesto l'OP. :-)
-- 
    * b *
  *   y   *
*   Piero   *
[ /carpe diem/ ] 

 Hammer".. :)
Che significa?
-- 
    * b *
  *   y   *
*   Piero   *
[ /rebus sic stantibus/ ] 




 Infatti, usando le regexp come ha richiesto l'OP. :-)
No, l'OP non ha chiesto affatto di usare le regexp. :)
Leggiti meglio i suoi post, e ti sara` piu` chiaro.


 Claudio
Figurati. :)


 (difficile manutenibilita`, perdita di informazioni, etc).
Ho scritto due (2) righe di codice, compresa la regexp, per fare un
replace del testo della cella ignorando l'ancora, la cito:
var aa=document.getElementById("match").innerHTML.replace(/(\d+|(<.*>))/g,"$2");
document.getElementById("match").innerHTML=aa;
semplice e pulito. :-)
Si possono matchare n celle con testo diverso e regexp diverse, certo
per ogni cella servono due righe di codice, ma se il tuo script consente
di fare le stesse cose con minor codice, tanto meglio.
Chiedo conferma, perché non arrivo a capirlo.
    ...skipped!
-- 
    * b *
  *   y   *
*   Piero   *
[ /ad audiendum verbum/ ] 

 Leggiti meglio i suoi post, e ti sara` piu` chiaro.
.............. _*Beginning of the citation*_ ..............
No, purtroppo parlavo di toUpperCase() giusto per fare un esempio, in
realtà la mia trasformazione esegue un operazione di replace tramite
regexp e volevo appunto evitare che tra trasformazione riguardasse i
possibili href che andrei ad incontrare.
............... _*The end of the citation*_ ...............
-- 
    * b *
  *   y   *
*   Piero   *
[ /cogito ergo sum/ ] 

 ............... _*The end of the citation*_ ...............
Scusa, ma che stai dicendo? :) Ti sei *letto* i post dell'OP? Da quello
Esatto. La *sua* trasformazione, ovvero la regexp da applicare ai nodi,
lui gia` ce l'ha. Gli serviva un metodo per applicarla. Non gli serviva
un'altra regexp.
Se ancora non sei "convinto", ti basta leggere l'ultimo suo post in cui
dice che l'approccio da me proposto e` esattamente quello che serviva.


 Chiedo conferma, perché non arrivo a capirlo.
Te lo sto provando a spiegare, ma evidentemente non ci intendiamo...
P.S.
Te lo sei andato a leggere l'antipattern Golden Hammer? :)


 Te lo sei andato a leggere l'antipattern Golden Hammer? :)
Si ho letto, il martello è l'attrezzo che a volte riesce a risolvere i
casi più difficili. ^_^
Direi che riguarda anche questo post, *avendo solo quello*, anch'io
cerco di usarlo con tutto, proprio come si fa con i chiodi. :-)
-- 
    * b *
  *   y   *
*   Piero   *
[ /ad maiora/ ] 

 dice che l'approccio da me proposto e` esattamente quello che serviva.
Certo che l'ho letto, ma il nostro sta diventando un dialogo fra sordi.
Ribadisco, che anche con il tuo script non puņ fare a meno delle regexp.
Questo č quello che indendevo affermare, tutto qui.
-- 
    * b *
  *   y   *
*   Piero   *
[ /rebus sic stantibus/ ] 

 Ribadisco, che anche con il tuo script non può fare a meno delle regexp.
Se DEVE applicare una regexp, ovvio che non puo` farne a meno! Ma
il mio codice non fa uso di RegExp per iterare i nodi; e funziona
benissimo anche senza usare regexp (difatti io non le ho usate ma
sono state tranquillamente introdotte dall'OP.. E qui si torna al
discorso di manutenibilita` e pulizia).
Il discorso verteva sull'uso che tu hai fatto delle RegExp, e non
sulle RegExp in generale. Le usi ovunque anche per compiti per le
quali non dovrebbero essere usate, ne` sono state concepite.
Da qui il discorso sul Golden Hammer. :)
P.S.
Spero che con questo post ci si sia chiariti un poco di piu`; non
sto a risponderti anche all'altro.
Se cosi` non fosse, invece, e/o desideri che ti risponda anche al
secondo, direi di "integrarlo" in questo in modo da non avere due
post paralleli sullo stesso thread. :)


 post paralleli sullo stesso thread. :)
Visto che me lo chiedi, rinnovo la richiesta fatta nell'altro post.
.............. _*Beginning of the citation*_ ..............
volevo solo capire, magari vedendo un esempio funzionante come questo:
............... _*The end of the citation*_ ...............
Potrei imparare qualcosa di nuovo vedendo il tuo script applicato al
contenuto della stessa <table>.
Non darmi un link da studiare, mi son preso la briga di studiare un po'
le regexp solo perché sono stato affascinato dalla loro potenza che
permette di fare cose che hanno (per me) dell'incredibile. :-?
Se fai quell'esempio ti ringrazio, diversamente possiamo chiudere qui.
-- 
    * b *
  *   y   *
*   Piero   *
[ /ad audiendum verbum/ ] 

 Se fai quell'esempio ti ringrazio, diversamente possiamo chiudere qui.
Hope it helps.


 Hope it helps.
Ti ringrazio per averci provato, ma come vedi non sono riuscito a farlo
funzionare. Why? Mi serve un altro aiuto.
Considera che di JS ho frequentato (con scarso profitto) solo le scuole
Elementari. :-/


 Elementari. :-/
Ahah, sciocchino. :P


 <input type="button" onclick="removeDigitsFromNodes()" value="remove" />
Perfetto, thanks! :-)
    ...skipped!
-- 
    * b *
  *   y   *
*   Piero   *
[ /beati monocoli in terra caecorum/ ]