Проверка jquery против динамических полей
Я использую плагин проверки jQuery и хочу проверить многие динамически добавленные текстовые поля, чтобы их суммирование проверялось на отдельное полное поле.
В прошлом я написал свои собственные методы проверки, но только простые, которые используют основную структуру регулярных выражений, которую легко воспроизвести из файла дополнительных методов .js.
В частности, сайт jQuery дает простой пример использования функции addMethod(), чтобы сделать что-то очень похожее:
jQuery.validator.addMethod("math", function(value, element, params) {
return this.optional(element) || value == params[0] + params[1];
}, jQuery.format("Please enter the correct value for {0} + {1}"));
Реализация параметра params более или менее плохо документирована. Я смог найти, как передать содержимое в params в qaru.site/info/212972/.... Однако массив, переданный в params в этом примере, является статическим. Массив, который мне нужно передать в params, растет и сжимается на основе динамически добавленных строк, добавленных в "runtime"...
Я загрузил полностью отключенную версию на jsfiddle для вашего просмотра.
Обратите внимание, что в коде есть встроенные комментарии, в которых у меня есть вопросы, а также я удалил функциональность Remove, поскольку он только добавляет беспорядок и не помогает проиллюстрировать эту точку.
Итак, как я могу использовать библиотеку проверки jQuery, чтобы гарантировать добавление динамически добавленных полей к определенной сумме? Заранее благодарю вас!
Ответы
Ответ 1
Вот моя версия вашего валидатора.
http://jsfiddle.net/linkabi9/shBxv/
Вы заметите, что вместо статических чисел для параметров я передаю селектор. Один элемент массива является селектором полей вклада. Я дал каждому существующему и новому вкладу вклад в класс, "setamount1", вы можете использовать любой класс, который вы хотите. Поле, в которое вы установите этот валидатор, будет полем "Общая сумма".
Я также добавил живое "изменение" в поля вклада. Это приведет к проверке при каждом изменении. Я должен предупредить вас, это проверяет всю форму, а не только депозит и полные поля.
Теперь вы можете повторно использовать этот тип валидатора несколько раз в той же форме/странице!
Я пошел дальше и поставлю код валидатора ниже. Кроме того, пример инициализации валидатора.
jQuery.validator.addMethod("depositsSum", function(value, element, params)
{
var amnts = 0;
$(params[0]).each(function() {
amnts += parseFloat($(this).val());
});
return this.optional(element) || amnts == parseFloat(value);
}, jQuery.format("Individual deposits must add up to the total!"));
$("#depositForm").validate({
rules: {
fullAmount: {
depositsSum: [".amountset1"]
}
}
});
Ответ 2
Итак, сначала вам нужно вычислить общее количество всех динамических полей. Один из способов сделать это - пометить все такие поля классом. Скажем, мы называем их "суммой". Затем вы можете рассчитать их сумму с помощью этого
var total = 0;
$('#depositForm input.amount').each(function() {
total += Number($(this).val());
});
Теперь вам нужно передать это общее значение методу проверки. Поскольку у javascript есть замыкания, вы можете сделать следующее
$("#depositForm").validate({
rules: {
fullAmount: {
depositsSum: function() {
var total = 0;
$('input.amount').each(function() {
total += Number($(this).val());
});
return total;
}
}
}
});
Эта функция будет выполняться каждый раз, и ее результатом будет ваше значение параметра. Таким образом, функция проверки будет в конечном итоге
function(value, element, total) {
return this.optional(element) || value == total;
}
Для второй части вопроса, выполняющего проверку для динамических полей, существует два подхода. Либо введите класс маркировки проверки, либо используйте методы rule("add", )
и rule("remove", )
для ввода/удаления динамического поля.
Вот пример классового подхода:
Пусть все проверенные поля (динамические и итоговые) имеют класс "checkSum". Тогда:
$.validator.addClassRules("checkSum", {
depositsSum: function() {
var total = 0;
$('input.amount').each(function() {
total += Number($(this).val());
});
return total;
}
});
$("#depositForm").validate();
Здесь JSFiddle всего.
Конечно, вы заметите, что это не работает, как вы могли подумать. Для вашего приложения вид проверки, который вы ищете, - это полная проверка формы, вызванная изменением поля, а не проверка поля. Поиграйте с ним немного и посмотрите, о чем я говорю.
Ответ 3
Попробуйте использовать это в ur файле html-кода...
<input id="check" name="check" type="text" class="required math">
Как только u динамически создаст тег ввода, как указано выше, он будет проверен по методу ur add. Попробуйте.
Ответ 4
Это включает в себя добавление и удаление строк с текущей ценой обновления. [скачать]
<html>
<head>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">google.load("jquery", "1");</script>
<script type="text/javascript">
$(document).ready(
function()
{
$('.add-row').click(
function()
{
addRow();
return false;
}
);
addRow();
}
);
function addRow()
{
var newRow = '<li class="deposit"><input class="price"> <a href="#" class="remove">Remove</a></li>';
$('.deposits').append(newRow);
$('.deposit:last .price').select();
setListeners();
}
function removeRow(val)
{
$(val).parents('.deposit').remove();
sumDeposits();
}
function setListeners()
{
$('.price').each(
function()
{
$(this).keyup(
function()
{
sumDeposits();
}
);
}
);
$('.remove').each(
function()
{
$(this).click(
function()
{
removeRow(this);
}
);
}
);
}
function sumDeposits()
{
var total = 0;
$('.price').each(
function()
{
total += Number( $(this).val() );
}
);
$('.total').html(total);
}
</script>
</head>
<body>
<h3>Total is <span class="total">N/A</span></h3>
<p><a href="#" class="add-row">Add</a></p>
<ul class="deposits"></ul>
</body>
</html>