Newsgroup: it.comp.lang.javascript
Titolo: Cross-Nodo [rilevamento]

Smanettando un pò con il DOM1 ho scritto qualche riga per cercare di
ottenere un risultato comune nel rilevare un nodo con IE ed NN6..........il
risultato è sotto.........magari è una gran c****a ...cmq.........ditemi
qualcosa......
(l'esempio è sui nodi del body)
<html>
<head>
<title>test</title>
<script language="javascript">
var cc=new Array();
function normal(){
bd=document.body
qt=bd.childNodes.length
for(i=0; i<qt; i++){
aa=bd.childNodes[i].nodeType;
bb=bd.childNodes[i].data;
if((aa==3) && (bb==0) ){
cc[i]=bd.childNodes[i]=bd.childNodes[(i+1)]
}
else {
cc[i]=bd.childNodes[i]
alert(cc[i].nodeName)
}
}
}
</script>
</head>
<body onLoad="normal()">
cc
<p align="left">sssssssssssssssssssssssssss</p>
<p align="left">sssssss</p>
<p>&nbsp;</p>
<p>fffffffffffffffffffffffffffffff</p>
<p>vvvvvvvvvvvvvvvvvvvvvvvvvvvvv<br>
<br>
jjjjjjjjjj</p>
</body>
</html>

(l'esempio è sui nodi del body)
bello!
 e prendere il coraggio a due mani e farglieli togliere di brutto? (
copia e incolla: possibili linee interrotte da ricomporre)
<html>
<head>
<title>test</title>
<script language="javascript">
bottoneverifica=false
var cc=new Array();
function normal(){
bd=document.body
ni=qt=bd.childNodes.length
alert("numero nodi iniziali = "+qt)
for(i=0; i<qt; i++){
aa=bd.childNodes[i].nodeType;
bb=bd.childNodes[i].data;
if((aa==3) && (bb==0) ){
/*rimuove il nodo se di natura testo privo di contenuto*/
alert("questo  lo tolgo fino a quando non scopro a che
serve..."+bd.childNodes[i].nodeName);
document.body.removeChild(bd.childNodes[i]);qt-=1
}
else {
cc[i]=bd.childNodes[i]
alert(cc[i].nodeName)
}
}
if(ni!=qt)
alert("se ci sono riuscito ho rimosso "+eval(ni-qt)+" nodi testo
misteriosi");bottoneverifica=true}
</script>
</head>
<body onLoad="normal()">
cc
<p align="left">sssssssssssssssssssssssssss</p>
<p align="left">sssssss</p>
<p>&nbsp;</p>
<p>fffffffffffffffffffffffffffffff</p>
<p>vvvvvvvvvvvvvvvvvvvvvvvvvvvvv<br>
<br>
jjjjjjjjjj</p><form>
<input type=button
onclick=bottoneverifica?normal():alert('aspettalesecuzioneautomatica!')
value="riprova a far girare la funzione per vedere se ha avuto
successo">
</form>
</body>
</html>

 copia e incolla: possibili linee interrotte da ricomporre)
Interessante, ma non e' che cosi' facendo otteniamo un degrado delle
performance del browser? Va da se' che questa e' una pagina di prova,
composta da poche righe, ma se lo stesso codice viene eseguito in una pagina
di codice *reale*, con qualche centinaio di righe di codice, se non di piu'?
Conviene davvero alla fin fine..? :?
Inoltre, il problema viene effettivamente risolto, oppure no? Cioe',
l'algoritmo in questione elimina solo i figli relativi al body, sbaglio?
Quindi - ad esempio - in una tabella o simili, i nodi #text "inutili"
continuano a persistere.
Fare una ricorsione non mi sembra il caso, allora si' che le prestazioni
cadrebbero in modo spaventoso, IMVHO. :/


Anche questo puň essere vero......
cmq puň essere  sempre valida la prima (verifica)...........cioč rilevare
solo quelli che ci interessano e "saltare" gli altri
e puň essere applicata con un paio di modifiche a tutti i nodi.......basta
impostare invece del "bd=document.body",
"bd=document.getElementById(quale)" per richiamare l'elemento di cui si
vogliono trovare i nodi reali , non pensi??
Il mio dubbio invece č sulla creazione dinamica degli elementi.......cioč se
io creo degli elementi e parti di essi e li inserisco in prima o dopo altri,
come si modifica poi il controllo per verificare nuovamente il riferimento
ai nodi???
Lo chiedo perchč non ho avuto tempo di provare....
Pippopd mi ha mandato uno script che ha fatto lui che rileva i tre livelli
di nodi sottostanti ad un elemento e ne restituisce le caratteristiche in
una tabella............
Con IE č perfetto...adesso lo stŕ controllando per NN6.........cmq si
potrebbe prendere un pň di spunti da ognuno di noi e mettendoli insieme
forse qualcosa di buono ne esce...........
Cosě realizziamo un ulteriore tutorial a nome di tutti , per completare
l'argomento.....
 cosa ne pensate??
andreotta fabiano
WebMŞster ATI POWER s.n.c.
andr...@atipower.it
http://www.atipower.it
http://www.aticommerce.com
http://www.afdsoftware.freeweb.org
http://www.jsdir.com
http://www.javascript.3000.it

 l'argomento.....
Ancora non ho capito qual'e' la problematica da risolvere. ;)
Mi spiego: Abbiamo visto come viene gestito il DOM da parte di NN6.0 in
questi casi. Ora, l'unico modo per ottenere gli stessi effetti in entrambi i
browser, e' aggiungere un livello di astrazione a cui fare riferimento, in
modo tale che si ottengano gli stessi oggetti come risultato.
Questo, IMVHO, e' l'unico modo per ottenere un discorso del genere senza un
calo di performance o spreco di risorse.
Il punto cmq e' che tutte queste cose, cmq, non hanno un corrispettivo
effettivo in altri browser, come NS 4.x ...

non ci interessano.
E c'è ancora un punto che va assodato secondo me.
Una pagina costruita dinamicamente co script, da NN6, dove non si dice
esplicitamente di andare a capo o di aggiungere spazi dopo un tag, il
nodo #text vuoto c'è o no? a naso direi di no, ma non ho provato. e in
una pagina costruita sul server?
E' questo che mi lascia perplesso nel comportamento di NN: che risente
pesantamente di una cosa che finora non ha mai rilevato: la pura
disposizione del codice

 Ancora non ho capito qual'e' la problematica da risolvere. ;)
Niente .....intendevo mettere insieme 4 righe di script da poter "proporre"
come base d'utilizzo per riconoscere i nodi (almeno finchè e se cambiano le
cose)che ci interessano senza dover di nuovo fare codice per IE e altro
codice per NN6........
andreotta fabiano
WebMªster ATI POWER s.n.c.


codice per NN6........
Infatti,  se si fa un appendChild, non sarebbe rassicurante sapere che
i due browser assegnino al nostro figlioletto appeso la stessa
posizione nell' array? altrimenti bisogna assegnare a tutti un id per
essere certi di pescarlo con esattezza o mi sbaglio?

 ha scritto nel messaggio
news:3a1e6a5f...@news.iunet.it...

infatti ......oltre che si incasinerebbe il codice nel tentativo di
ripescare gli elementi ,
 se si parla di una pagina "piena", ........
mentre l'identificazione sicura del nodo e il riferimento tramite un array è
la soluzione migliore.
Per quanto mi sembra d'aver capito teoricamente ci sarebbe  "item[n]" come
array di nodi figli  per l'identificazione degli stessi , ma cmq non è
supportato da nessun browser.......

 essere certi di pescarlo con esattezza o mi sbaglio?
Io penso che in fin dei conti sia la cosa migliore da fare. Non ho ancora
avuto modo di testare un paio di cose su NN6.0 relativo al discorso che
stiamo facendo, ma penso che sia meglio organizzare dando ad ogni oggetto
che ci interessa realmente un id.
E, obiettivamente, non vedo cosa ci sia di male. E' anzi la procedura piu'
giusta e corretta da fare, senza dimenticare che da' inoltre un codice
sicuramente piu' leggibile e "parlante". Posso capire che talvolta sia
meglio usare un indice, ma tanto - una volta recuperato un oggetto tramite
tag id - e' possibile saperne anche l'indice all'interno della gerarchia
(almeno in IE, in NN6.0 ancora non ho provato sinceramente).

 supportato da nessun browser.......
Non ho afferrato il tuo discorso. Cosa intendi?


forse non ho capito cosa intendi......
ma se non si vogliono fare Km di codice, quando crei gli elementi
dinamicamente, la necessità di avere una funzione a cui passare una o più
variabili con un ciclo che "spazzola" un'array di nodi (esempio il valore
delle option di un select dinamico) per assegnarne i rispettivi valori  è
una cosa tutt'altro che casuale ............
Diversamente nella gestione di elementi (se pur inseriti dinamicamente) ma
con valori predefiniti è sicuramente meglio fare riferimento ad un id.......



Se non ho capito male ...........
esempio.......
document.getElementsByTagName( 'p').item[3]
accede al quarto paragrafo del documento indipendentemente dal
browser.........solo che ne IE ne NN6 lo accettano....
facendo riferimento all'xml......
objDocumentNode=xmlNodeList.item(n)


 con valori predefiniti è sicuramente meglio fare riferimento ad un
id.......
Qui ci stiamo bene o male dando la ragione addosso. :)

 browser.........solo che ne IE ne NN6 lo accettano....
Perche' sbagli la sintassi.
getElementByTagName ti restituisce una NodeList. Quindi, per avere il quarto
paragrafo del documento:
var pList=document.getElementByTagName("p");
alert (p[3]);

 objDocumentNode=xmlNodeList.item(n)
infatti cos'ì invece funziona con tutti e due i browser......
sa=document.getElementsByTagName('div').item(1).childNodes[0].nodeValue
alert(sa)


Finchè li creo tutto ok......ma quando voglio sostituire il valore delle
option senza cancellare e ricreare l'elemento(vedi ultima parte del codice)
lo faccio tramite l'array dei nodi........ok, qui funziona......ma perchè è
una cosa molto semplice....
Forse mi stò perdendo in un biccher d'acqua , ma come fai a passare un'array
di  "id" ai quali devi assegnare valori diversi tramite un ciclo in questo
modo...........document.getElementById(nome[i]) ....non funziona!!!
<html>
<head>
<title>test</title>
<script language="javascript">
//--and...@atipower.it--
//--
http://www.jsdir.com--
//-------------------------
function crea(zz){
lprov= new Array();
lprov[0]="SCEGLI";
lprov[1]="sondrio";
lprov[2]="milano";
aa=lprov.length;
eprov=new Array();
eprov[0]="SCEGLI";
eprov[1]="Rimini"
eprov[2]="Parma"
bb=eprov.length;
prov=new Array();
prov[0]=lprov;
prov[1]=eprov;
cc=prov.length
quante=new Array();
quante[0]=aa;
quante[1]=bb;
hh=prov[zz]
pp=quante[zz]
if(document.getElementById){
if(!document.getElementById('nuovo')){
var newElem =document.createElement("select");
newElem.id="nuovo";
document.getElementById('form').appendChild(newElem)
for(i=0; i<pp; i++){
var newElem1= document.createElement("option");
newElem1.setAttribute('value',i);
var newText1 = document.createTextNode(hh[i]);
newElem1.appendChild(newText1) ;
document.getElementById('nuovo').appendChild(newElem1)
}
}
else {
if(zz !=""){
document.getElementById('nuovo').style.display=""
for(i=0; i<pp; i++){
var newText2 = document.createTextNode(hh[i]);
document.getElementById('nuovo').childNodes[i].childNodes[0].nodeValue=hh[i]
;
}
}
else{
document.getElementById('nuovo').style.display="none"
}
}
}
}
</script>
</head>
<body>
<form method="POST" id="form">
  <p><select size="1" name="D1"
onChange="crea(this.options[this.selectedIndex].value)">
    <option selected value="">SCEGLI REGIONE</option>
    <option value="0">Lombardia</option>
    <option value="1">Emilia</option>
  </select></p>
</form>
</body>
</html>


solo NN6
niente punto primadel numero
<HTML>
<HEAD>
<TITLE> type_Document_Title_here </TITLE>
</HEAD>
<BODY>
<P></P><P></P><P id=tre></P>
<script language="javascript">
alert(document.getElementsByTagName('p')[2].id)
</script>
</BODY>
</HTML>
curiosita':
lo sapevate che accetta il carattere jolly? ' *'
document.getElementsByTagName('*')
ma quante cose che si imparano qui!

E, obiettivamente, non vedo cosa ci sia di male. 
Nella risposta che hai dato ad Atipower (tm?) c'č il senso del mio
dubbio,ovvero di situazioni fortemente automatizzate in cui il
riferimento per indici viene sviluppato e letto dal browser in qualche
ehm ciclo(? )
A questo aggiungi il dato che alle prime prove che ho fatto questi
nodi fantasmi appaiono in dipendenza della digitazione del codice,
mentre per esempio una tabella costruita con script (che il vecchio
nn4 avrebbe reso in wysiswyg su una sola riga) non mi sembra
presentarne.
 ( a parte il Tbody predisposto figlio di Table e padre di tutti i TR
che non mi aspettavo, non ho dichiarato, e me lo trovo frapposto)
E' un 'mi sembra' grande come una casa, pero' se verificato vorrebbe
anche dire che il problema si originerebbe solo alla prima lettura,
mentre inserzioni dinamiche non apporterebbero 'fantasmi' da annullare
rendendo inutile la ripetizione del test.
Un programmino che eliminasse tutti gli a capo nel codice html prima
di uplodare un file sul server  avrebbe la stessa funzione (e forse un
po' piu' di senso)
Comunque e' tutto vero quello che dici, per me egoisticamente tutto
sto discorso e' in primo luogo un ottima occasione per cominciare a
muovermi tra definizioni, proprieta' e metodi, il problema mi fa
leggere il riferimento w3 all' ECMA con un po' piu' di senso
interpretativo...
Ciao

 modo...........document.getElementById(nome[i]) ....non funziona!!!
Io non ho ben capito ancora dove sta il problema, cmq ti ho detto e ridetto
nei post precedente che e' buon uso riferirsi agli oggetti tramite ID, ed
referenziarli tramite indice solo quando necessario.
Questo presuppone, quindi, che vi siano dei casi in cui sia necessiaro, no?
:))
Inoltre non vedo dove sta il problema di riferirsi a degli oggetti tramite
ID in un ciclo. In molti script, soprattutto per compatibilita' verso NS
4.x, si facevano cose del genere:
<div id="myLayer_1"></div>
<div id="myLayer_2"></div>
<div id="myLayer_3"></div>
ecc..
Ripeto: Sara' cmq che non ho afferrato il succo del discorso (sono veramente
moribondo, e me ne dispiace se non afferro immediatamente le questioni,
oggi... Sorry..)


Questo lo sò........io mi riferisco a.......
http://www.w3.org/TR/REC-DOM-Level-1/level-one-html.html
che mi sembra sia un altro metodo...........
item
This method retrieves a node specified by ordinal index. Nodes are numbered
in tree order (depth-first traversal order).
Parameters
index  The index of the node to be fetched. The index origin is 0.
Return Value
The Node at the corresponding position upon success. A value of null is
returned if the index is out of range.
This method raises no exceptions.


 interpretativo...
Mi sono perso. Intendi dire..?

 document.getElementsByTagName('*')
A quanto pare non e' cross-browser, pero'.
Una cosa che sto notando in questo thread, e' che te e Ati vi state
dedicando forse anche un po' "troppo" al nuovo DOM proposto dai browser di
nuova generazione, dimenticando, quasi, la metodologia usata fin'ora che
rimane cmq valida e spesso e' molto utile mischiare insieme le due cose..
.. Ci ho fatto caso poco fa', ridando un occhiata al codice proposto da
Atipower relativo al cambio delle option.
Inoltre, non dimentichiamoci che dobbiamo supportare anche altri browser. :)
(IE 4.x, NS 4.x, se siamo volenterosi anche Opera, ma su quest'ultimo,
almeno per adesso, si puo' anche sorvolare nelle pagine HTML. ;) )

 che mi sembra sia un altro metodo...........
IMVHO, ti stai confondendo. O meglio, stiamo dicendo la stessa cosa: Stai
parlando di una collection.
Ti faccio un esempio banale che spero sia chiarificatore:
Le collection in Visual Basic (non c'entra nulla, lo so, ma e' per avere un
paragone in modo tale da spiegare quel che voglio dire, visto che non ci
sono completamente con il capo, oggi... -__-) sono strutturate in questo
modo:
dim myCollection as New Collection
Supponiamo di aggiungere degli elementi:
myCollection.add ...
myCollection.add ...
myCollection.add ...
Ora, se voglio referenziare il terzo elemento, faro' una cosa del genere:
myCollection.item(3)
(in VB le collection partono da 1 non da 0).
Ma, molto piu' velocemente, potrei fare:
myCollection(3)
In pratica e' equivalente.
Allo stesso modo, se noti bene anche nella reference del DOM, quella che
viene spiegata e' l'interfaccia dell' HTMLcollection (che poi in pratica e'
il costruttore delle node list).
Ovvero, fare document.getElementById('myObj').childNodes[i] non e' altro che
la "contrazione" di
document.getElementById('nuovo').childNodes.item(i).
Spero di essermi spiegato. :)


Se è per IE4 come ben sai i problemi sono pochi..........diversamente in
fatto di NN4 e dhtml.......lasciamo perdere....
solo oggi .....in uno script che stavo facendo mi sono trovato davanti
all'alternativa....
1-riscrivere tutto con i tag layer anche per NN4
2-escludere NN6 perchè non li supporta
3-escludere NN4 e fare un codice agile e veloce......
beh.....sinceramente , pensando al futuro, ho optato per la terza
soluzione.........
che già comprendeva codice per IE4 e codice per IE5/NN6...se poi dovevo
riscrivere anche tutto il documento con <layer> e codice
relativo.........faccio prima a fare una pagina alternativa senza dhtml per
NN4...


Mi sono perso. Intendi dire..?
:-)
che nella mia rilassata condizione di non professionista
leggermi (come dovrei lo so)
http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
senza avere uno stimolo pur che sia
mi addormento..
 solo che dorlo cosě mi pareva brutto...

.....faccio prima a fare una pagina alternativa senza dhtml per NN4...
E' gia' qualcosa, direi... E l'hai fatta, almeno? :)


l'ho proposta io però.....perchè il cliente preferiva spendere meno e non
farla.........
la percentuale di utenti netscape (me compreso) gli risultava irrisoria
................questa è la realtà


 ................questa è la realtà
La realta' che conosco io, invece, e' l'opposto. Considera che pure
l'azienda per cui lavoro adesso, nonostante abbia una partnership con
Microsoft (-_-), ha voluto che il sito girasse anche su NS 4.x, nonostante
questo browser loro lo sbattano men che meno.
Se si va a parlare di clienti, invece, vogliono che il sito sia visibile su
piu' piattaforme possibili, e che non vi siano utenti/clienti che possano
"recriminare" che sul loro "Mac" non si vede bene.
Pensa che una volta, dove lavoravo prima, abbiamo ricevuto una telefonata di
un tizio che si lamentava che un layer perdeva il bordo su IE 4.5 su Mac...


Scusate se mi intrometto, io uso nn4 di preferenza, e mi pare che
anche in italia quando posso consultare le statistiche nn sia dato dal
10 al 13 anche se su alcuni siti scende ad un miserrimo 4 o meno.
Pero' l' impressione sgradevole che tanto per non fare nomi  mi aveva
dato il sito un' azienda telefonica rampante (che non era ne' verde
ne' gialla ma semmai la sottrazione dei due colori ) praticamente
invisibile con il mio beneamato ex monopolista browser era riverberata
sulla percezione della stessa  azienda.
Della serie attenzione al cliente = 0 o comunque superficialita'.
Ha un valore questa considerazione? io credo di sì, tanto per il
cliente quanto per chi realizza il sito.
Se io firmassi un sito... ne terrei conto. A costo di chiedere aiuto
se per questioni di tempo non avessi modo di investire risorse
temporali aziendali.
il "chi caspita ha fatto sto sito" e' sempre dietro l' angolo e sono
convinto che una decisione di un cliente non dovrebbe mettere a
rischio la propria immagine di sviluppatore.
Si', mi rendo conto che parlare da esterno quale sono alle
problematiche di chi si deve confrontare con la dura realta' dei
bilanci e' comodo, eppure da esperienze in altre realta' sono ben
conscio che non tutti i costi hanno manifestazione monetaria
immediata.
Ci sono valori che giungono direttamente allo Stato Patrimoniale senza
passare per il Profitti e Perdite.
E non tutti con segno positivo.

 il "chi caspita ha fatto sto sito" e' sempre dietro l' angolo
sì...ma lo dice uno che sà perchè la pagina non si vede!!
Alla gente comune che naviga un'ora di sera in alternativa al televisore ,
gliene può fregar di meno di installare NN quando ha già IE sul pc.......e
questo te lo dico perchè i pc li porto a casa della gente......
perchè dovrebbe fregargliene al possessore del sito che vuole proprio
quell'utente sul proprio sito...........
cmq se vogliamo continuare questo discorso facciamolo in e-mail
privata........


privata........
d' accordo pero' lasciami dire una cosa 
Questo stesso News group potrebbe essere una interessante base di
rilevamento  su come la rete viene utilizzata.
Non credo esistano statistiche che riportino in tabelle riassuntive il
numero di singoli utenti che transitano da questi luoghi.
Dejanews.com/usenet  potrebbe essere un' ottima base dati ma non ho
visto nulla al riguardo (se hai notizie correggimi)
La facilita' con cui un utente della rete si puo' tramutare in
protagonista della rete (con siti utili o inutili non sta a noi
giudicare e meno male che sia cosi'), grazie alle molteplici
opportunita' offerte di "rendersi visibili al mondo" rende il confine
tra utente della  Rete e protagonista della Rete molto labile e
indefinito, probabilmente semplicemente falso.
A me sembra che le domande relative al crossbrowser non stiano
diminuendo in modo significativo, e vengono poste non da Webmaster
professionali ma da persone comuni come me, non professionalmente
interessate, ma nondimeno profondamente interessate.
Abbiamo visto crescere attraverso le domande su questo news group siti
di qualita' assolutamente superiore, la pagina dedicata agli scacchi
di Marco Ledro tanto per non fare nomi che pure si arrabatta (uhm
forse piemontesimo per arrangiarsi) perche' funzioni pressoche'
automatiche con IE siano possibili anche anche con Netscape.
Certo, l'esempio che ho citato non e' commerciale, e' limitato ad un
interesse residuale in termini assoluti, ma quanti altri sono
transitati?
La nostra amica, Stefania se non erro, Befi se ben ricordo, che si
arrabbia se Opera non visualizza correttamente il suo ottimo sito.
Come non pensare che le loro, le nostre aspettative e i loro, nostri
sforzi di "ampio spettro" non  siano confrontate con l'opera di chi
affronta la Rete professionalmente?
Dettagli?
O miopia di chi non li vede?
Scusate,  ho colpevolmente valicato il confine dell' off topic = OT
=fuori tema.
A te Fabiano , alias  Atipower,  la riconoscenza per la disponibilita'
di servizio alla crescita di un utilizzo consapevole della Rete.
E a tutti gli altri naturalmente

 O miopia di chi non li vede?
Sono fondamentalmente d'accordo, e mi piacerebbe poter leggere anche sull'NG
la risposta a tale post da parte di Atipower.


Intendiamoci !!........sono d'accordo anch'io......altrimenti non starei a
sbattermi per il cross-browsing.......
però quello che pensiamo noi e certe realtà (esempio quella che ha
specificato p.carena sul sito della sottrazione dei colori..)
si discostano sostanzialmente per questioni di interesse ......
conosco una realtà....con cui ho contatti di lavoro., che ha fatto una
scelta "mirata" nel far fallire clamorosamente qualsiasi browser che
visitasse i suoi siti , che non sia quello prescelto ......
certo non c'è niente di illegale.......ma forse di scorretto sì , almeno per
come la pensiamo noi.....il motivo di tale scelta lo posso intuire.......
