#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть веб-страница, на которой есть текстовое поле.
Когда пользователь вводит в него информацию, он выполняет вызов AJAX, чтобы проверить, действительна ли запись, если нет, это отключает кнопку.
Они также могут добавлять до 10 текстовых полей, что делается с помощью шаблонов jQuery. На данный момент каждое текстовое поле имеет класс serial, и когда текстовое поле serial размыто, выполняется эта проверка.
Если они введут недопустимый серийный номер, это отключит кнопку, но если они добавят новое текстовое поле, и это допустимо, кнопка теперь включена, что неверно, поскольку одно все еще недействительно.
Единственный способ, который я могу придумать, чтобы сделать это, — добавить 1 или 0 в массив для каждого текстового поля и, как только все элементы в массиве равны 1, затем включить кнопку. Это хороший подход, если нет, пожалуйста, объясните, какой лучше. Если это хороший подход, как мне проверить, что все значения в массиве javascript одинаковы?
Спасибо
Комментарии:
1. Можете ли вы пояснить, что вы подразумеваете под «когда последовательное текстовое поле размыто «?
2. @Charles Когда событие размытия запускается в этом текстовом поле…
3. да, сделайте это, я думаю, было бы правильно установить 0 1 для проверки состояния каждого текстового поля, и вам нужно зациклить массив javascript, чтобы выяснить, какое из них равно 0 или 1
Ответ №1:
Это звучит как хороший подход. Вы можете проверить наличие одинаковых элементов в массиве javascript, используя эту простую функцию javascript. Вы можете вставить это в консоль firebug, чтобы проверить его функциональность.
// check if all elements of my_array are equal, my_array needs to be an array
function check_for_equal_array_elements(my_array){
if (my_array.length == 1 || my_array.length == 0) {
return true;
}
for (i=0;i<my_array.length;i ){
if (i > 0 amp;amp; my_array[i] != my_array[i-1]) {
return false;
}
}
return true;
}
//Example:
var my_array = [];
my_array.push(5);
my_array.push(5);
// will alert "true"
alert("all elements equal? " check_for_equal_array_elements(my_array));
my_array.push(6);
// will alert "false"
alert("all elements equal? " check_for_equal_array_elements(my_array));
Ответ №2:
Я предположу, что у вас есть isValid(str)
функция, которая возвращает логическое значение.
Поскольку вы используете jQuery, вы можете воспользоваться filter()
функцией jQuery, чтобы легко проверить, являются ли какие-либо входные данные недопустимыми всякий раз, когда ввод размывается:
$('.serial').live('blur', function () {
// Get an array of all invalid inputs
var invalids = $('.serial').filter(function () {
return !isValid($(this).val());
});
// Does the array contain anything?
$('#button').prop('disabled', invalids.length);
});
Демонстрация: http://jsfiddle.net/3RNV6 /
Аналогичная концепция, но для использования с AJAX:
$('.serial').live('blur', function () {
var me = this;
$.ajax({
// ajax config
success: function (data) {
if (data === 'Y') $(me).addClass('valid');
// Get an array of all invalid inputs
var invalids = $('.serial').filter(function () {
return !$(this).hasClass('valid');
});
// Enable if none invalid
if (invalids.length === 0) $('#button').prop('disabled', false);
}
});
});
$('.serial').live('keypress', function () {
$('#button').prop('disabled', true);
$(this).removeClass('valid');
});
Комментарии:
1. Проблема в том, что я не проверяю значение текстового поля на стороне клиента, я знаю только, действительно ли оно, по ответу на мой AJAX-запрос, поэтому все, что у меня есть, это Y или N
2. @Джон, извини, я пропустил требование AJAX. В этом случае вы должны отключить кнопку на
change
иremoveClass('valid')
. ТакжеaddClass('valid')
на входные данные при возврате запроса AJAX. Как только вы это сделаете, просто верните$(this).hasClass('valid')
из функции filter.3. Как мне получить ссылку на текстовое поле, в котором был выполнен вызов AJAX в методе success для выполнения addClass(«valid»)?
4. Спасибо, вы изменили его на нажатие клавиши, а не на изменение. Любая причина. Я также должен использовать attr вместо prop. По какой-то причине последний jquery прерывает работу моей страницы.
5. @Джон, оба
change
иkeypress
будут работать — это просто зависит от того, насколько отзывчивым вы хотите, чтобы отключение было.keypress
приведет к отключению кнопки, как только вводится символ, в то время какchange
будет ждать, пока текстовое поле не потеряет фокус.attr
работает просто отлично, даже в последней версии.
Ответ №3:
Прежде всего, если вы динамически создаете n текстовых полей, вы должны использовать методы live() или delegate() jQuery для информирования о новых добавленных элементах DOM.
Во-вторых, ваш подход просто прекрасен, но вместо массива вы можете задать параметры входных данных с неправильным текстом, а затем отключить кнопку, если есть какие-либо элементы с неправильным текстом. Я думаю, это будет быстрее, чем цикл, хотя все текстовые поля повсюду.
Ответ №4:
Я бы использовал проверку для достижения этого.
http://docs.jquery.com/Plugins/Validation#Demos
Если вы можете отлично проверить на стороне клиента — либо используйте одну из существующих функций проверки jQuery, показанных по ссылке выше, либо напишите свою собственную.
Если вам необходимо проверить серверную часть с помощью ajax, то вы могли бы встроить это в пользовательскую процедуру проверки.
Затем в вызове, который показывает / скрывает кнопку, выполните вызов $(‘#formid).validate() — возвращает false, если какая-либо проверка завершается неудачей.