PDA

Visualizza versione completa : [ajax] FF Ok, Ie7: "readyState è nullo o non è un oggetto"


realtebo
17-02-2007, 17.37.34
Questa volta il problema è un poco più complesso...

lo script AJAX gira senza problemi in FF, ma sotto IE mi viene arcidetto che "readyState o è nullo o non è un oggetto".

Creo così l'oggetto richiesta (ok, un po spartano, però ditemi SE è qua il problema...)


var Ajax = false;
if (window.ActiveXObject) {
Ajax = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
Ajax = new XMLHttpRequest();
}


e così cerco di usarlo... (e, ripeto: in FF funziona)


Ajax.open(metodo, pagina);
if (metodo=="POST" ) {
Ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
}
Ajax.setRequestHeader("Content-length", datiPost.length);
Ajax.setRequestHeader("Connection", "close");
var Esito = "";
Ajax.onreadystatechange = function() {

* if (Ajax.readyState == 4 && Ajax.status == 200) {
OkFunc(Ajax.responseText);
} else if (Ajax.readyState == 4 && Ajax.status != 200) {
NoFunc(Ajax.status);
} else {
WaitFunc(Ajax.readyState);
}
}
Ajax.send(datiPost);
Ajax = null ;


Si accettano ogni forme di suggerimenti, tenete conto che la pagina vien *sempre* fornita, il server non ha mai fallito un tentativo di recupero, e il metodo usato per i dati è "POST"

L'errore mi si presenta alla riga con l'asterisco '*'
:wall:

Semi.genius
17-02-2007, 18.37.07
In teoria da quanto avevo letto, ReadyState non è accessibile da Internet Explorer quindi una soluzione non c'è... ma è meglioc he aspetti qualcuno di più esperto

P8257 WebMaster
17-02-2007, 20.08.10
Prova a scriverlo in maiuscolo: READYSTATE .. Internet Explorer esporta questo genere di contenuti come constanti, ff li tratta come proprietà.. vedi se così funziona, altrimenti ci sono alternative.

P.S.: usa l'oggetto navigator per differenziare i 2 tipi di codice che ingloberai entrambi nello script.

P8257 WebMaster
17-02-2007, 20.11.23
Errata Corrige ..:


Ajax.ReadyState


prova così

realtebo
19-02-2007, 10.22.16
sono lontano dal pc di programmazione, grazie intanto... proverò i vari suggerimenti

una cosa solo non capisco:


>P.S.: usa l'oggetto navigator per differenziare i 2 tipi di codice che ingloberai entrambi nello script.


cosa vuol dire? Scusate la mia non-esperienza, ma cos'è l'oggetto navigator e a quali 2 tipi di codice ti riferisci ?

P8257 WebMaster
19-02-2007, 10.30.52
L'oggetto "navigator" contiene informazioni sul browser del client .. attraverso la lettura delle sue prorpietà, in particolare "appVersion", puoi recuperare la versione del browser usato dal client, quindi puoi adattare il tuo codice a seconda del browser che lo utilizza.

http://www.javascriptkit.com/javatutors/navigator.shtml

realtebo
19-02-2007, 12.55.59
gasp, peccato che ne ReadyState ne READYSTATE mi danno risultati...

Quello che mi chiedo è: Se viene lanciato l'evento onstatechange , vuol dire che l'oggetto Ajax è davvero in funzione, giusto? Per cui mi aspetto che le proprietà dell'ActiveX sia reperibili, .... forse con IE7 ha cambiato nome qualche proprietà?

P8257 WebMaster
19-02-2007, 13.19.09
Senti ma quell'asterisco che c'é sulla riga dello script è un errore di copia che c'é solo qui vero ?

P8257 WebMaster
19-02-2007, 13.22.15
Comunque controlla lo script, a me funziona tranquillamente, ho buttato giù due righe di prova, mi dà ovviamente 0 perché non ho sottoposto del contenuto all'oggetto, ma almeno lo legge, quindi secondo me c'é qualche errore di sintassi...


<html>
<head>
<script language="javascript">

function Test()
{
alert("begin");
var Ajax = false;
if (window.ActiveXObject) {
Ajax = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
Ajax = new XMLHttpRequest();
}

alert(Ajax.readyState);
}

</script>
</head>

<body onload="javascript:Test();">

</body>
</html>

realtebo
19-02-2007, 18.39.26
allora, credo di avere tutte le risposte:

a) l'asterisco è li solo per indicare la riga dove c'è l'errore, ovviamente nello script non c'è

b) la causa è quel fantastico Ajax=null in fondo allo script. Mentre FF non esegue la garbage collection finché l'oggetto non ha finito il ciclo di vita, IE7 (il 6 non lo fa) lo canna subito, quindi, giustamente, mi dice che l'oggetto non esiste.

c) la sintassi, come da voi giustamente rilevata, era CORRETTA, va benissimo scritto readyState come capitalizzazioni.

P8257 WebMaster
19-02-2007, 18.47.21
allora, credo di avere tutte le risposte:


b) la causa è quel fantastico Ajax=null in fondo allo script. Mentre FF non esegue la garbage collection finché l'oggetto non ha finito il ciclo di vita, IE7 (il 6 non lo fa) lo canna subito, quindi, giustamente, mi dice che l'oggetto non esiste.



Non può essere avvenuta una cosa del genere, perché tu l'oggetto lo usi praticamente fino alla fine dello script, quindi non può essere dereferenziato e dare un errore a metà dello script stesso. Altro motivo è che nei linguaggi interpretati il GC funziona in modo diverso; ne è la prova il fatto che ho rimesso la riga "Ajax = null" e lo script di esempio che ho postato continua comunque a funzionare.

Sulla capitalizzazione hai ragione, ho detto io una caxxata... :D

Felice di sapere che hai risolto comunque ;)

realtebo
19-02-2007, 19.16.25
spiacente, appena riprovato con lo script sul server. rimettendo Ajax = null Ie7 va in palla, mentre FF2 no. ie6 non l'ho + per cui non posso sperimentare, ma grazie a Dio lo script in questione è per la mia rete interna, 60% FF2, 35% IE7 , 5% Netscape 2 (:)