Проверка того, что все значения в массиве одинаковы

#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, если какая-либо проверка завершается неудачей.