Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在addEventListener中闭包是如何工作的?_Javascript - Fatal编程技术网

Javascript 在addEventListener中闭包是如何工作的?

Javascript 在addEventListener中闭包是如何工作的?,javascript,Javascript,我得到了这个密码: 函数getElementByName(名称){ 返回文档。查询选择器(名称); } 功能移除按钮(parentToClick){ parentToClick.addEventListener('click',e=>{ 让buttonToClick=e.target; const removeButton=getElementByName(`.remove`); removeButton.addEventListener('click',e=>{ console.log(如t

我得到了这个密码:

函数getElementByName(名称){ 返回文档。查询选择器(名称); } 功能移除按钮(parentToClick){ parentToClick.addEventListener('click',e=>{ 让buttonToClick=e.target; const removeButton=getElementByName(`.remove`); removeButton.addEventListener('click',e=>{ console.log(如target); 移除(按钮点击); }); }); } 功能删除(按钮单击){ 返回按钮单击。删除(); } 移除按钮(getElementByName(`menu`))

拯救
负载
搜寻
删除
,然后会发生什么情况:

  • 你点击一个搜索。它绑定要删除的事件侦听器
  • 单击remove,它将从1中的事件侦听器中删除搜索
  • 你点击保存。它绑定要删除的事件侦听器
  • 单击remove,它调用事件侦听器1,并从3调用事件侦听器
  • 您假设click事件仅绑定到该元素。事实上,您多次绑定了单击,但它不知道应该只触发它

    你能做什么?在绑定其他事件之前删除该事件。或者更好,存储单击的内容,而不绑定多个事件

    功能移除按钮(parentToClick){
    让buttonToClick=null;
    parentToClick.addEventListener('click',e=>{
    buttonToClick=e.target.closest('按钮[数据操作]);
    });
    const removeButton=document.querySelector('.remove');
    removeButton.addEventListener('click',e=>{
    如果(按钮点击)删除(按钮点击);
    buttonToClick=null;
    });
    }
    功能删除(按钮单击){
    返回按钮单击。删除();
    }
    移除按钮(document.querySelector(“#菜单”)
    
    
    拯救
    负载
    搜寻
    
    删除
    您是否意识到正在将多个事件绑定到删除按钮。因此,每次单击,您都会绑定一个新的事件侦听器,它们不会替换旧的事件侦听器。。。您已经准确地解释了代码中发生了什么,闭包是如何工作的,问题是什么..?好的,我是否必须移出菜单一的remove listener?是的,并将以前单击的菜单按钮存储到变量中。然后检查存储的元素是否存在,如果存在,请将其删除。