jQuery Validierung dynamische input-array
Wie zum validieren einer <select>
wenn es ein dynamisches array? Wie diese:
<select class="escolhaVidro id_material" name="id_material[]" id="id_material">
Zu klären: Diese <select>
montiert dynamisch von PHP, so dass ich nicht weiß, was die Indizes, so dass diese Art ist nicht möglich:
$(this).validate({
rules: {
"id_material[index]" : {
required : true
}
}
});
Und so seltsam dieses plugin funktioniert nicht:
$(this).validate({
rules: {
id_material : {
required : true
}
}
});
Ich auch versucht, eine CSS - class
required
im <select>
, aber nicht gut.
- docs.jquery.com/Plugins/Validation -- die Sie nicht scheinen, es richtig.
- Was sind Sie targeting mit
$(this)
? Sie haben zum Ziel dieform
. - Es ist genau das, was ich habe.
- Es ist wirklich nicht genau, was Sie haben, wenn es sich innerhalb einer
live('submit')
- handler-Funktion. Dies ist der Grund, warum dein code nicht funktioniert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht merkwürdig. Es funktioniert nicht, weil Sie nicht wirklich gezielt etwas. Es gibt keinen Kontext oder Rahmen für
$(this)
einen Sinn haben.Müssen Sie entsprechend richten Sie Ihre
<form>
element:beispielsweise durch
id
......oder jede andere gültige jQuery-Selektor, dass die Ziele den tatsächlichen
<form></form>
Sie wollen validiert.Hier ist ein Allgemeines Beispiel, wie Sie überprüfen
select
element, das Sie leicht anpassen kann in Ihrer situation:http://jsfiddle.net/Gy24q/
Wichtig, die erste, oder die Standard -
option
imselect
element muss enthaltenvalue=""
oder dierequired
Regel fehl. Wenn, aus welchem Grund auch immer, können Sie nicht das ersteoption
'svalue
gleich""
, dann finden Sie diese Antwort ist benutzerdefinierte Methode Abhilfe und jsFiddle.HTML:
Seit Ihr
name
enthält Klammern,[]
, außerdem müssen Sie schließen Sie den Feldnamen in Anführungszeichen:jQuery:
Obigen Antwort davon ausgegangen, dass Sie wissen, die
name
desselect
element. Allerdings, wenn Sie nicht wissen, diename
Sie haben ein paar Optionen...1) Verwenden
class="required"
innerhalb derselect
element...Demo: http://jsfiddle.net/Gy24q/4/
2) Wenn die Regeln komplexer sind, können Sie hinzufügen compound
rules
auf Grundlage Ihrer vorhandenenclass
Aufgaben mit die- Regeln('add')
Methode.JQuery
.each()
wenn Sie mehr als eineselect
element muss diese Regel...Demo: http://jsfiddle.net/Gy24q/10/
Andernfalls wird nur die Regel anwenden nur eine
select
element mitclass
id_material
...EDIT:
Zitat OP in den Kommentaren:
gleiche wie:
Ja, das ist genau, warum es kaputt ist.
.validate()
nur aufgerufen wird einmal auf DOM-ready to initialisieren das plugin. Sie sollten nicht legte es in einensubmit
handler. Das Validate plugin hat schon seine eigene integrierte event-handler erfasst die form der submit-button.Ihre Setup-code wie pro meine arbeiten jsFiddle demos oben.
EDIT 2:
Zitat OP in den Kommentaren:
Validate plugin ignoriert ausgeblendete Elemente standardmäßig. Sie brauchen, um schalten Sie diese option ausschalten, indem Sie hinzufügen
ignore: []
zuvalidate()
:Sehen diese Antwort für weitere Informationen.
$('#formOrcamento').live('submit', function() {...});
Dann$(this).validate({...});
bezieht sich auf:$('#formOrcamento').validate ({...});
.validate()
aus Ihremlive.submit
handler. Es ist nicht notwendig, und der wahrscheinlichste Grund ist es gebrochen. Folgen Sie meiner demos vor und siehe meine edits.select
die folgenden:style='display: none'
. Wenn ich entfernen Sie via Firebug diedisplay: none
, dannselect
Validierung tritt auf, und zeigt dielabel
Fehler richtig. Was könnte passiert sein?ignore: []
zuvalidate()
. Siehe: jsfiddle.net/Gy24q/6select
ist, das validiert wird. Dann modifiziert, um, wie Sie sagten, nach.validate()
:$('select.id_material').rules('add', {required: true,});
Aber weiterhin nur eine vonselect
ist, das validiert wird..each()
wenn Sie mehr als eineselect.id_material
. Siehe demo: jsfiddle.net/Gy24q/10$('select.id_material').rules('add', {required: true,});
war nicht arbeiten, weil dieseselect
Hinzugefügt oder entfernt werden, wie der Benutzer interagiert und trifft Entscheidungen, die dann durch einesetInterval()
Problem gelöst. Ein anderes problem, das ist einfach, aber nicht mir, ich sah so schnell, dass diename
ausselect
wurden immer alsname=id_material[]
dann Hinzugefügt einen Zähleri++
dabei:name=id_material[i]
und alles funktioniert nun perfekt.Verwenden Sie einfach leere Klammern und stellen Sie sicher, dass der name einschließlich der Klammern in die Anführungszeichen (siehe Dokumentation):