错误"未捕获的TypeError:无法执行' animate' on'元素':有效的arities是:[1],但提供了4个参数。"在动态输入字段上

时间:2015-02-18 21:54:22

标签: javascript jquery

我正在尝试使用带有以下代码的jquery动态创建表单

function createFieldSet(dataArray) {
    var fieldset = $('fieldset');

    $.each(dataArray, function(key, value) {
        for(var key in value) {
            if (key.toLowerCase() === "other") {
                fieldset.append($('<button/>').attr({ type: 'button', name:'btn_' + key, value: key}).on('click', 'textOther', function() {alert('click');}).html(value[key]));
                fieldset.append($('<input/>').attr({ type: 'text', name:'textOther', value: ""}).hide);
            } else {
                fieldset.append($('<button/>').attr({ type: 'button', name:'btn_' + key, value: key}).html(value[key]));
            }

            fieldset.append('<br />');
        }
    });     
}

但返回标题中显示的错误,指向附加输入行的第二行,我试图在创建时隐藏它,除非单击上面创建的按钮。想知道为什么当我没有调用这样的函数时,我会得到一些关于动画的东西,如果这是可修复/可行的......或者如果这应该是用服务器端语言完成的。

2 个答案:

答案 0 :(得分:2)

问题是hide上缺少括号,此处为

fieldset.append(
    $('<input/>').attr({ 
        type: 'text', 
        name:'textOther', 
        value: ""
    }).hide
);

应该是

fieldset.append(
    $('<input/>').attr({ 
        type: 'text', 
        name:'textOther', 
        value: ""
    }).hide()
);

但这是一个时髦的语法,你应该写它

fieldset.append(
    $('<input />', { 
        type  : 'text', 
        name  : 'textOther', 
        value : ""
        css   : {
            display : 'none'
        }
    })
);

它发生的原因是因为jQuery具有以下内部函数

jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
    var cssFn = jQuery.fn[ name ];
    jQuery.fn[ name ] = function( speed, easing, callback ) {
        return speed == null || typeof speed === "boolean" ?
            cssFn.apply( this, arguments ) :
            this.animate( genFx( name, true ), speed, easing, callback );
    };
});

其中jQuery实际上正在寻找属性hide,并且它会以某种方式从对象中添加.hide来获取它,我不会再查找源代码以确定它为什么会发生,因为这只是你的一个错字,而不是那么有趣。

答案 1 :(得分:1)

问题是您使用了

fieldset.append(
    $('<input/>').hide
);

但它应该是

fieldset.append(
    $('<input/>').hide()
);

第二个代码运行函数hide并返回元素,因此您可以追加它。