En este grupo En todos

Grupo de Ajax



Problema con Ajax en Mozilla FireFox!

Diego
Ingenieria de sistemas universidad nac...
Escrito por Diego Gamboa
el 25/05/2010

Tengo un problema con Mozilla FireFox... Cuando uso el objeto xmlhttpRequest necesito que me devuelva un texto del Php pero en mozilla no me retorna nada solo vacio... Les muestro un poco para que lo prueven tambien y vean que puede ser... Porque en todos los demas navegadores si me devuelve y el php esta perfecto porque cree un archivo para imprimir su salida y llega hasta el valor que debe retornar pero no capturo nada en el navegador.... Por ahora es con el POST observen:


Function AjaxRequest() {
var req = new Object();

// -------------------
// Instance properties
// -------------------

/**
* Timeout period (in ms) until an async request will be aborted, and
* the onTimeout function will be called
*/
req. Timeout = null;

/**
* Since some browsers cache GET requests via XMLHttpRequest, an
* additional parameter called AjaxRequestUniqueId will be added to
* the request URI with a unique numeric value appended so that the requested
* URL will not be cached.
*/
req. GenerateUniqueUrl = true;

/**
* The url that the request will be made to, which defaults to the current
* url of the window
*/
req. Url = window.location.href;

/**
* The method of the request, either GET (default), POST, or HEAD
*/
req. Method = "GET";

/**
* Whether or not the request will be asynchronous. In general, synchronous
* requests should not be used so this should rarely be changed from true
*/
req. Async = true;

/**
* The username used to access the URL
*/
req. Username = null;

/**
* The password used to access the URL
*/
req. Password = null;

/**
* The parameters is an object holding name/value pairs which will be
* added to the url for a GET request or the request content for a POST request
*/
req. Parameters = new Object();

/**
* The sequential index number of this request, updated internally
*/
req. RequestIndex = AjaxRequest. NumAjaxRequests++;

/**
* Indicates whether a response has been received yet from the server
*/
req. ResponseReceived = false;

/**
* The name of the group that this request belongs to, for activity
* monitoring purposes
*/
req. GroupName = null;

/**
* The query string to be added to the end of a GET request, in proper
* URIEncoded format
*/
req. QueryString = "";

/**
* After a response has been received, this will hold the text contents of
* the response - even in case of error
*/
req. ResponseText = null;

/**
* After a response has been received, this will hold the XML content
*/
req. ResponseXML = null;

/**
* After a response has been received, this will hold the status code of
* the response as returned by the server.
*/
req. Status = null;

/**
* After a response has been received, this will hold the text description
* of the response code
*/
req. StatusText = null;

/**
* An internal flag to indicate whether the request has been aborted
*/
req. Aborted = false;

/**
* The XMLHttpRequest object used internally
*/
req. XmlHttpRequest = null;

// --------------
// Event handlers
// --------------

/**
* If a timeout period is set, and it is reached before a response is
* received, a function reference assigned to onTimeout will be called
*/
req. OnTimeout = null;

/**
* A function reference assigned will be called when readyState=1
*/
req. OnLoading = null;

/**
* A function reference assigned will be called when readyState=2
*/
req. OnLoaded = null;

/**
* A function reference assigned will be called when readyState=3
*/
req. OnInteractive = null;

/**
* A function reference assigned will be called when readyState=4
*/
req. OnComplete = null;

/**
* A function reference assigned will be called after onComplete, if
* the statusCode=200
*/
req. OnSuccess = null;

/**
* A function reference assigned will be called after onComplete, if
* the statusCode! = 200
*/
req. OnError = null;

/**
* If this request has a group name, this function reference will be called
* and passed the group name if this is the first request in the group to
* become active
*/
req. OnGroupBegin = null;

/**
* If this request has a group name, and this request is the last request
* in the group to complete, this function reference will be called
*/
req. OnGroupEnd = null;

// Get the XMLHttpRequest object itself
req. XmlHttpRequest = AjaxRequest. GetXmlHttpRequest();
if (req. XmlHttpRequest==null) { return null; }

// -------------------------------------------------------
// Attach the event handlers for the XMLHttpRequest object
// -------------------------------------------------------
req.xmlHttpRequest.onreadystatechange =
function() {
if (req==null || req. XmlHttpRequest==null) { return; }
if (req=xmlHttpRequest.readyState=.1) { req. OnLoadingInternal(req); }
if (req=xmlHttpRequest.readyState=.2) { req. OnLoadedInternal(req); }
if (req=xmlHttpRequest.readyState=.3) { req. OnInteractiveInternal(req); }
if (req=xmlHttpRequest.readyState=.4) { req. OnCompleteInternal(req); }
};

// ---------------------------------------------------------------------------
// Internal event handlers that fire, and in turn fire the user event handlers
// ---------------------------------------------------------------------------
// Flags to keep track if each event has been handled, in case of
// multiple calls (some browsers may call the onreadystatechange
// multiple times for the same state)
req. OnLoadingInternalHandled = false;
req. OnLoadedInternalHandled = false;
req. OnInteractiveInternalHandled = false;
req. OnCompleteInternalHandled = false;
req. OnLoadingInternal =
function() {
if (req. OnLoadingInternalHandled) { return; }
AjaxRequest. NumActiveAjaxRequests++;
if (AjaxRequest. NumActiveAjaxRequests==1 && typeof(window['AjaxRequestBegin'])=="function") {
AjaxRequestBegin();
}
if (req. GroupName! =null) {
if (typeof(AjaxRequest. NumActiveAjaxGroupRequests[req. GroupName])=="undefined") {
AjaxRequest. NumActiveAjaxGroupRequests[req. GroupName] = 0;
}
AjaxRequest. NumActiveAjaxGroupRequests[req. GroupName]++;
if (AjaxRequest. NumActiveAjaxGroupRequests[req. GroupName]==1 && typeof(req. OnGroupBegin)=="function") {
req. OnGroupBegin(req. GroupName);
}
}
if (typeof(req. OnLoading)=="function") {
req. OnLoading(req);
}
req. OnLoadingInternalHandled = true;
};
req. OnLoadedInternal =
function() {
if (req. OnLoadedInternalHandled) { return; }
if (typeof(req. OnLoaded)=="function") {
req. OnLoaded(req);
}
req. OnLoadedInternalHandled = true;
};
req. OnInteractiveInternal =
function() {
if (req. OnInteractiveInternalHandled) { return; }
if (typeof(req. OnInteractive)=="function") {
req. OnInteractive(req);
}
req. OnInteractiveInternalHandled = true;
};
req. Abort = function() // introducido por marco 20/07/2008
{
req.xmlHttpRequest.abort();
};
req. OnCompleteInternal =
function() {
if (req. OnCompleteInternalHandled || req. Aborted) { return; }
req. OnCompleteInternalHandled = true;
AjaxRequest. NumActiveAjaxRequests--;
if (AjaxRequest. NumActiveAjaxRequests==0 && typeof(window['AjaxRequestEnd'])=="function") {
AjaxRequestEnd(req. GroupName);
}
if (req. GroupName! =null) {
AjaxRequest. NumActiveAjaxGroupRequests[req. GroupName]--;
if (AjaxRequest. NumActiveAjaxGroupRequests[req. GroupName]==0 && typeof(req. OnGroupEnd)=="function") {
req. OnGroupEnd(req. GroupName);
}
}
req. ResponseReceived = true;
req. Status = req.xmlHttpRequest.status;
req. StatusText = req.xmlHttpRequest.statusText;
req. ResponseText = req.xmlHttpRequest.responseText;
req. ResponseXML = req.xmlHttpRequest.responseXML;
if (typeof(req. OnComplete)=="function") {
req. OnComplete(req);
}
if (req=xmlHttpRequest.status=.200 && typeof(req. OnSuccess)=="function") {
req. OnSuccess(req);
}
else if (typeof(req. OnError)=="function") {
req. OnError(req);
}

// Clean up so IE doesn't leak memory
delete req. XmlHttpRequest['onreadystatechange'];
req. XmlHttpRequest = null;
};
req. OnTimeoutInternal =
function() {
if (req! =null && req. XmlHttpRequest! =null &&! Req. OnCompleteInternalHandled) {
req. Aborted = true;
req.xmlHttpRequest.abort();
AjaxRequest. NumActiveAjaxRequests--;
if (AjaxRequest. NumActiveAjaxRequests==0 && typeof(window['AjaxRequestEnd'])=="function") {
AjaxRequestEnd(req. GroupName);
}
if (req. GroupName! =null) {
AjaxRequest. NumActiveAjaxGroupRequests[req. GroupName]--;
if (AjaxRequest. NumActiveAjaxGroupRequests[req. GroupName]==0 && typeof(req. OnGroupEnd)=="function") {
req. OnGroupEnd(req. GroupName);
}
}
if (typeof(req. OnTimeout)=="function") {
req. OnTimeout(req);
}
// Opera won't fire onreadystatechange after abort, but other browsers do.
// So we can't rely on the onreadystate function getting called. Clean up here!
delete req. XmlHttpRequest['onreadystatechange'];
req. XmlHttpRequest = null;
}
};

// ----------------
// Instance methods
// ----------------
/**
* The process method is called to actually make the request. It builds the
* querystring for GET requests (the content for POST requests), sets the
* appropriate headers if necessary, and calls the
* XMLHttpRequest. Send() method
*/
req. Process =
function() {
if (req. XmlHttpRequest! =null) {
// Some logic to get the real request URL
if (req. GenerateUniqueUrl && req. Method=="GET") {
req. Parameters["AjaxRequestUniqueId"] = new Date(). GetTime() + "" + req. RequestIndex;
}
var content = null; // For POST requests, to hold query string
for (var i in req. Parameters) {
if (req.queryString.length>0) { req. QueryString += "&"; }
req. QueryString += encodeURIComponent(i) + "=" + encodeURIComponent(req. Parameters[i]);
}
if (req. Method=="GET") {
if (req.queryString.length>0) {
req. Url += (req.url.indexOf("? ")>-1)? "&":"? ") + req. QueryString;
}
}
req.xmlHttpRequest.open(req. Method,req. Url,req. Async,req. Username,req. Password);
if (req. Method=="POST") {

if (typeof(req.xmlHttpRequest.setRequestHeader)! ="undefined") {
req.xmlHttpRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
}
content = req. QueryString;

}
if (req. Timeout>0) {
setTimeout(req. OnTimeoutInternal,req. Timeout);
}
req.xmlHttpRequest.send(content);
}
};

/**
* An internal function to handle an Object argument, which may contain
* either AjaxRequest field values or parameter name/values
*/
req. HandleArguments =
function(args) {
for (var i in args) {
// If the AjaxRequest object doesn't have a property which was passed, treat it as a url parameter
if (typeof(req[i])=="undefined") {
req. Parameters[i] = args[i];
}
else {
req[i] = args[i];
}
}
};

/**
* Returns the results of XMLHttpRequest. GetAllResponseHeaders().
* Only available after a response has been returned
*/
req. GetAllResponseHeaders =
function() {
if (req. XmlHttpRequest! =null) {
if (req. ResponseReceived) {
return req.xmlHttpRequest.getAllResponseHeaders();
}
alert("Cannot getAllResponseHeaders because a response has not yet been received");
}
};

/**
* Returns the the value of a response header as returned by
* XMLHttpRequest,getResponseHeader().
* Only available after a response has been returned
*/
req. GetResponseHeader =
function(headerName) {
if (req. XmlHttpRequest! =null) {
if (req. ResponseReceived) {
return req.xmlHttpRequest.getResponseHeader(headerName);
}
alert("Cannot getResponseHeader because a response has not yet been received");
}
};

alert("retorno del ajaxrequest(): "+req); // aqui en FireFox vuelve vacio..... (- _-)
return req;
}

Felipe Cáceres
Tecnologia en informatica universidad ...
Escrito por Felipe Cáceres
el 25/05/2010

Y esto le funciona en explorer?

Diego Gamboa
Ingenieria de sistemas universidad nac...
Escrito por Diego Gamboa
el 25/05/2010

Si Felipe el sistema corre en IE! Pero esta funcion no retorna nada en Mozilla fireFox!

Diego Gamboa
Ingenieria de sistemas universidad nac...
Escrito por Diego Gamboa
el 31/05/2010

He estado haciendo varias pruebas y encontre con que la peticion si es enviada al servidor y que el archivo. Php que mando a ejecutar en el servidor tambien corre perfecto pero el detalle es cuando devuelve el resultado. Este no es capturado! Solo cuando uso el Mozilla FireFox.... Alguien tiene alguna idea de porque puede estar pasando esto en este navegador?

Diego Gamboa
Ingenieria de sistemas universidad nac...
Escrito por Diego Gamboa
el 02/06/2010

Encontre el problema es en el open de la conexión,

req.xmlHttpRequest.open(req. Method,req. Url,req. Async,req. Username,req. Password);

me retorna una respuesta cuando le envio req. Async=true con el Mozilla FireFox y es la unica manera que he encontrado para que el navegador pueda usar el listener para la peticion al servidor, si conocen una manera de escuchar con mozilla la petición cuando la conexion es asyncronic se los agradeceria!

Saludos!

Andrea Aaa
A Coruña, España
Escrito por Andrea Aaa
el 11/06/2010

Buenas!

Te un problema parecido: yo tengo el siguiente texto:


Function getProvinciasCAE(idComboTH,codCAE,valorSeleccionado){
noraapi_provincias = new NORA. Provincia({
asynchronous: true,
baseUrl: 'https://www.geo.euskadi. Net/t17iApiJSWar',
onFailure: on_failure,
on406: on_failure,
onSuccess: function (response) {

fncInicializarCombo(idComboTH);

var provincias = response.responseText.evalJSON(true);


for( var i=0;i < provincias.data.length;i++) {

fncAnadirOpcionCombo (idComboTH, fncPasarMayusculasNORA(provincias. Data[i]. DescripcionOficial),provincias. Data[i]. Id,valorSeleccionado);
}
}
} );
noraapi_provincias. GetByDesc("",{autonomiaId:codCAE});


}


VAle pues en var provincias = response.responseText.evalJSON(true);

e n el firefox no me devuelve nada la funcion response. ResponseText, pero en el explorer si me funciona...!


Alguien sabe porque puede ser? Es q me estoy volviendo un poco loca!

Graciasssssssssss


Diego Gamboa
Ingenieria de sistemas universidad nac...
Escrito por Diego Gamboa
el 11/06/2010

Hola Andrea.

Intenta cambiando la conexión asynchronous a false,a ver que ocurre... En mi caso, como mencione anteriormente, era que no tenia respuesta si abria conexion asincrona, lo que no logro ver en tu codigo es donde evaluas el estatus de la peticion que haces al servidor, algo asi como:

req.xmlHttpRequest.onreadystatechange =
function() {
if (req==null || req. XmlHttpRequest==null) {
return; }
if (req=xmlHttpRequest.readyState=.1) { req. OnLoadingInternal(req); }
if (req=xmlHttpRequest.readyState=.2) { req. OnLoadedInternal(req); }
if (req=xmlHttpRequest.readyState=.3) { req. OnInteractiveInternal(req); }
if (req=xmlHttpRequest.readyState=.4) {req. OnCompleteInternal(req); }
};

o alguna otra que verifique cuando el estatus sea '200' para que despues captures la respuesta.

Saludos Cordiales.

Carlos Francisco
Ing. de sistemas una
Escrito por Carlos Francisco
el 11/06/2010

El Firefox no acepta la actualización asincrónica, por ende la propiedad asynchronous debe ser false.

Como recomendación, al crear una rutina de conexión en Ajax debe disponer de una función que evalúe el navegador en uso y ejecute la generación del objeto conector que mejor se ajuste al navegador, así como la posibilidad de efectuar una conexión de forma sincrónica o asincrónica.

Para evitar estos inconvenientes le recomiendo que aplique un framework para el desarrollo de javascript, en mi opinión el MooTools (dirigido a la programación de clases) o el Jquery (manejo de estilos).

Cualquier observación o duda, puede dirigirse a mi correo, con mucho gusto le enviare bibliotecas de funciones aplicadas al Ajax, así como amplia gama de material documental sobre el tema.

Que tenga suerte.

Diego Gamboa
Ingenieria de sistemas universidad nac...
Escrito por Diego Gamboa
el 14/06/2010
Hola Carlos, si tienes razon pero cuando use la conexion con asyncronus true fue que me retorno el texto pero fue forzando al navegador a esperar con un while (poco practico) pero en el momento me ayudo a entender algunas cosas, pero si voy a estudiar mas con el jquery que ya varias personas me han comentado sobre este. Muchas gracias. Saludos Cordiales.
Acram Hamade
Ingenieria en computacion universidad ...
Escrito por Acram Hamade
el 27/09/2010

Prueba esto con mozilla..! Debe Funcionarte.!.. SALUDOS :)


Document. GetElementById("div-donde-mostrar-el-contenido"). InnerHTML='<img src="img/loading2. Gif"> Cargando, por favor espere... ';
if (window. XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft. XMLHTTP");
}
xmlhttp. Onreadystatechange=function()
{
if (xmlhttp. ReadyState==4 && xmlhttp. Status==200)
{
document. GetElementById("div-donde-mostrar-el-contenido"). InnerHTML=xmlhttp. ResponseText;
}
}
xmlhttp. Open("POST | GET","URL. Extension? "+variable1+"&parametro 2="+variable N, true);
xmlhttp. Send(null);

Felipe Cáceres
Tecnologia en informatica universidad ...
Escrito por Felipe Cáceres
el 09/02/2011

Mira esto si que funciona, cree una preticion para cargar los datos de un combo y al seleccionar pega los datos de la persona en un div...


Function objetoAjax(){
var xmlhttp=false;
try {
xmlhttp = new ActiveXObject("Msxml2. XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft. XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}

if (! Xmlhttp && typeof XMLHttpRequest! ='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}

function pedirDatos(){
//donde se mostrará el resultado
divResultado = document. GetElementById('resultado');
//tomamos el valor de la lista desplegable
nom=document.formulario.lista. Value;

//instanciamos el objetoAjax
ajax=objetoAjax();
//usamos el medoto POST
//archivo que realizará la operacion
//tu_archivo. Php
ajax. Open("POST", "datoscliente. Php",true);
ajax. Onreadystatechange=function() {
if (ajax. ReadyState==4) {
//mostrar resultados en esta capa
divResultado. InnerHTML = ajax. ResponseText
}
}
ajax. SetRequestHeader("Content-Type","application/x-www-form-urlencoded");
//enviando los valores
ajax. Send("nombres="+nom)
}