Foros del Web » Programando para Internet » Javascript »

Dolor de cabeza con clase

Estas en el tema de Dolor de cabeza con clase en el foro de Javascript en Foros del Web. Bueno les comento mi problema, estoy haciendo un registro de usuarios con ajax, pero bueno mientras el usuario va escribiendo los datos en el formulario, ...
  #1 (permalink)  
Antiguo 30/09/2009, 14:43
 
Fecha de Ingreso: febrero-2008
Mensajes: 33
Antigüedad: 16 años, 2 meses
Puntos: 1
Dolor de cabeza con clase

Bueno les comento mi problema, estoy haciendo un registro de usuarios con ajax, pero bueno mientras el usuario va escribiendo los datos en el formulario, va validando cada campo del formulario....
Entonces hice una clase en javascript, con estos metodos:

clase Registro
- init (Constructor)
- __checkPass (checkea si el password es seguro o no)
- ajax (Esta funcion se llama siempre que se va escribiendo datos dentro de algun input del form. Le tendria que haber puesto otro nombre para que sea mas claro)
- __checkAll (Checkea que todos los input del form esten ok)
- registrar (aca hace una llamada ajax al archivo php para que registre al usuario en la db)

Bueno el problema, es que cuando yo instancio el objeto, instancio estos atributos por defecto en false. Esto se ponen en true, si la llamada ajax cada ves que se va completando el formulario da ok. Hasta aca muy bien.
Pero cuando el usuario hace click en el boton de registrar, el valor de estos atributos siempre queda en false, por mas que le cambie el valor a true cuando la llamada ajax da ok, es como que no lo retiene ese valor, y siempre queda en false.

Aca dejo el codigo que estoy usando:
signup.html
Código:
    $(function(){        
        var registro = new Registro();
    	$("#usuario").keyup(function(){ registro.ajax(1, 'username'); });
    	$("#nombre").keyup(function(){ registro.ajax(3, 'firstname'); });
    	$("#apellido").keyup(function(){ registro.ajax(4, 'lastname'); });
    	$("#password").keyup(function(){ registro.ajax(5, 'pass'); });
    	$("#email").keyup(function(){ registro.ajax(2, 'mail'); });
    	$("#pais").keyup(function(){ registro.ajax(6, 'country'); });

    	$("#join").click(function(){
	    alert(registro.usuario); //Esto siempre me devuelve false
    	});
   });
class.js
Código:
var Class = function(current,previous){
// Comprobamos si tenemos una Class que extender.
      previous = typeof previous == 'undefined' ? {} : previous.prototype;
  // Extendemos con las propiedades de la Class anterior
      for(p in previous){
	// Si no existe la propiedad la añadimos
            if(typeof current[p] == 'undefined') current[p] = previous[p];
	// Si es una función
            else if(typeof previous[p] == 'function'){
	      // añadimos this.parent() a la función de la Class actual.
                  current[p] = (function(tmp){
                                var _parent = function(){
                                    this.parent = _parent.parent;
                                    return tmp.apply(this, arguments);
                                    }
                                    return _parent;
                                })(current[p]);
	// Igualamos this.parent() al método de la Class anterior.
                current[p].parent = previous[p];
            }
        }
	// Construimos el contenedor
        var construct = function(){
          if(this.init) this.init.apply(this,arguments);
        }
	// Le aplicamos los métodos extendidos
        construct.prototype = current;
	// asignamos un constructor
        construct.constructor = Class;
	//Devolvemos el constructor.
        return construct;
    }
Registro.js
Código:
var Registro = new Class(
	{
		init:function()
		{
			this.usuario = false;
			this.nombre = false;
			this.apellido = false;
			this.password = false;
			this.email = false;
			this.pais = false;
			this.nacimiento = false;
		},
		
		__checkPass:function(valor)
		{
			score = 0;
			score += valor.length * 2.5;
			if (valor.match(/(.*[0-9].*[0-9].*[0-9])/)){ score += 5;} 
			if (valor.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)){ score += 5 ;}
			if (valor.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)){  score += 10;} 
			if (valor.match(/([a-zA-Z])/) && valor.match(/([0-9])/)){  score += 15;} 
			if (valor.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && valor.match(/([0-9])/)){  score += 15;}
			if (valor.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && valor.match(/([a-zA-Z])/)){score += 15;}
			if (valor.match(/^\w+$/) || valor.match(/^\d+$/) ){ score -= 5;}
			if ( score < 0 ){score = 0;} 
			if ( score > 100 ){  score = 100;} 
			
			return (score < 25) ? false : true;
		},
		
		// Method Ajax (Check if form is ok)
		ajax:function(tipo, idvalidador)
		{
			var $peticion;
			var $valor;
			var $ajax = true;
			var $error;
			
			switch(tipo)
			{
				case 1:
					$var = "usuario";
					$peticion = "index.php?controller=ajax&action=usuario";
					$valor = $("#usuario").val();
					$error = "Su usuario no es v&aacute;lido o ya existe un usuario con ese nick";
				break;
				case 2:
					$var = "email";
					$peticion = "index.php?controller=ajax&action=email";
					$valor = $("#email").val();
					$error = "Su email no es v&aacute;lido o es utilizado por otra persona";
				break;
				case 3:
					$var = "nombre";
					$ajax = false;
					$valor = $("#nombre").val();
					$error = "Tiene que completar con su nombre";
				break;
				case 4:
					$var = "apellido";
					$ajax = false;
					$valor = $("#apellido").val();
					$error = "Tiene que completar con su apellido";
				break;
				case 5:
					$var = "password";
					$ajax = false;
					$valor = $("#password").val();
					$error = "El password tiene que tener mas de 3 caracteres";
				break;
				case 6:
					$var = "pais";
					$ajax = false;
					$valor = $("#pais").val();
					$error = "Tiene que completar el pais en el que vive";
				break;
				case 7:
					$var = "nacimiento";
					$ajax = false;
					// ----------------------------
					var day = $("#day").val();
					var month = $("#month").val();
					var year = $("#year").val();
					// ----------------------------
					$error = "Tiene que completar la fecha de nacimiento";
				break;
			}
			//endswitch;
			
			
			var msgOk = "<div class='formOk'><img src='template/default/images/tick-small.png' />Ok</div>";
			var msgError = "<div class='formError'><img src='template/default/images/cross-small.png' />" + $error + "</div>";
			
			
			if ($ajax)
			{
				// Ajax request
				$.post($peticion, { input: $valor },
				function(data) 
				{
					if (data=="ok") 
					{
						$("#" + idvalidador).html(msgOk);
						eval('this.' + $var + ' = true');
					}
					else {
						$("#" + idvalidador).html(msgError);
						eval('this.' + $var + ' = false');
					}
					alert("this." + $var + " = " + this.usuario);
                                        // Aca siempre me devuelve true (en caso que este todo ok)
				});
				// End Ajax request
			}
			else {
				if ($var=="nacimiento")
				{
					if (day!="dia" && month!="mes" && year!="anio")
					{
						eval('this.' + $var + ' = true');
						$("#" + idvalidador).html(msgOk);
					}
					else {
						eval('this.' + $var + ' = false');
						$("#" + idvalidador).html(msgError);
					}
				}
				else {
					if ($valor.length > 3)
					{
						eval('this.' + $var + ' = true');
						$("#" + idvalidador).html(msgOk);
						
						if ($var=="password")
						{
							// Check if is secure password
							if (this.__checkPass($valor))
							{
								$("#" + idvalidador).html("<div class='formOk'> <img src='template/default/images/tick-small.png' /> <font color='#04B404'><b>Su contrase&ntilde;a es segura</b></font></div>"); 
							}
							else {
								$("#" + idvalidador).html("<div class='formOk'> <img src='template/default/images/tick-small.png' /> <font color='#F78181'><b>Su contrase&ntilde;a es bastante insegura</b></font></div>");
							}
						}
					}
					else {
						eval('this.' + $var + ' = false');
						$("#" + idvalidador).html(msgError);
					}
				}
			}
		},
	
		__checkAll:function()
		{
			this.ajax(1, 'username');
			this.ajax(2, 'mail');
			this.ajax(3, 'firstname');
			this.ajax(4, 'lastname');
			this.ajax(5, 'pass');
			this.ajax(6, 'country');
			this.ajax(7, 'datenac');
		},

		registrar:function()
		{
			alert(this.usuario);
			
			this.__checkAll();
			if (this.usuario && this.email && this.nombre && this.apellido && this.password && this.pais && this.nacimiento)
			{
				alert("Registro")
			}
			else {
				if (!this.nacimiento){ $("#year").focus(); }
				if (!this.pais){ $("#pais").focus(); }
				if (!this.email){ $("#email").focus(); }
				if (!this.password){ $("#password").focus(); }
				if (!this.apellido){ $("#apellido").focus(); }
				if (!this.nombre){ $("#nombre").focus(); }
				if (!this.usuario){ $("#usuario").focus(); }
			}
		}
	});
Resumiendo:
El problema es que cuando esta llamada por ejemplo:
$("#usuario").keyup(function(){ registro.ajax(1, 'username'); });

Da true, no cambia el valor del atributo:
this.usuario = false;

La verdad que esto se me esta convirtiendo en un dolor de cabeza por eso lo posteo.
  #2 (permalink)  
Antiguo 30/09/2009, 16:05
 
Fecha de Ingreso: febrero-2008
Mensajes: 33
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: Dolor de cabeza con clase

Segui investigando y el problema esta aca:

Código:
$.post($peticion, { input: $valor },
                function(data)
                {
                    if (data=="ok")
                    {
                        $("#" + idvalidador).html(msgOk);
                        eval('this.' + $var + ' = true');
                    }
                    else {
                        $("#" + idvalidador).html(msgError);
                        eval('this.' + $var + ' = false');
                    }
                    alert("this." + $var + " = " + this.usuario);
                                        // Aca siempre me devuelve true (en caso que este todo ok)
                });
No me deja guardar variables dentro de la llamada ajax, ni tampoco ejecuta la funcion eval.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:43.