Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774

    [ajax] - XMLHttpRequest e readyState.. problemone!!

    salve,
    apro un nuovo thread nonostante abbia gia accennato alla questione in un altro perchè il problema è cambiato ora e mi sembrava più giusto aprire una discussione dedicata.
    vengo al dunque.
    ho scritto la classe ajax che posto più sotto ed ho qualche difficoltà.
    nel momento in cui ho ristrutturato il codice seguendo il formalismo ad oggetti mi è sorto questo problema con l'oggetto XMLHttpRequest ed in particolare con la proprietà readyState.
    il fatto è che il codice non riesce ad entrare nel ramo IF la cui condizione è "if(this.objSOCK.readyState == 4)"...

    non riesco a capire esattamente dove sia il problema...
    ho provato a stampare degli alert per vederci più chiaro ma non hanno fatto che incasinarmi...
    del tipo:
    codice:
    this.objSOCK.onreadystatechange=function(){alert(this.objSOCK.readyState);};
    non apre nessun alert...
    invece
    codice:
    this.objSOCK.onreadystatechange=function(){alert('pippo');};
    apre 4 alert pippo (che dovrebbero essere, in teoria, i readyState 0 -1 - 2 - 4).
    proprio non capisco...
    se all'interno della funzione requestPage stampo i readyState dopo ogni operazione sull'oggetto xmlhttprequest vedo gli state 0, 1 e anche 2... se invece li stampo dalla funzione receiveResponse (quella richiamata dopo ogni onreadystatechange) esce sempre e solo "0"..
    ed è per questo motivo che non nentra nel ramo IF...
    ci sto diventando matto...
    potete darmi una mano?
    grazie
    ecco il codice:

    codice:
    function ajax(){
    	this.objSOCK = null;
    
    	this.openSock = function(){
    		var xmlhttp ;
    		try{
    		    xmlhttp = new XMLHttpRequest(); // Gecko (Firefox, Moz), KHTML (Konqueror, Safari), Opera, Internet Explorer 7
    		}catch(e){
    		    var MSXML_XMLHTTP_PROGIDS = new Array(
    		        'MSXML2.XMLHTTP.5.0',  
    		        'MSXML2.XMLHTTP.4.0',
    		        'MSXML2.XMLHTTP.3.0',
    		        'MSXML2.XMLHTTP',      // Internet Explorer 6
    		        'Microsoft.XMLHTTP'   // Internet Explorer 4,5
    		    );
    		    var success=false;
    		    for(var i=0;i < MSXML_XMLHTTP_PROGIDS.length && !success; i++){
    		        try{
    		            xmlhttp = new ActiveXObject(MSXML_XMLHTTP_PROGIDS[i]);
    		            success=true;	
    		        }catch(e){}
    		    }
    		    if(!success)
    		        alert('attenzione: per navigare questo sito e necessario abilitare javascript o activeX');
    		}
    		return xmlhttp;
    	}
    	
    	
    	this.printOut = function(target, html){
    	   document.getElementById(target).innerHTML = html
    	}
    	
    	
    	this.receiveResponse = function(target) {
    		alert(this.objSOCK.readyState);	
    		if(this.objSOCK.readyState == 4) { 							
    			if(this.objSOCK.status == 200 || this.objSOCK.statusText=="Found") {							
    				this.printOut(target, this.objSOCK.responseText);    
    			}else{
    				this.printOut(target, "error:\n"+objSOCK.statusText);
    			}
    		}
    	}
    	
    	
    	this.requestPage = function(url, target, method, parameters) {
    		if(method == undefined){method="GET";}
    		this.objSOCK=this.openSock(); // creo l'oggetto XMLHttpRequest
    		if(this.objSOCK){				
    			//this.objSOCK.onreadystatechange=function(){alert(this.objSOCK.readyState);};			
    			this.objSOCK.onreadystatechange=this.receiveResponse(target);			
    			this.objSOCK.open(method, url, true);						
    			if(method == "GET" || method == "get"){			
    				this.objSOCK.send("");							
    			}else{
    				this.objSOCK.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    				this.objSOCK.setRequestHeader('Content-length', parameters.length);
    				this.objSOCK.setRequestHeader('Connection', 'close');
    				this.objSOCK.send(parameters);
    			}
    		}
    	}	
    	
    	
    
    }

  2. #2
    onreadystatechange non è un metodo, è un parametro richiamato in modo asincrono quindi this non dovrebbe andare, trattasi di scope ... ho scritto una pillola in merito e nella guida AJAX parlo anche di questo errore.
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774
    niente... ho ancora lo stesso problema...
    ho tolto il this come mi hai detto tu, e infatti all'interno della funzione requestPage riesco a stampare i readyState ad ogni onchangereadystate.
    il problema sorge quando richiamo la funzione receiveResponse.
    quando infatti si entra in quella funzione l'oggetto xmlhttprequest ha sempre ready state = 0.
    come se si azzerasse o più semplicemente come se la funzione non fosse in grado di accedervi...
    capisco che sia un problema di scope ma non capisco come risolverlo...
    tu riesci a vedere l'errore?

    codice:
    this.receiveResponse = function(target) {
    		alert(objSOCK.readyState);	
    		if(objSOCK.readyState == 4) { 							
    			if(objSOCK.status == 200 || objSOCK.statusText=="Found") {							
    				this.printOut(target, objSOCK.responseText);    
    			}else{
    				this.printOut(target, "error:\n"+objSOCK.statusText);
    			}
    		}
    	}
    	
    	
    	this.requestPage = function(url, target, method, parameters) {
    		if(method == undefined){method="GET";}
    		objSOCK=this.openSock(); // creo l'oggetto XMLHttpRequest
    		if(objSOCK){				
    			//objSOCK.onreadystatechange=function(){alert(objSOCK.readyState);};			
    			objSOCK.onreadystatechange=function(){this.receiveResponse(target)};
    			objSOCK.open(method, url, true);						
    			if(method == "GET" || method == "get"){			
    				objSOCK.send('');							
    			}else{
    				objSOCK.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    				objSOCK.setRequestHeader('Content-length', parameters.length);
    				objSOCK.setRequestHeader('Connection', 'close');
    				objSOCK.send(parameters);
    			}
    		}
    	}
    ho provato anache a passare l'oggetto objSOCK in parametro alla funzione receiveResponse ma non serve a nulla...

  4. #4
    objSOCK.onreadystatechange=function(){this (NO!!!, this "non esiste") .receiveResponse(target)};
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774
    adesso ho capito non c'è bisogno di gridare
    quindi cmq tu dicevi di toglierlo solo da li il "this" oppure tutte le volte che richamo l'oggetto objSOCK? dal post precedente non avevo capito molto bene.
    in ogni caso avevo gia provato a toglierlo anche da li e non funziona ugualmente...
    che può essere?

    grazie
    citrus

  6. #6
    codice:
    this.requestPage = function(url, target, method, parameters) {
    	var	self = this;
    	if(!method)
    		method="get";
    	objSOCK=this.openSock();
    	if(objSOCK){
    		objSOCK.open(method, url, true);								
    		if(method.toLowerCase() === "get")	
    			objSOCK.send(null);						
    		else {
    			objSOCK.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    			objSOCK.setRequestHeader('Content-length', parameters.length); // ti serve in invio ???
    			objSOCK.setRequestHeader('Connection', 'close');
    			objSOCK.send(parameters);
    		};
    		objSOCK.onreadystatechange=function() {
    			if(objSOCK.readyState == 4) {
    				if(objSOCK.status == 200 || objSOCK.statusText=="Found")
    					self.printOut(target, objSOCK.responseText);
    				else
    					self.printOut(target, "error:\n"+objSOCK.statusText);
    			}
    		}
    	}
    }
    cmq la guida non l'hai letta se hai mezz'ora leggitela
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774
    sono riusciuto a dare un occhiata alla guida ajax ed ho riscritto la funzione in questo modo:
    codice:
    function ajax(){
    	this.objSOCK=null;
    
    	this.openSock = function(){
    		var xmlhttp ;
    		try{
    		    xmlhttp = new XMLHttpRequest(); // Gecko (Firefox, Moz), KHTML (Konqueror, Safari), Opera, Internet Explorer 7
    		}catch(e){
    		    var MSXML_XMLHTTP_PROGIDS = new Array(
    		        'MSXML2.XMLHTTP.5.0',  
    		        'MSXML2.XMLHTTP.4.0',
    		        'MSXML2.XMLHTTP.3.0',
    		        'MSXML2.XMLHTTP',      // Internet Explorer 6
    		        'Microsoft.XMLHTTP'   // Internet Explorer 4,5
    		    );
    		    var success=false;
    		    for(var i=0;i < MSXML_XMLHTTP_PROGIDS.length && !success; i++){
    		        try{
    		            xmlhttp = new ActiveXObject(MSXML_XMLHTTP_PROGIDS[i]);
    		            success=true;	
    		        }catch(e){}
    		    }
    		    if(!success)
    		        alert('attenzione: per navigare questo sito e necessario abilitare javascript o activeX');
    		}
    		return xmlhttp;
    	}
    	
    	
    	this.printOut = function(target, html){
    	   document.getElementById(target).innerHTML = html
    	}
    	
    	this.requestPage = function(url, target, method, parameters) {
    		if(method == undefined){method="GET";}
    		ajax.objSOCK=this.openSock(); // creo l'oggetto XMLHttpRequest
    		if(ajax.objSOCK){				
    			//ajax.objSOCK.onreadystatechange=function(){alert(ajax.objSOCK.readyState);};			
    			//ajax.objSOCK.onreadystatechange=function(){ajax.receiveResponse(target)};
    			ajax.objSOCK.onreadystatechange=function(){
    				if(ajax.objSOCK.readyState == 4) { 							
    					if(ajax.objSOCK.status == 200 || ajax.objSOCK.statusText=="Found") {							
    						ajax.printOut(target, ajax.objSOCK.responseText);    
    					}else{
    						ajax.printOut(target, "error: "+ajax.objSOCK.statusText);
    					}
    				}
    			};
    			ajax.objSOCK.open(method, url, true);						
    			if(method == "GET" || method == "get"){			
    				ajax.objSOCK.send('');							
    			}else{
    				ajax.objSOCK.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    				ajax.objSOCK.setRequestHeader('Content-length', parameters.length);
    				ajax.objSOCK.setRequestHeader('Connection', 'close');
    				ajax.objSOCK.send(parameters);
    			}
    		}
    	}	
    
    }
    purtroppo ancora non funziona...
    non so più dove sbattere la testa, le sto provando tutte...
    qualcuno vede l'errore che a me proprio sfugge?

  8. #8
    Originariamente inviato da citrus
    sono riusciuto a dare un occhiata alla guida ajax ...
    allora non l'ho scritta troppo bene

    cmq sia t'ho scritto l'esempio funzionante sopra e ti sconsiglio di usare il try catch per prendere un oggetto XMLHttpRequest, nella guida trovi una funzione che va con tutti i browsers e non da errori su browsers vecchi.



    P.S. leggiti anche la pillola sulla programmazione ad oggetti in javascript se hai tempo
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #9
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774
    no no la guida è perfetta! e anche la pillola.
    le ho lette un po' di corsa ma approfondirò meglio senz'altro!
    ti ringrazio tanto per l'aiuto.
    ora funziona ma purtroppo è sorto un altro problema....

    se richiamo una pagina all'interno dello stesso div in cui si trova il link non funziona...
    e non riesco proprio a capire come mai...
    se invece richiamo la pagina in un altro div allora tutto va alla perfezione.
    tu hai idea del perchè faccia così?

  10. #10
    Originariamente inviato da citrus
    se richiamo una pagina all'interno dello stesso div in cui si trova il link non funziona...
    e non riesco proprio a capire come mai...
    se invece richiamo la pagina in un altro div allora tutto va alla perfezione.
    tu hai idea del perchè faccia così?
    potrei avercela se solo avessi capito qualcosa di quanto hai appena scritto
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.