TypeError:<array> .each不是函数</array>

时间:2014-01-16 14:29:08

标签: javascript jquery

我在页面上有三个对三个下拉列表的引用,并且每个都被更改,我想运行一个名为validateForm();的JavaScript函数

我的代码如下:

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()
        });
    });
});

但是这段代码给了我错误:

  

TypeError:formLevel2DDs.each不是函数

我使用的是jQuery 1.8.3版本(它是一个遗留系统)。

6 个答案:

答案 0 :(得分:15)

数组上没有each函数。

正如Anton在评论中指出的那样,你根本不需要each来做你正在做的事情;见下面的折叠。

但如果你想要each,你有三个选择:

  1. 将数组包装在jQuery实例中并使用jQuery的each$(formLevel2DDs).each(function(index, entry) { ... });

  2. 使用jQuery的$.each$.each(formLevel2DDs, function(index, entry) { ... });

    请注意,这与上述功能不同。

  3. 使用forEachMDN | Spec):formLevel2DDs.forEach(function(entry, index, array) { ... });

    请注意,forEach是ECMAScript5的新版本。所有现代浏览器都有它,但你需要一个垫片/ polyfill为旧的(如IE8)。另请注意,回调参数的顺序与上述任一选项不同。


  4. 但对安东来说,你可以更简单地做到这一点:

    在这种情况下,没有理由直接使用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);
    });
    

答案 1 :(得分:4)

如果你想使用.each(),你必须使用像这样的jQuery包装数组

$(formLevel2DDs).each(function() {

在这种情况下没有必要使用循环,只需在用jQuery包装的数组上使用.change()

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

答案 2 :(得分:2)

原生迭代器函数是forEach,而不是each

jQuery .each函数只接受一个参数,即回调。回调函数传递两个参数:列表中的索引和值。调用回调,使列表值也是this值。

使用forEach,参数以相反的顺序传递:值为第一个,后跟索引。本机函数还将整个数组作为第三个参数传递。在调用回调时,本机函数不会绑定this,除非在回调函数之后将第二个参数传递给.forEach 。如果存在这样的参数,则将其用作回调中this的值。

本机迭代器会跳过尚未设置的数组元素。 jQuery .each()不会跳过这些元素,而是始终从索引0迭代到length - 1

答案 3 :(得分:0)

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

答案 4 :(得分: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()
        });
    });
});

答案 5 :(得分:-3)

使用for ... in循环

for(key in formLevel2DDs) { ... }