Ошибка типа: <Array> .each не является функцией

javascript jquery

17222 просмотра

6 ответа

У меня есть три ссылки на три раскрывающихся списка на моей странице, и, так как каждый из них изменяется, я хочу запустить функцию JavaScript под названием validateForm();

Мой код ниже:

jQuery(document).ready(function() {

    var drpSupplier         = document.getElementById('supplier');
    var drpChargeRate       = document.getElementById('formElementChargeRate');
    var drpIDSEmail         = document.getElementById('formElementEmailIDS');
    var formLevel2DDs       = new Array();

    formLevel2DDs.push(drpSupplier);
    formLevel2DDs.push(drpChargeRate);
    formLevel2DDs.push(drpIDSEmail);

    formLevel2DDs.each(function() {
        $(this).change(function() {
            validateForm()
        });
    });
});

Но этот код дает мне ошибку:

Ошибка типа: formLevel2DDs.each не является функцией

Я использую jQuery версии 1.8.3 (это устаревшая система).

Автор: J86 Источник Размещён: 12.11.2019 09:25

Ответы (6)


15 плюса

Решение

Там нет eachфункции на массивах.

Как отмечает Антон в комментариях, вам совершенно не нужно eachто, что вы делаете; см. ниже сгиба.

Но если вы хотите each, у вас есть три варианта:

  1. Оберните ваш массив в экземпляр jQuery и используйте jQuery's each:$(formLevel2DDs).each(function(index, entry) { ... });

  2. Используйте jQuery's $.each:$.each(formLevel2DDs, function(index, entry) { ... });

    Обратите внимание, что это не та же функция, что и выше.

  3. Используйте forEach( MDN | Spec ):formLevel2DDs.forEach(function(entry, index, array) { ... });

    Обратите внимание, что forEachэто новая версия ECMAScript5. Все современные браузеры имеют его, но для более старых (например, IE8) вам понадобится shim / polyfill. Также обратите внимание, что порядок аргументов для обратного вызова отличается от любого из параметров выше.


Но, с точки зрения Антона, вы можете сделать это намного проще:

В getElementByIdэтом случае нет никаких оснований для непосредственного использования , это не в замкнутом цикле или чем-то еще, поэтому:

jQuery(document).ready(function() {

    $("#supplier, #formElementChargeRate, #formElementEmailIDS").change(validateForm);

});

Обратите внимание, что я также удалил функцию-обертку со всех сторон validateForm. Возможно, вам придется добавить его обратно, если оно validateFormимеет возвращаемое значение, и вы не хотите, чтобы это возвращаемое значение использовалось jQuery (в частности: если оно вернулось false, jQuery остановит распространение и предотвратит действие по умолчанию для changeсобытия).

Если вы действительно хотите иметь прямой доступ к элементам DOM, используя эти переменные:

jQuery(document).ready(function() {

    var drpSupplier, drpChargeRate, drpIDSEmail;
    var formLevel2DDs       = [
        drpSupplier         = document.getElementById('supplier'),
        drpChargeRate       = document.getElementById('formElementChargeRate'),
        drpIDSEmail         = document.getElementById('formElementEmailIDS')
    ];

    $(formLevel2DDs).change(validateForm);
});
Автор: T.J. Crowder Размещён: 16.01.2014 02:32

4 плюса

Если вы хотите использовать, .each()вы должны обернуть массив с помощью jQuery, как это

$(formLevel2DDs).each(function() {

В этом случае нет необходимости использовать цикл, просто используйте .change()массив, завернутый в jQuery

$(formLevel2DDs).change(function(){
       validateForm()
});
Автор: Anton Размещён: 16.01.2014 02:30

2 плюса

Родная функция итератора forEach, нет each.

Функция jQuery .eachпринимает только один аргумент, который является обратным вызовом. В функцию обратного вызова передаются два параметра: индекс в список и значение. Обратный вызов вызывается так, что значение списка также является thisзначением.

При forEachэтом параметры передаются в обратном порядке: сначала значение, а затем индекс. Нативная функция также передает весь массив в качестве третьего параметра. Нативная функция не связывается thisпри вызове обратного вызова, если .forEach после функции обратного вызова не передан второй параметр . Если есть такой параметр, он используется в качестве значения thisв обратном вызове.

Собственный итератор пропускает элементы массива, которые не были установлены. JQuery .each()не пропускает такие элементы, вместо этого всегда повторяется от индекса 0 до length - 1.

Автор: Pointy Размещён: 16.01.2014 02:31

0 плюса

пытаться

$(formLevel2DDs).each(function() {
    $(this).change(function() {
        validateForm()
    });
});
Автор: andy mccullough Размещён: 16.01.2014 02:30

0 плюса

добавил одну строку

jQuery(document).ready(function() {

    var drpSupplier         = document.getElementById('supplier');
    var drpChargeRate       = document.getElementById('formElementChargeRate');
    var drpIDSEmail         = document.getElementById('formElementEmailIDS');
    var formLevel2DDs       = new Array();

    formLevel2DDs.push(drpSupplier);
    formLevel2DDs.push(drpChargeRate);
    formLevel2DDs.push(drpIDSEmail);

    formLevel2DDs = jQuery(formLevel2DDs);//this line
    formLevel2DDs.each(function() {
        $(this).change(function() {
            validateForm()
        });
    });
});
Автор: Vlad Nikitin Размещён: 16.01.2014 02:33

-3 плюса

использовать для ... в цикле

for(key in formLevel2DDs) { ... }
Автор: mike Размещён: 16.01.2014 02:35
Вопросы из категории :
32x32