1

この関数でライブタイピングをシミュレートしようとしています:

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

これは機能せず、次の奇妙なバグが発生します。

Uncaught TypeError: 未定義のメソッド '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

this内部 settimeout は要素を指していないため、カスタム実行コンテキストをコールバック関数に渡すために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ポイントはタイムアウトであるため、選択した内容はすべて null になります。

これが私がそれを行う方法です:

$('#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 に答える