Javascript 删除keydown处理程序并将其添加到处理程序内部创建的新文本框中

Javascript 删除keydown处理程序并将其添加到处理程序内部创建的新文本框中,javascript,jquery,Javascript,Jquery,我刚刚开始尝试在我的应用程序中使用jQuery,由于我对它不太熟悉,我很快就被一个看似简单的问题打断了 我的视图有一个id为“line0”的文本框。这将被分配keydown处理程序。当我在文本框内按TAB键时,应发生以下情况: 添加id递增的新的相同文本框(例如第1行、第2行) 从第一个文本框中删除keydown处理程序 将keydown处理程序添加到新的文本框中 这使得处理程序仅在最后一个文本框中按下TAB时被激发,而当在任何先前的文本框中按下TAB时,它将只执行默认行为 添加文本框有效,

我刚刚开始尝试在我的应用程序中使用jQuery,由于我对它不太熟悉,我很快就被一个看似简单的问题打断了

我的视图有一个id为“line0”的文本框。这将被分配keydown处理程序。当我在文本框内按TAB键时,应发生以下情况:

  • 添加id递增的新的相同文本框(例如第1行、第2行)
  • 从第一个文本框中删除keydown处理程序
  • 将keydown处理程序添加到新的文本框中
这使得处理程序仅在最后一个文本框中按下TAB时被激发,而当在任何先前的文本框中按下TAB时,它将只执行默认行为

添加文本框有效,句柄被移除,焦点转移到我的新文本框。但当我在新文本框中按TAB键时,会出现以下错误:

Uncaught TypeError: undefined is not a function 
我认为这是因为我删除了一个匿名函数,然后试图将其添加到另一个元素中。如何将其移动到命名函数以便使用它

$(document).ready(function () {
    var lines = $("#lines");
    var count = 0;

    $("#line0").on("keydown", function (e) {
        if (e.which == 9) {
            e.preventDefault();

            var keydown = $("#line" + count).keydown;

            $("#line" + count).off("keydown");

            count++;

            $(lines).append('<input id="line' + count + '" type="text" />');
            $("#line" + count).focus();
            $("#line" + count).on("keydown", keydown)
        }
    })
});
$(文档).ready(函数(){
变量行=$(“#行”);
var计数=0;
$(“#line0”)。在(“键控键控”上,函数(e){
如果(e.which==9){
e、 预防默认值();
var keydown=$(“#行”+计数);
$(“#行”+计数)。关闭(“键控”);
计数++;
$(行)。附加(“”);
$(“#行”+计数).focus();
$(“#行”+计数)。打开(“向下键”,向下键)
}
})
});
编辑:
我忘了使用#,所以很明显jquery找不到我想要使用的元素。

在这里,您还错过了一些动态添加输入的id的指示器:

$(document).ready(function () {
    var lines = $("#lines");
    var count = 0;
    function keyDownFunc (e) {
            if (e.keyCode == 9) {
                e.preventDefault();

                $("#rule" + count).off("keydown");

                count++;

                $(lines).append('<input id="rule' + count + '" type="text" />');
                $("#rule" + count).focus();
                $(document).on('keydown','#rule'+count,keyDownFunc(e));
            }
        };
    $(document).on("keydown","#rule0", keyDownFunc(e));
});
$(文档).ready(函数(){
变量行=$(“#行”);
var计数=0;
函数keyDownFunc(e){
如果(e.keyCode==9){
e、 预防默认值();
$(“#规则”+计数).off(“向下键”);
计数++;
$(行)。附加(“”);
$(“#规则”+计数).focus();
$(文档).on('keydown','#rule'+count,keyDownFunc(e));
}
};
美元(文件)。关于(“键控”和“规则0”,键控功能(e));
});

我已经找到了解决方案,我只需在创建匿名函数时将其保存到变量中即可。我可以在以后的代码中用这个名字来称呼它

$(document).ready(function () {
    var lines = $("#lines");
    var count = 0;

    $("#line0").on("keydown", $handler = function (e) {
        if (e.which == 9) {
            e.preventDefault();

            $("#line" + count).off("keydown");

            count++;

            $(lines).append('<input id="line' + count + '" type="text" />');
            $("#line" + count).focus();
            $("#line" + count).on("keydown", $handler)
        }
    })
});
$(文档).ready(函数(){
变量行=$(“#行”);
var计数=0;
$(“#line0”)。在(“keydown”上,$handler=function(e){
如果(e.which==9){
e、 预防默认值();
$(“#行”+计数)。关闭(“键控”);
计数++;
$(行)。附加(“”);
$(“#行”+计数).focus();
$(“#line”+count).on(“keydown”,$handler)
}
})
});

不幸的是,这不适合我。它抛出一个表示未定义e的错误。