Jquery проверка нескольких вкладок, проверка по одному за раз?
Я новичок в jQuery, и я пытаюсь использовать его и плагин проверки (http://docs.jquery.com/Plugins/Validation) для создания многочастной формы с несколькими вкладками для разных разделов. Сейчас у меня есть место, где есть несколько вкладок, а кнопка "Далее" переключается на следующую вкладку.
Проблема, с которой я столкнулась, заключается в том, что когда я наконец отправляюсь на последнюю страницу, форма проверяется правильно, но если на другой странице есть ошибки, пользователь не уведомляется, и проверка действительно происходит только после того, как "отправить" щелкнул.
Как я могу проверить каждый отдельно, когда я нажимаю "Далее"? Я действительно не хочу создавать несколько форм или отслеживать скрытые поля: S Любые предложения?
Спасибо!
<script type="text/javascript">
$(document).ready(function() {
//....stuff
//tabs
var tabs = $("#tabs").tabs();
$(".nexttab").click(function() {
//var selected = $("#tabs").tabs("option", "selected");
//$("#tabs").tabs("option", "selected", selected + 1);
$("#tabs").tabs("select", this.hash);
});
//use link to submit form instead of button
$("a[id=submit]").click( function(){
$(this).parents("form").submit();
});
//form validation
var validator = $("#myForm").validate();
});
</script>
<form class="cmxform" id="myForm" method="post" action="">
<div id="tabs">
<ul>
<li><a href="#general">General</a></li>
<li><a href="#tab2"></a></li>
</ul>
<div id="general">
....stuff...
<p>
<a class="nexttab navbutton" href="#tab2"><span>Next</span></a>
</p>
</div>
<div id="tab2">
<h2>Tab2</h2>
<p>
<a class="nexttab navbutton" href="#general"><span>Prev</span></a>
<a class="submit navbutton" id="submit" href="#"><span>Submit</span></a>
</p>
</div>
</div>
</form>
Edit:
@Андрей:
Я сделал несколько комбинаций вашего второго примера и отключил вкладки. Кажется, что работа, кроме обновления страницы, повторно отключает вкладки.
var tabs = $("#tabs").tabs({
disabled: [1,2,3,4,5],
select: function(event, ui) {
var valid = true;
var current = $(this).tabs("option", "selected");
var panelId = $("#tabs ul a").eq(current).attr("href");
if(ui.index > current)
{
$(panelId).find("input").each(function() {
//console.log(valid);
if (!validator.element(this) && valid) {
valid = false;
}
});
}
return valid;
}
});
В сочетании с:
$(".nexttab").click(function() {
var selected = $("#tabs").tabs("option", "selected");
$("#tabs").tabs("enable", selected+1);
$("#tabs").tabs("option", "selected", selected + 1);
});
Ответы
Ответ 1
Это возможно с помощью .element(selector)
функции validator
. То, что вы собираетесь делать, это перебрать каждый элемент на активной вкладке и вызвать эту функцию на входе. Это приведет к проверке на каждом элементе по очереди, показывая сообщение проверки.
$(".nexttab").click(function() {
var valid = true;
var i = 0;
var $inputs = $(this).closest("div").find("input");
$inputs.each(function() {
if (!validator.element(this) && valid) {
valid = false;
}
});
if (valid) {
$("#tabs").tabs("select", this.hash);
}
});
Кроме того, вы, вероятно, захотите запустить аналогичный код, когда пользователь нажимает вкладку, чтобы перейти к новому набору входов, вместо нажатия "next".
Вот рабочий пример: http://jsfiddle.net/c2y6r/
Обновление:. Здесь вы можете сделать другой способ, отменив событие select
на недопустимые элементы формы:
var validator = $("#myForm").validate();
var tabs = $("#tabs").tabs({
select: function(event, ui) {
var valid = true;
var current = $(this).tabs("option", "selected");
var panelId = $("#tabs ul a").eq(current).attr("href");
$(panelId).find("input").each(function() {
console.log(valid);
if (!validator.element(this) && valid) {
valid = false;
}
});
return valid;
}
});
Однако теперь вам нужно подумать о том, чтобы позволить пользователю вернуться, когда они ввели неверные данные на текущую страницу. С другой стороны, вы получаете бонус за сохранение всего кода проверки внутри одной функции, которая запускается, если человек нажимает на вкладку или следующую ссылку.
Пример: http://jsfiddle.net/c2y6r/1/
Обновить 2, если вы хотите разрешить людям перемещаться назад через интерфейс вкладки:
var tabs = $("#tabs").tabs({
select: function(event, ui) {
var valid = true;
var current = $(this).tabs("option", "selected");
var panelId = $("#tabs ul a").eq(current).attr("href");
if (ui.index > current) {
$(panelId).find("input").each(function() {
console.log(valid);
if (!validator.element(this) && valid) {
valid = false;
}
});
}
return valid;
}
});
Ответ 2
Существующий код не работал у меня (возможно, он устарел), поэтому я придумал следующее. Этот пример предполагает использование вкладок jquery и проверки подлинности jquery.
$('#tabs').tabs(
{
beforeActivate: function( event, ui )
{
var valid = $("#myForm").valid();
if (!valid) {
validator.focusInvalid();
return false;
}
else
return true;
}
});