setTimeout()和$(this)会产生一个奇怪的bug

gae*_*anm 1 jquery

我只想用这个函数模拟实时输入:

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

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

未捕获的TypeError:无法调用未定义的方法'toLowerCase'

存在问题的jQuery行(l 4245):

hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
Run Code Online (Sandbox Code Playgroud)

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

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

});

它可以工作,但我真的需要获取事件发生的当前元素,因为我有多个输入.

Aru*_*hny 10

this在settimeout内部没有指向该expenseAccordion元素,您可以使用$.proxy()将自定义执行上下文传递给回调函数

setTimeout($.proxy(function() {
    $(this).closest('.accordion-group').find('.amount input').val($(this).val());
}, this), 0);
Run Code Online (Sandbox Code Playgroud)

  • @gaetanm:因为`setTimeout`调用函数就像`callback()`,在这种情况下`this`指的是全局对象.这在[MDN文档](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)中有说明. (2认同)