2010-10-08 6 views
5

Estoy tratando de hacer lo siguiente: Tengo un formulario que se valida con el complemento de validación jQuery. Hay un campo que tiene un par de reglas:validación de jQuery: ¿una devolución de llamada activada por una cierta regla?

  var validator = $("#myForm").validate({ 
       rules: { 
        emailForRequest: { 
         required: true, 
         email: true, 
         remote: "'emailcheck.php" 
        } 
       } , 
... 

Ahora, cuando una de las reglas se rompe, más precisamente la regla remota, quiero provocar algo de código adicional. Entonces, si la regla remota arroja un error y su etiqueta de error aparece junto al campo emailForRequest, necesito una devolución de llamada que haga otras cosas en segundo plano.

En resumen: ¿puedo ver qué regla desencadena el error, lo veo en código, quiero decir, y adjuntar la ejecución de una función extra a la misma?


EDITAR Bien, gracias a la respuesta de Liam y una mejor lectura del manual llegué a esto:

 rules: { 
      emailForRequest: { 
       required: true, 
       email: true, 
       remote: { 
        url: "'emailcheck.php" , 
        type: "post" , 
        complete: function(data){ 
         if(data.responseText != "true") { 
          alert("Sorry mate, this email address was registered but never activated!"); 
         } 
        } 
       } 
      } 
     } , ... 

Pero un problema permanece. El script emailcheck.php puede devolver 3 resultados diferentes, uno de los cuales es verdadero y los otros 2 son dependientes del idioma. Así que me gustaría enviar un objeto json como la respuesta con una var para el tipo de error (el mismo en todos los idiomas) y una var con el mensaje (traducido). Entonces, en mi función completa puedo verificar el tipo de error y responder de acuerdo con eso. Lo suficientemente fácil, excepto que arruinará el error estándar de validación que se supone que aparece junto a mi campo y todavía no he encontrado una solución para eso.

+0

¡Me encantaría ver una solución para esto también! – Patricia

+0

¿Puedes decirnos dónde encontraste las instrucciones avanzadas, detallando la opción de emailForRequest, etc. –

+0

Hola Liam, seguro y por cierto me pusiste en el camino correcto! Aquí está la URL donde encontré las instrucciones: http://docs.jquery.com/Plugins/Validation – Peter

Respuesta

0

Gracias a FreekOne y su idea de un prefijo llegué a una solución viable. Sí, digo viable, ya que no estoy muy contento con la limpieza de la misma. Como no sé exactamente qué sucede donde en el validador y retoques con el filtro de datos y la funcionalidad de éxito de la llamada ajax interrumpió el funcionamiento normal del validador, llegué a la siguiente solución con un prefijo "oculto":

var validator = $("#myForm").validate({ 
       rules: { 
        emailForRequest: { 
         required: true, 
         email: true, 
         remote: { 
          url: "emailcheck.php" , 
          type: "post" , 
          complete: function(data){ 
           if(data.responseText != true) { 
            if(data.responseText.search(/validationErrorTag/) > 0 && 
             data.responseText.search(/inactive/) > 0) { 
             inactiveFunctionality(); 
            } 
           } 
          } 
         } 
        } 
       } ,... 

Mientras se realiza la comprobación de correo electrónico.php devuelve un JSON codificado cierto si todo va bien o JSON codificado mensaje de error como

<span class="validationErrorTag">inactive</span>This address is not yet activated. 

Por último, tengo una entrada en mi archivo css para asegurarse de que el prefijo no aparece:

.validationErrorTag { 
    display: none; 
} 

Como dije, funciona y voy a usarlo por ahora, pero trabajar con prefijos html ocultos para reconocer el mensaje de error me parece un poco grosero. Entonces, si alguien conoce una solución mejor, por favor avíseme.

1

Ahora he tenido tiempo adecuado para pasar por el manual, prueba este

var validator = $("#myForm").validate({ 
      rules: 
       { 
       emailForRequest: 
       { 
        required: true, 
        email: true, 
        remote: "emailcheck.php" 
       } 
      }, 
      messages: 
      { 
       emailForRequest: 
       { 
       remote: jQuery.format("{0}") 
       } 
      } 

     }); 
+0

Extraño, su respuesta desapareció por un segundo y ahora puedo acceder a ella nuevamente. Ver la edición de mi pregunta original para ver lo que tengo hasta ahora. – Peter

+0

He editado mi respuesta, eso debería ser el truco. Si devuelve verdadero o falso desde su php, mostrará el mensaje predeterminado, pero si devuelve una cadena, mostrará la cadena. –

+0

Hola Liam, devolver la cadena de error nunca fue un problema, es el comportamiento predeterminado del validador. El problema era que en algún punto del proceso necesitaba reconocer, en código, qué error se produjo sin depender de la cadena, ya que la cadena en sí misma es variable por idioma. De todos modos, gracias por pensar conmigo. Encontré una solución que incluiré en una respuesta en un minuto. – Peter

1

jquery.validate.js - Línea 941:

success: function(response) { 
    validator.settings.messages[element.name].remote = previous.originalMessage; 
    var valid = response === true; 
    if (valid) { 
    .... 

Creo que se podría muy fácilmente insertar su propio funcionar aquí. Tiene la respuesta y el nombre del elemento disponibles, por lo que orientar un elemento con un nombre en particular sería bastante fácil. Si no desea modificar el script en sí (es decir, si se está cargando desde el servidor CDN), puede escribir su propia regla de validación remota basada en la original.

Aparte de eso, AFAIK, no hay una función/método incorporado que devuelva el nombre de la regla que no se validó.

ACTUALIZACIÓN

Una solución para encontrar tanto la regla y el elemento que provocó que sería para manejar todo en la función errorPlacement:

... 
}, 
errorPlacement: function(error, element) { 
    error.insertBefore(element); // default positioning 

    if ((error == 'your error message') && (element.attr('id') == 'your_targets_id')) { 
     // your function 
    } 
}, 
... 

Espero que esto ayude.

+0

Hola, FreekOne, gracias por la entrada. Estoy muy cerca de una solución basada en los earliers (¿y desapareció?) De Liam, respuesta que está cerca de lo que sugieres pero en un lugar diferente. Verifique la edición de mi pregunta original. – Peter

+0

Por favor vea mi respuesta actualizada. Básicamente identificaría la regla por el mensaje de error y el elemento por su ID. No lo he probado, pero debería funcionar. –

+0

¡Salud, amigo!Pero tengo un problema aquí, no puedo usar el error == 'su mensaje de error' porque no sé el mensaje de error (depende del idioma y es modificable por nuestros clientes). ¡Pero es otra trayectoria más interesante! – Peter

6

No estoy seguro si este hilo aún está abierto, pero pude resolver este problema con la llamada addMethod y usar una matriz para realizar un seguimiento del mensaje de error para ese elemento de formulario.

Este es el código

//phone 
var phoneStatus = null; 
$.validator 
.addMethod(
    'validatePhone', 
    function() 
    { 
     $.ajax({ 
      url: /path/to/script, 
      async: false, 
      dataType: 'json', 
      data:{ formDataHere}, 
      success: function(data) 
      { 
       errorMessages['validatePhone'] = data.message; 
       phoneStatus = data.status; 
      }, 
      complete: function(){}, 
      error: function(){} 
     }); 
     return phoneStatus; 
    }, 
    function() 
    { 
     return errorMessages['validatePhone']; 
    } 
); 
+0

¿No devolvería esto inmediatamente el valor de 'phoneStatus' y así rompería la validación? – Moss

+0

La línea clave es 'async: false'. Esto esperará hasta que se complete la llamada, luego procesará las funciones de devolución de llamada, y luego se ejecutará la declaración 'return phoneStatus;'. –

0
var validator = $("#myForm").validate({ 
    rules: { 
     emailForRequest: { 
       required: true, 
       email: true, 
       remote: { 
        url: "emailcheck.php" , 
        type: "post" , 
        complete: function(data){ 
         if(data.responseText != true) { 
          var type = data.responseText.split('|'); 
          if(type[0]=='inactive') { 
             inactiveFunctionality(); 
// type[1] contains your message, display it using any method! e.g. $('#id').html(type[1]); or sooo! 
            } 
           } 
          } 
         } 
        } 
       } 

* O **

puede utilizar JSON! simplemente envíe el texto de la respuesta en formato json y marque aquí en función de "." acceso a la propiedad

Cuestiones relacionadas