Javascript addEventListener在函数内部不工作

Javascript addEventListener在函数内部不工作,javascript,dom,addeventlistener,Javascript,Dom,Addeventlistener,我正在尝试根据这些设置生成表单 let formItems = new Form("form-items", { items: [ { id: "companyName" }, { id: "documentKey" }, { id: "documentDate" } ], }); 在内部,我生成每个输入,并尝试添加一个eventListener,但它不起作用。我做错了什么 modu

我正在尝试根据这些设置生成表单

let formItems = new Form("form-items", {
        items: [
            { id: "companyName" },
            { id: "documentKey" },
            { id: "documentDate" }
        ],
    });
在内部,我生成每个输入,并尝试添加一个
eventListener
,但它不起作用。我做错了什么

module.exports = function Form(formElementId, options) {

    this.state = {}

    options.items.map(item => {
        renderInput(item.id);
        this.state[item.id] = ""
    })

    function renderInput(id) {

        let html = `<input id="${id}" />`

        document.getElementById(formElementId).innerHTML += html;

        document.getElementById(id).addEventListener("input", (e) => {
            console.log(e);                      // <--------- Doesn't work
            this.state[id] = e.target.value;     // <--------- Doesn't work
            console.log(this.state);             // <--------- Doesn't work
        })
    }
}
module.exports=函数形式(formElementId,选项){
this.state={}
options.items.map(item=>{
renderInput(项目id);
this.state[item.id]=“”
})
函数renderInput(id){
让html=``
document.getElementById(formElementId).innerHTML+=html;
document.getElementById(id).addEventListener(“输入”,(e)=>{

console.log(e);//您可以动态创建一个HTML输入元素并将事件附加到它,而不是使用刚刚附加到容器的
+=
将HTML添加到

我将使用以下代码段:

module.exports = function Form(formElementId, options) {
  this.state = {};
  self = this;
  options.items.map(item => {
    renderInput(item.id);
    this.state[item.id] = "";
  });

  function renderInput(id) {
    let input = document.createElement("input");
    input.setAttribute("id", id);

    document.getElementById(formElementId).append(input);

    input.addEventListener("input", e => {
      self.state[id] = e.target.value;
    });
  }
};

您可以动态创建一个HTML输入元素并将事件附加到该元素,而不是使用添加到容器的
+=
将HTML添加到模板文本中

我将使用以下代码段:

module.exports = function Form(formElementId, options) {
  this.state = {};
  self = this;
  options.items.map(item => {
    renderInput(item.id);
    this.state[item.id] = "";
  });

  function renderInput(id) {
    let input = document.createElement("input");
    input.setAttribute("id", id);

    document.getElementById(formElementId).append(input);

    input.addEventListener("input", e => {
      self.state[id] = e.target.value;
    });
  }
};

检查
console
document.getElementById(id)。长度
检查
console
document.getElementById(id).length
为什么与模板文本比较有效?另外,
此.state
未定义?如何绑定它?我是否使用
让self=this
然后使用
self.state
?为什么与模板文本比较有效:这是因为JavaScript和HTML引擎尚未添加和识别div,因此变量approachh是包含HTML DOM元素的本机方法,而且,this.state是未定义的:很抱歉没有定义,但是是的,因为默认情况下箭头函数不绑定到
this
,您可以像您所说的那样使用普通函数或使用
self
变量。感谢您的解释。您可以编辑您的解决方案以包含
this吗修复,没有箭头函数?看起来如何?我更新了这个,以便使用箭头函数进行快速修复,稍后将检查其他选项。为什么这对模板文本有效?而且,
这个.state
未定义?我如何绑定它?我是否使用
让self=this
然后使用
self.state
?为什么这对templa有效te literals:这是由于尚未添加div并被JavaScript和HTML引擎识别,因此变量方法是使用HTML DOM元素的本机方法,而且,this.state是未定义的:很抱歉没有定义,但是是的,因为默认情况下,箭头函数不绑定到
this
,您可以使用普通函数或e> 如您所述的self
变量。感谢您的解释。您可以编辑您的解决方案,使其包含
修复程序,而不包含箭头功能吗?外观如何?我更新了此解决方案以获得带箭头功能的快速修复程序,稍后将检查其他选项。