1

我只是想用这个函数模拟实时打字:

$('#expenseAccordion').on('keypress', '.netAmount input', function() {
    setTimeout(function() {
        $(this).closest('.accordion-group').find('.amount input').val($(this).val());
    }, 0);
});

这不起作用并产生这个奇怪的错误:

未捕获的类型错误:无法调用未定义的方法“toLowerCase”

有问题的 jQuery 行(l 4245):

hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];

如果我从函数中删除所有 $(this) 并尝试这样的事情:

$('#expenseAccordion').on('keypress', '.netAmount input', function() {
setTimeout(function() {
    $('.amount input').val(4);
}, 0);

});

它有效,但我真的需要获取事件发生的当前元素,因为我有多个输入。

4

3 回答 3

10

thissettimeout里面不指向expenseAccordion元素,可以使用$.proxy()自定义的执行上下文传递给回调函数

setTimeout($.proxy(function() {
    $(this).closest('.accordion-group').find('.amount input').val($(this).val());
}, this), 0);
于 2013-08-21T09:13:34.630 回答
3

另一种常见的方法是创建一个局部变量来保存它。

$('#expenseAccordion').on('keypress', '.netAmount input', function() {
    var $this = $(this);
    setTimeout(function() {
       $this.closest('.accordion-group').find('.amount input').val($this.val());
    }, 0);
 });
于 2013-08-21T09:16:46.227 回答
0

第一个this指向您的超时,因此您所做的任何选择都将为空。

这是我的做法:

$('#expenseAccordion').on('keypress', '.netAmount input', function() {
    var self = this;
    setTimeout(function() {
        $(self ).closest('.accordion-group').find('.amount input').val($(self).val());
    }, 0);
});
于 2013-08-21T09:17:24.263 回答