2010-10-08 8 views
5

Ich versuche Folgendes zu tun: Ich habe ein Formular, das mit dem jQuery Validation Plugin validiert ist. Es ist ein Feld, das ein paar Regeln hat:jQuery-Validierung: ein Callback ausgelöst durch eine bestimmte Regel?

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

Wenn nun eine der Regeln gebrochen ist, genauer gesagt die Remote-Regel, ich möchte einige zusätzliche Code auszulösen. Wenn also die Remote-Regel einen Fehler zurückgibt und die Fehlerbezeichnung neben dem Feld emailForRequest erscheint, brauche ich einen Callback, der einige andere Dinge im Hintergrund ausführt.

Kurz gesagt: kann ich sehen, welche Regel den Fehler auslöst, sehe es Code-weise ich meine, und die Ausführung einer zusätzlichen Funktion anhängen?


EDIT Ok, dank Liam Antwort und eine bessere Lese des Handbuchs ich dazu kam:

 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!"); 
         } 
        } 
       } 
      } 
     } , ... 

Doch ein Problem bleibt. Das Skript emailcheck.php kann 3 verschiedene Ergebnisse liefern, von denen eines wahr und das andere 2 sprachabhängig ist. Also würde ich gerne ein json-Objekt als Antwort mit einer var für den Fehlertyp (das gleiche in allen Sprachen) und eine var mit der Nachricht (translated) senden. Also, in meiner vollständigen Funktion kann ich dann den Fehlertyp überprüfen und entsprechend reagieren. Einfach genug, außer dass es den Validierungsstandardfehler vermasselt, der neben meinem Feld erscheinen sollte, und ich habe dafür noch keine Lösung gefunden.

+0

Ich würde gerne eine Lösung für diese auch sehen! – Patricia

+0

Können Sie uns sagen, wo Sie die erweiterten Anweisungen gefunden haben, die die emailForRequest-Option usw. detailliert beschreiben? –

+0

Hey Liam, sicher, und du hast mich übrigens auf die richtige Spur gesetzt! Hier ist die URL, wo ich die Anweisungen gefunden: http://docs.jquery.com/Plugins/Validation – Peter

Antwort

0

Dank FreekOne und seiner Idee eines Präfixes kam ich zu einer praktikablen Lösung. Ich sage funktionierend, da ich nicht sehr glücklich bin mit der Sauberkeit. Da ich nicht genau weiß, was passiert, wo im Validator und Basteln mit dem DataFilter und Erfolg Funktionalität des Ajax Anrufs die normale Arbeit des Validators gestört, kam ich zu der folgenden Lösung mit einem "versteckten" Präfix:

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(); 
            } 
           } 
          } 
         } 
        } 
       } ,... 

Während der Emailcheck.php gibt eine json codiert wahr, wenn alles klar geht oder json codierte Fehlermeldung wie

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

Schließlich habe ich einen Eintrag in meiner CSS-Datei, um sicherzustellen, dass das Präfix nicht angezeigt wird:

.validationErrorTag { 
    display: none; 
} 

Wie ich schon sagte, es funktioniert und ich werde es für jetzt verwenden, aber mit versteckten HTML-Präfixe zu arbeiten, um die Fehlermeldung zu erkennen, scheint ein wenig roh zu mir. Also, wenn jemand eine bessere Lösung kennt, lass es mich wissen.

1

Jetzt habe ich die richtige Zeit hatte, durch manuelle zu gehen, versuchen, diese

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

     }); 
+0

Seltsam, Ihre Antwort war für eine Sekunde gegangen, und jetzt kann ich wieder darauf zugreifen. Sehen Sie die Bearbeitung meiner ursprünglichen Frage, um zu sehen, was ich bisher habe. – Peter

+0

Ich habe meine Antwort bearbeitet, das sollte den Trick tun. Wenn Sie in Ihrem PHP-Code true von false zurückgeben, wird eine Standardnachricht angezeigt. Wenn Sie jedoch eine Zeichenfolge zurückgeben, wird die Zeichenfolge angezeigt. –

+0

Hey Liam, die Fehlermeldung war nie ein Problem, es ist das Standardverhalten des Validators. Das Problem war, dass ich irgendwo im Prozess Code erkennen musste, welcher Fehler ausgelöst wurde, ohne von der Zeichenkette abhängig zu sein, da die Zeichenkette selbst pro Sprache variabel ist. Wie auch immer, danke fürs Nachdenken mit mir. Ich habe eine Lösung gefunden, die ich in einer Minute in eine Antwort einfließen lassen werde. – Peter

1

jquery.validate.js - Linie 941:

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

Ich glaube, Sie ganz einfach Ihre eigenen einfügen könnte funktionieren hier. Sie haben sowohl die Antwort als auch den Elementnamen zur Verfügung, sodass das Targeting auf ein Element mit einem bestimmten Namen relativ einfach ist. Wenn Sie das Skript nicht selbst ändern möchten (d. H. Es wird vom CDN-Server geladen), könnten Sie Ihre eigene Fernvalidierungsregel basierend auf der ursprünglichen schreiben.

Abgesehen davon, AFAIK, gibt es keine eingebaute Funktion/Methode, die den Namen der Regel zurückgeben würde, die nicht validiert hat.

UPDATE

Eine Abhilfe für beide die Regel und das Element zu finden, die es ausgelöst wäre alles in der errorPlacement Funktion zu handhaben:

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

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

Hoffnung, das hilft.

+0

Hey FreekOne, danke für die Eingabe. Ich bin sehr nah an einer Lösung, die auf Liams Eltern beruht (und verschwunden ist?), Antworte und nah an dem, was du vorschlägst, aber an einem anderen Ort. Überprüfen Sie die Bearbeitung meiner ursprünglichen Frage. – Peter

+0

Bitte sehen Sie meine aktualisierte Antwort. Sie würden die Regel grundsätzlich anhand der Fehlermeldung und das Element anhand seiner ID identifizieren. Ich habe es nicht getestet, aber es sollte funktionieren. –

+0

Prost Mate!Aber ich habe ein Problem hier, ich kann error == 'Ihre Fehlermeldung' nicht verwenden, weil ich die Fehlermeldung nicht kenne (sie ist sprachabhängig und von unseren Kunden veränderbar). Aber es ist eine weitere sehr interessante Flugbahn! – Peter

6

Nicht sicher, ob dieser Thread noch geöffnet ist, aber ich konnte dieses Problem mit dem addMethod Aufruf lösen und ein Array verwenden, um die Fehlermeldung für dieses Formularelement zu verfolgen.

Hier ist der Code

//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

Würde dies nicht sofort den Wert von 'phoneStatus' zurückgeben und damit die Validierung unterbrechen? – Moss

+0

Die Schlüsselzeile lautet 'async: false'. Dies wird warten, bis der Anruf abgeschlossen ist, dann die Rückruffunktionen verarbeiten, und dann wird die 'return phoneStatus; '- Anweisung ausgeführt. –

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! 
            } 
           } 
          } 
         } 
        } 
       } 

* OR **

Sie json verwenden können! Senden Sie einfach den Antworttext im JSON-Format und überprüfen Sie dies anhand von "." Eigentum Zugang.

Verwandte Themen