HighDots Forums  

[?] childNodes e IE5

Javascript (Italian) Il linguaggio JavaScript (it.comp.lang.javascript)


Discuss [?] childNodes e IE5 in the Javascript (Italian) forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Cristiano Larghi
 
Posts: n/a

Default [?] childNodes e IE5 - 07-06-2006 , 04:06 AM






Faccio una chiamata xmlhttp, ricevo il risultato (verificato con
responseText, tutto ok) e lo passo a questa function per verificare il
risultato.
xml (oggetto MyObj=XmlHttp.responseXML):
<Response><ERR_UTENTE_NOT_EXIST>Codice cliente o password errata, oppure
accesso al sito non consentito.</ERR_UTENTE_NOT_EXIST></Response>
La function la chiamo con:
Err=GetNodeText(MyObj.childNodes,"ERR_UTENTE_NOT_E XIST");
function:
function GetNodeText(N,s) {
var ris=null;
for(var x=0;x<N.length;x++) {
if(N[x].nodeName.toUpperCase()==s.toUpperCase())
ris=(N[x].firstChild?N[x].firstChild.nodeValue:"");
else if(N[x].nodeType==1&&N[x].childNodes.length>0)
ris=GetNodeText(N[x].childNodes,s);
} //ciclo tra i nodi
return ris;
} //GetNodeText
'ndò'stà il problema?
mi dicono che con win98 - IE5 segnala errore. Ho fatto delle verifiche,
praticamente risulta che con Gecko e IE6 la MyObj.childNodes.length==1,
mentre con IE5 è = 0 (e quindi restituisce sempre null).
La cosa più strana è che 2 clienti mi hanno detto che con win98 e IE
*AGGIORNATO ALLA 6* segnala lo stesso problema.

Qualcuno ha esperienza su ciò e sa dirmi cosa c'è che non va?

io intanto continuo con i test (ma non saprei bene come sostituire la
childNodes...) E' un casino perché temo che non sia la function di per sè
che non va, e se occorre fare la chiamata in modo diverso vorrebbe dire non
cambiare solo la function ma cambiare tutte le chiamate del sito (dei
siti...) :-/

Grazie,
Cristiano

--
"Voi abili a tenere sempre un piede qua e uno là
avrete un avvenire certo in questo mondo qua
però la dignità
dove l'avete persa?"
V.R.

Reply With Quote
  #2  
Old   
Cristiano Larghi
 
Posts: n/a

Default Re: [?] childNodes e IE5 - 07-06-2006 , 04:22 AM






In data Thu, 6 Jul 2006 10:06:47 +0200, Cristiano Larghi ha scritto:

Dimenticavo: qualcuno che ha un win98 con IE6 fa un test, giusto per
verificare che non sia vero che non va su win98 manco aggiornando IE?

Uno dei siti "incriminati" è www.primestore.it, fate la login (anche con
utente inventato, tanto tutti i controlli restituiscono null)...
Grazie

--
"e mai che mi sia venuto in mente
di essere più ubriaco di voi
di essere molto più ubriaco di voi"
F.D.A.

Reply With Quote
  #3  
Old   
ZER0
 
Posts: n/a

Default Re: [?] childNodes e IE5 - 07-06-2006 , 04:29 AM



On Thu, 6 Jul 2006 10:06:47 +0200, Cristiano Larghi wrote:

Quote:
Faccio una chiamata xmlhttp, ricevo il risultato (verificato con
responseText, tutto ok)
Non è particolarmente rilevante. Il responseText è sempre presente anche se
il documento XML non è stato caricato in responseXML.

Per fare test su IE ti conviene verificare in questo modo:

alert( myobj.responseXML.xml );

Quote:
xml (oggetto MyObj=XmlHttp.responseXML):
Response><ERR_UTENTE_NOT_EXIST>Codice cliente o password errata, oppure
accesso al sito non consentito.</ERR_UTENTE_NOT_EXIST></Response

La function la chiamo con:
Err=GetNodeText(MyObj.childNodes,"ERR_UTENTE_NOT_E XIST");
Noto che ti lasci ancora influenzare troppo dalla sintassi Microsoft VB-Like
(che ha ereditato anche C#) :P

Prova a fare:

GetNodeText( myobj.documentElement.childNodes, "ERR_UTENTE_NOT_EXIST" );

Non sto ad analizzare la funzione, adesso.

Quote:
mi dicono che con win98 - IE5 segnala errore. Ho fatto delle verifiche,
praticamente risulta che con Gecko e IE6 la MyObj.childNodes.length==1,
mentre con IE5 è = 0 (e quindi restituisce sempre null).
Nelle verifiche di cui parli, guarda cosa ti restituisce IE5 con
responseXML.xml, e vedi il numero di childNodes del documentElement (root).

Quote:
La cosa più strana è che 2 clienti mi hanno detto che con win98 e IE
*AGGIORNATO ALLA 6* segnala lo stesso problema.
Dovresti sapere bene che il browser e le DOM XML API sono due cose distinte,
esattamente come lo è lo script engine.

Quote:
Qualcuno ha esperienza su ciò e sa dirmi cosa c'è che non va?
Personalmente non mi è mai capitato, mi dispiace. E non ho win98 a portata
di mano dove provare (a casa, giù a Firenze, ne avrei uno).

Quote:
io intanto continuo con i test (ma non saprei bene come sostituire la
childNodes...)
XPath, firstChild/lastChild e/o nextSibling... gli approcci sono tanti. Ma
prima sarebbe bene fare qualche prova.

Quote:
e se occorre fare la chiamata in modo diverso vorrebbe dire non
cambiare solo la function ma cambiare tutte le chiamate del sito (dei
siti...) :-/
Cioé? Immagino faccia parte di una libreria, una volta che modifichi il
corpo della funzione, non dovrebbe impattare troppo come cambiamento, no?

L'importante è che i parametri di ingresso e i risultati in uscita siano i
medesimi.

--
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)



Reply With Quote
  #4  
Old   
Cristiano Larghi
 
Posts: n/a

Default Re: [?] childNodes e IE5 - 07-06-2006 , 05:00 AM



In data Thu, 6 Jul 2006 10:29:24 +0200, ZER0 ha scritto:

Quote:
Per fare test su IE ti conviene verificare in questo modo:

alert( myobj.responseXML.xml );
bravo! qua c'è qualcosa che non va:
var MyObj=XmlHttp.responseXML;
alert(typeof MyObj) => object
alert(MyObj.xml) => IE6 mi restituisce l'xml come ho indicato (All'inizio
c'è <?xml version="1.0"?>, non è che è questo che gli fa casini a IE5?);
IE5 restituisce stringa vuota.
alert(typeof MyObj.xml): entrambi stringa ...

Non riesco bene a capire ...

Quote:
xml (oggetto MyObj=XmlHttp.responseXML):
Response><ERR_UTENTE_NOT_EXIST>Codice cliente o password errata, oppure
accesso al sito non consentito.</ERR_UTENTE_NOT_EXIST></Response

La function la chiamo con:
Err=GetNodeText(MyObj.childNodes,"ERR_UTENTE_NOT_E XIST");

Noto che ti lasci ancora influenzare troppo dalla sintassi Microsoft VB-Like
(che ha ereditato anche C#) :P
oh yes :-) (questa poi la ho fatta tipo 2-3 anni fa, adesso userei la
minuscola iniziale per rispetto a js e a Zer0... :-))

Quote:
GetNodeText( myobj.documentElement.childNodes, "ERR_UTENTE_NOT_EXIST" );
riprendendo il test sopra:
alert(typeof MyObj.documentElement) => object
alert(typeof MyObj.documentElement.childNodes) => IE6 object, IE5
"documentElement non è un oggetto" ... la ho provata più volte in vari
formati: al primo alert dice che è un oggetto, ma poi dice che non lo è
(vedi sotto)

Quote:
Nelle verifiche di cui parli, guarda cosa ti restituisce IE5 con
responseXML.xml, e vedi il numero di childNodes del documentElement (root).
vedi sopra: responseXML.xml stringa vuota, documentElement è un oggetto ma
sembrerebbe a naso null, anzi testo:
alert(MyObj.documentElement==null) => IE6 false, IE5 true

Quote:
La cosa più strana è che 2 clienti mi hanno detto che con win98 e IE
*AGGIORNATO ALLA 6* segnala lo stesso problema.
Dovresti sapere bene che il browser e le DOM XML API sono due cose distinte,
esattamente come lo è lo script engine.
sì, ma l'utente mediamente installa IE6 così come scaricato di default, e
dovrebbe aggiornare anche le DOM XML API...

Quote:
e se occorre fare la chiamata in modo diverso vorrebbe dire non
cambiare solo la function ma cambiare tutte le chiamate del sito (dei
siti...) :-/
Cioé? Immagino faccia parte di una libreria, una volta che modifichi il
corpo della funzione, non dovrebbe impattare troppo come cambiamento, no?
sì, ma la function (che ora non sto più considerando) è una sola, mentre le
chiamate sono in parecchi file js sparsi qua e la ... sarebbe molto più
comodo modificare la function (che è una sola) anziché dover modificare
magari 50 chiamate (e per ognuna fare gli opportuni test).

sto pensando di risolvere il problema a monte:

function getXmlHttpRequest(){
if (window.ActiveXObject) {
/*@cc_on
@if (@_win32)
return new ActiveXObject("Microsoft.XMLHTTP");
@end
@*/
return null;
}
else if (window.XMLHttpRequest)
return new XMLHttpRequest();
else return null;
} //getxmlHttpRequest

potrei modificare questa function e mettere anche il controllo IEver>5 (non
ricordo la sintassi a memoria), così chi ha IE5.0 (vorrei però mantenere
almeno IE5.5) non usa xmlhttp ... ma mi scoccia un po' (tra l'altro dovrei
modificarla per prepararmi per IE7, penso)

L'altra alternativa che mi è venuta in mente è di permettere all'utente di
forzare (con un cookie, o come flag nel suo record) il non-uso di xmlhttp
(che risolverebbe anche eventuali strani problemi, tipo con firewall
bizzarri, internet security e altre cosette particolari. Mi è capitato 2
settimane fa un cliente con firefox dove xmlhttp non andava e non c'è stato
verso di farlo andare, alla fine mi ha detto che era norton internet
security). ma mi scoccia un po'.

Infine: mi sovviene che c'erano problemi anche con safari; tempo fa
qualcuno (sembro la carta?) mi aveva indicato il perché ma non trovo più la
stampa che mi ero fatto e il messaggio non lo trovo con google, magari il
problema era lo stesso? boh...

--
"e mai che mi sia venuto in mente
di essere più ubriaco di voi
di essere molto più ubriaco di voi"
F.D.A.


Reply With Quote
  #5  
Old   
Cristiano Larghi
 
Posts: n/a

Default Re: [?] childNodes e IE5 - 07-06-2006 , 05:06 AM



In data Thu, 6 Jul 2006 11:00:56 +0200, Cristiano Larghi ha scritto:

Quote:
alert( myobj.responseXML.xml );
dimenticavo: alert(XmlHttp.responseText) dà la corretta stringa in
entrambi, che è

<?xml version="1.0"
encoding="latin9"?><Response><ERR_UTENTE_NOT_EXIST >Codice cliente o
password errata, oppure accesso al sito non
consentito.</ERR_UTENTE_NOT_EXIST></Response>

--
"qualcuno è andato per età
qualcuno perchè già dottore
e insegue una maturità, si è sposato, fa carriera
ed è una morte un po' peggiore"
F.G.


Reply With Quote
  #6  
Old   
ZER0
 
Posts: n/a

Default Re: [?] childNodes e IE5 - 07-06-2006 , 05:17 AM



On Thu, 6 Jul 2006 11:00:56 +0200, Cristiano Larghi wrote:

Quote:
Per fare test su IE ti conviene verificare in questo modo:

alert( myobj.responseXML.xml );

bravo! qua c'è qualcosa che non va:
var MyObj=XmlHttp.responseXML;
alert(typeof MyObj) => object
alert(MyObj.xml) => IE6 mi restituisce l'xml come ho indicato (All'inizio
c'è <?xml version="1.0"?>, non è che è questo che gli fa casini a IE5?);
IE5 restituisce stringa vuota.
Perfetto. Significa che le DOM API non hanno interpretato correttamente
l'XML ricevuto come tale. Fatti dire il perché:

if (myobj.parseError.errorCode != 0) {
alert(myobj.parseError.reason);
}

Magari fatti stampare anche altre proprietà (srcText, line, etc), la reason
è la minima indispensabile.

Quote:
Non riesco bene a capire ...
Leggi su

Quote:
Noto che ti lasci ancora influenzare troppo dalla sintassi Microsoft VB-Like
(che ha ereditato anche C#) :P

oh yes :-) (questa poi la ho fatta tipo 2-3 anni fa, adesso userei la
minuscola iniziale per rispetto a js e a Zer0... :-))
Ahahah.. onoratissimo!

Quote:
riprendendo il test sopra:
alert(typeof MyObj.documentElement) => object
alert(typeof MyObj.documentElement.childNodes) => IE6 object, IE5
"documentElement non è un oggetto" ...
Si, chiaro. Non avendo fatto il parsering del codice xml ricevuto, non hai
un oggetto documentElement sul quale lavorare.

Quote:
Nelle verifiche di cui parli, guarda cosa ti restituisce IE5 con
responseXML.xml, e vedi il numero di childNodes del documentElement (root).

vedi sopra: responseXML.xml stringa vuota, documentElement è un oggetto ma
sembrerebbe a naso null, anzi testo:
alert(MyObj.documentElement==null) => IE6 false, IE5 true
Si, torna tutto.

Quote:
La cosa più strana è che 2 clienti mi hanno detto che con win98 e IE
*AGGIORNATO ALLA 6* segnala lo stesso problema.
Dovresti sapere bene che il browser e le DOM XML API sono due cose distinte,
esattamente come lo è lo script engine.

sì, ma l'utente mediamente installa IE6 così come scaricato di default, e
dovrebbe aggiornare anche le DOM XML API...
Non mi pare, credo che si porti dietro solo lo script engine aggiornato e
non l'MSXML (cosa che invece accade con le installazioni di Office, se non
ricordo male).

Quote:
Cioé? Immagino faccia parte di una libreria, una volta che modifichi il
corpo della funzione, non dovrebbe impattare troppo come cambiamento, no?

sì, ma la function (che ora non sto più considerando) è una sola, mentre le
chiamate sono in parecchi file js sparsi qua e la ... sarebbe molto più
comodo modificare la function (che è una sola) anziché dover modificare
magari 50 chiamate (e per ognuna fare gli opportuni test).
Sisi, ovvio.. io intendevo questo.

Quote:
sto pensando di risolvere il problema a monte:
[cut]
(tra l'altro dovrei
modificarla per prepararmi per IE7, penso)
Si, infatti nei miei post successivi a quel primo in cui la indicavo, ho
invertito le condizioni Come già detto tempo fa in qualche reply a "non
mi ricordo chi". Tra l'altro quando la modificai mi pare di averti avvertito
di aggiornare il codice sul sito, ma evidentemente non l'hai fatto :P

Quote:
L'altra alternativa che mi è venuta in mente è di permettere all'utente di
forzare (con un cookie, o come flag nel suo record) il non-uso di xmlhttp
(che risolverebbe anche eventuali strani problemi, tipo con firewall
bizzarri, internet security e altre cosette particolari. Mi è capitato 2
settimane fa un cliente con firefox dove xmlhttp non andava e non c'è stato
verso di farlo andare, alla fine mi ha detto che era norton internet
security). ma mi scoccia un po'.
E poi c'è chi si meraviglia se preferisco non utilizzare XmlHttpRequest nei
siti, ma solo nelle web application :P

Quote:
Infine: mi sovviene che c'erano problemi anche con safari; tempo fa
qualcuno (sembro la carta?) mi aveva indicato il perché ma non trovo più la
stampa che mi ero fatto e il messaggio non lo trovo con google,
Perché Sembro la Carta non fa tenere in archivio i suoi post, ecco perché
non lo trovi.

Quote:
magari il problema era lo stesso? boh...
No, dubito. Penso me ne ricorderei, e cmq lui non mi pare il tipo da perdere
il capo dietro a IE5 su Win98.. è già tanto se supporta/sopporta IE6...
( e per certi versi, come dargli torto... )

--
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)



Reply With Quote
  #7  
Old   
Cristiano Larghi
 
Posts: n/a

Default Re: [?] childNodes e IE5 - 07-06-2006 , 05:39 AM



In data Thu, 6 Jul 2006 11:17:55 +0200, ZER0 ha scritto:

Quote:
alert(MyObj.xml) => IE6 mi restituisce l'xml come ho indicato (All'inizio
c'è <?xml version="1.0"?>, non è che è questo che gli fa casini a IE5?);
IE5 restituisce stringa vuota.
Perfetto. Significa che le DOM API non hanno interpretato correttamente
l'XML ricevuto come tale. Fatti dire il perché:
if (myobj.parseError.errorCode != 0) {
alert(myobj.parseError.reason);
alert(MyObj.parseError.errorCode) => IE6=0, IE5=-[un numeraccio]
reason: La codifica specificata non è supportata dal sistema :-O

cazzo avevo fatto 2000 test per fargli accettare tutti i caratteri, e alla
fine il latin9 era quella che funzionava egregiamente ...

Quote:
sì, ma l'utente mediamente installa IE6 così come scaricato di default, e
dovrebbe aggiornare anche le DOM XML API...

Non mi pare, credo che si porti dietro solo lo script engine aggiornato e
non l'MSXML (cosa che invece accade con le installazioni di Office, se non
ricordo male).
:-O questa non la sapevo ... quindi win98 con IE6 ha comunque le vecchie
DOM API.

Quote:
(tra l'altro dovrei
modificarla per prepararmi per IE7, penso)

Si, infatti nei miei post successivi a quel primo in cui la indicavo, ho
invertito le condizioni Come già detto tempo fa in qualche reply a "non
mi ricordo chi". Tra l'altro quando la modificai mi pare di averti avvertito
di aggiornare il codice sul sito, ma evidentemente non l'hai fatto :P
No :-/
quindi diventerebbe, per futuro supporto IE7:

function getXmlHttpRequest(){
if(window.XMLHttpRequest)
return new XMLHttpRequest();
else if (window.ActiveXObject) {
/*@cc_on
@if (@_win32)
return new ActiveXObject("Microsoft.XMLHTTP");
@end
@*/
return null;
}
else return null;
} //getxmlHttpRequest
Corretto?

Quote:
magari il problema era lo stesso? boh...

No, dubito. Penso me ne ricorderei, e cmq lui non mi pare il tipo da perdere
il capo dietro a IE5 su Win98.. è già tanto se supporta/sopporta IE6...
( e per certi versi, come dargli torto... )
no, sicuramente la soluzione la aveva postata per safari, ma magari era lo
stesso problema che ha IE5. Ma ora direi proprio di no.

--
"qualcuno è andato per età
qualcuno perchè già dottore
e insegue una maturità, si è sposato, fa carriera
ed è una morte un po' peggiore"
F.G.


Reply With Quote
  #8  
Old   
Cristiano Larghi
 
Posts: n/a

Default Re: [?] childNodes e IE5 - 07-06-2006 , 06:07 AM



In data Thu, 6 Jul 2006 11:39:51 +0200, Cristiano Larghi ha scritto:

Quote:
cazzo avevo fatto 2000 test per fargli accettare tutti i caratteri, e alla
fine il latin9 era quella che funzionava egregiamente ...
avrei risolto così:
function getXmlDocumentFromXmlHttp(xmlHttp) {
var myObjDoc=xmlHttp.responseXML;
if(myObjDoc.parseError.errorCode!=0) {
//var provv=xmlHttp.responseText.replace(/<\?xml version="1.0"
encoding="latin9"\?>/i,"");
var provv=xmlHttp.responseText.replace(/latin9/gi,"ISO-8859-1");
var ris=myObjDoc.loadXML(provv);
if(!ris) return null;
}
return myObjDoc;
} //getXmlDocumentFromXmlHttp
problema: se faccio quanto sopra ancora errore "impossibile passare dalla
codifica corrente a quella specificata" ... ma che cazz...
se anziché sostituire latin9 con iso-8859-1 uso il replace sopra remmato
(rimuovo direttamente la dichiarazione) sembra funzionare tutto (non ho
provato, ma in questo modo mi saltano sicuramente le accentate)...

--
"qualcuno è andato per età
qualcuno perchè già dottore
e insegue una maturità, si è sposato, fa carriera
ed è una morte un po' peggiore"
F.G.


Reply With Quote
  #9  
Old   
Cristiano Larghi
 
Posts: n/a

Default Re: [?] childNodes e IE5 - 07-06-2006 , 07:09 AM



In data Thu, 6 Jul 2006 12:07:59 +0200, Cristiano Larghi ha scritto:

Quote:
avrei risolto così:
soluzione finale (aggiunto controllo esistenza oggetto parseError
altrimenti Gecko se la mena):

function getXmlDocumentFromXmlHttp(xmlHttp) {
var myObjDoc=xmlHttp.responseXML;
if(myObjDoc.parseError&&myObjDoc.parseError.errorC ode!=0) {
var provv=xmlHttp.responseText.replace(/<\?xml version="1.0"
encoding="latin9"\?>/i,"");
//IE5: errore "impossibile passare dalla codifica corrente...
//var provv=xmlHttp.responseText.replace(/latin9/gi,"ISO-8859-1");
var ris=myObjDoc.loadXML(provv);
if(!ris) return null;
}
return myObjDoc;
} //getXmlDocumentFromXmlHttp

Può ovviamente essere generalizzata per rimuovere il tag che contiene la
proprietà encoding ma vado di fretta.

--
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
B.M.


Reply With Quote
  #10  
Old   
Cristiano Larghi
 
Posts: n/a

Default Re: [?] childNodes e IE5 - 07-06-2006 , 07:23 AM



In data Thu, 6 Jul 2006 13:09:24 +0200, Cristiano Larghi ha scritto:

Quote:
Può ovviamente essere generalizzata per rimuovere il tag che contiene la
proprietà encoding ma vado di fretta.
function getXmlDocumentFromXmlHttp(xmlHttp) {
var myObjDoc=xmlHttp.responseXML;
if(myObjDoc.parseError&&myObjDoc.parseError.errorC ode!=0) {
var provv=xmlHttp.responseText.replace(/<.*encoding=[^>]*>/i,"");
var ris=myObjDoc.loadXML(provv);
if(!ris) return null;
}
return myObjDoc;
} //getXmlDocumentFromXmlHttp

--
"Ti sei salvato
o sei entrato in banca pure tu?"
A.V.


Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.