2016-12-05 2 views
0

Ich habe ein Szenario, wenn ich 3 Dropdown-Felder habe und zwei Validierungen über sie implementieren muss, aber als Gruppe.jQuery-Validierungslogik schlägt fehl, wenn das letzte Element gültig ist

1) Von 3, 2 Dropdown-Listen sollten einen anderen Wert als "Nein" haben. Dies entspricht der erforderlichen Validierung. Anstatt auf Leer zu prüfen, wird nach "Nein" gesucht.

2) No 2 dropdowns können denselben Wert haben.

Fiddle

jQuery.validator.addMethod("require_from_group", function(value, element, options) { 
    var numberRequired = options[0]; 
    var selector = options[1]; 
    var fields = $(selector, element.form); 
    var filled_fields = fields.filter(function() { 
    // it's more clear to compare with empty string 
    return $(this).val() != "No"; 
    }); 
    var empty_fields = fields.not(filled_fields); 

    // we will mark only first empty field as invalid 
    if (filled_fields.length < numberRequired){ //&& empty_fields[0] == element) { 
    return false; 
    } 
    return true; 
// {0} below is the 0th item in the options field 
}, jQuery.format("Please fill out at least {0} of these fields.")); 

jQuery.validator.addMethod("notEqualToGroup", function(value, element, options) { 
var numberRequired = options[0]; 
var selector = options[1]; 
// get all the elements passed here with the same class 
var elems = $(element).parents('form').find(selector).not(element); 
// the value of the current element 
var valueToCompare = value; 
// count 
var matchesFound = 0; 
// loop each element and compare its value with the current value 
// and increase the count every time we find one 
jQuery.each(elems, function(){ 
    thisVal = $(this).val(); 
    if(thisVal == valueToCompare){ 
      matchesFound++; 
     } 
}); 

    if (matchesFound >= numberRequired){ //&& elems[0] != element) { 
    return false; 
    } 
    return true; 
}, jQuery.format("No two fields can have same value.")); 

Eines der Szenarien ist fehlgeschlagen das heißt, wenn select1 und select2 nicht „Nein“, aber immer noch denselben Wert haben keine msg angezeigt wird.

Kann jemand bitte vorschlagen was fehlt. Dank

+0

Warum Sie eine 7-jährige Version von jQuery Validate verwenden ?! Viele Bugs wurden seither in 'require_from_group' behoben. Bitte aktualisieren Sie auf Version 1.15.0 und refaktorieren Sie Ihren Code entsprechend. – Sparky

Antwort

1
  1. Aktualisieren Sie das Plugin von der fast 7-jährigen Version 1.7 bis the latest which is 1.15.

  2. Ersetzen Sie die veraltete Version require_from_group durch die neueste Version version 1.15.

  3. ersetzen jQuery.format("No two fields can have same value.") mit $.validator.format("No two...

Sie werden feststellen, dass diese aktualisierte Version vorhersagbar ein bisschen mehr funktioniert.


EDIT:

Sie müssen auch eine komplette Neuentwicklung auf notEqualToGroup Regel:

$.validator.addMethod("notEqualToGroup", function(value, element, options) { 

    var isvalid = true, 
     values = [], 
     temp = []; 

    // put all values into an array 
    $(options).each(function() { 
     values.push($(this).val()); 
    }); 

    // check array for duplicates 
    $.each(values, function(key, val) { 
     if ($.inArray(val, temp) === -1) { 
      temp.push(val); 
     } else { 
      isvalid = false; // duplicate found 
     } 
    }); 

    return isvalid; 
}, $.validator.format("No two fields can have same value.")); 

Im Wesentlichen alle in ein Array drei Werte setzen und auf Dubletten prüfen.

.... 
select1: { 
    require_from_group: [2, ".at_least_one"], 
    notEqualToGroup: ".at_least_one" 
}, 
.... 

DEMO: jsfiddle.net/nu4dcstv/

+0

danke @sparky, eigentlich benutze ich tatsächlich Version 1.11, aber einige, wie ich eine meiner alten Proben genommen und es gegabelt habe. Hier ist der Update-Link [Geige] (http://jsfiddle.net/uaqadLgd/4/). ** require_from_group ** Methode funktionierte ok, aber ich bin nicht in der Lage, ** notEqualToGroup ** zu entwerfen. Alles, was ich will, ist der aktuelle Elementwert, der mit anderen Gruppenelementwerten validiert werden soll, und wenn die Übereinstimmung gefunden wurde, schlägt die Validierung fehl. –

+0

[fiddle] (http://jsfiddle.net/uaqadLgd/6/) Ich denke, ich habe das Problem mit dem Stopp-Skript behoben, aber die Validierung läuft sofort und wartet nicht auf das Drücken der Taste. Auch der Fall, in dem das letzte Element der Gruppe gültig ist, erzeugt keine msg steht noch. hoffe klar, dass ich meinen Standpunkt darlegen kann. –

+0

@NikhilGupta, setzen Sie 'onfocusout: false' und' onclick: false', wenn Sie nur die Validierung auslösen möchten, wenn Sie versuchen, die Anfrage zu senden. Scheint für mich zu funktionieren: "NO, NO, YES" löst einen Fehler aus: http://jsfiddle.net/uaqadLgd/7/ – Sparky

Verwandte Themen