将事件侦听器添加到使用javascript

时间:2017-09-04 06:32:52

标签: javascript for-loop addeventlistener removechild dom-manipulation

我很擅长在JS中操作DOM中的元素,因此我创建了一个简单的待办事项列表,以便更加舒适,我可以使用输入添加项目,并通过单击列表项来删除项目。 虽然这可能不是最佳实践和限制,但我只是想使用创建和删除元素而不是使用对象或类,直到我变得更熟悉,也使用普通/香草js所以请在回答时记住这一点。

我正在尝试添加点击事件,在点击<li>时删除<li>

我的逻辑是...... 加载页面后,我无法在所有<li>上运行for循环,并添加事件处理程序,因为所有<li>尚不存在。 所以我尝试的解决方案是在触发addTaskButton事件时,我们获取事件发生时页面上的所有<li>,我们遍历所有这些事件并向<li>添加eventlistener点击后等待删除的内容。

这似乎不起作用,可能过于复杂。

有人可以非常简单地向我解释一下,为什么这不起作用或者更好的方法是什么?

提前谢谢

HTML

<ul id="taskList">
    <li>example</li>

</ul>
<input type="text" id="addTaskInput">
<button id="addTaskButton">Add Task</button>

的JavaScript

const taskList = document.querySelector("#taskList");
const addTaskInput = document.querySelector("#addTaskInput");
const addTaskButton = document.querySelector("#addTaskButton");
let taskItem = document.querySelectorAll("li");


addTaskButton.addEventListener("click", () => {
    let taskItem = document.createElement("li");
    taskItem.textContent = addTaskInput.value;
    for (let i = 0; i < taskItem.length; i++) {     
        taskItem[i].addEventListener("click", () => {
            let taskItem = document.querySelectorAll("li");
            taskList.removeChild(taskItem[i]);      
        });
    }
    taskList.appendChild(taskItem);
    addTaskInput.value = " ";
});

3 个答案:

答案 0 :(得分:4)

这是我为你的需求创建的代码,这个实现jilla $(document).on机制在vanilla javascript中,现在你在文档里面创建一个li,点击它就会被删除。

<强>释

它的作用是点击它检查点击了哪个元素的文件(e.target是点击的元素,e是文档上的点击事件),然后检查点击的项目是否是li标签(e。如果项目被点击,target.tagName会告诉我们标签名称,所以如果是li,只需删除它;

	const taskList = document.querySelector("#taskList");
	const addTaskInput = document.querySelector("#addTaskInput");
	const addTaskButton = document.querySelector("#addTaskButton");


	addTaskButton.addEventListener("click", () => {
	    let taskItem = document.createElement("li");
	    taskItem.textContent = addTaskInput.value;
	    taskList.appendChild(taskItem);
	    addTaskInput.value = " ";
	});

	document.onclick = function(e)
	{
	  if(e.target.tagName == 'LI'){
	     e.target.remove();
	   }
	}
<ul id="taskList">
    <li>example</li>

</ul>
<input type="text" id="addTaskInput">
<button id="addTaskButton">Add Task</button>

答案 1 :(得分:0)

像这样更新你的for循环:

for (let i = 0; i < taskItems.length; i++) {     
    taskItems[i].addEventListener("click", () => 
        taskList.removeChild(taskItems[i]);      
    });
}

你的初始taskItem变量也应该是taskItems,并反映在上面的for循环中。

答案 2 :(得分:0)

taskList.addEventListener("click", (event) => {
     event.target.remove();
});

当指定的事件发生时,将返回事件对象。 事件对象有几个属性,其中一个属性是target,它是事件发生的元素。 event.target返回给我们,我们将remove()方法应用于event.target

因为事件“冒泡”或“事件传播”,我们可以将事件处理程序附加到祖先。最好将事件监听器附加到始终位于DOM中的最近的祖先元素(不会被删除)。

触发事件时 - 在这种情况下是“点击”事件。所有降序元素都将被删除 - 在我们的例子中,因为只有<li>这样就可以了。但是我们应该更具体,因为在不同的情况下,我们可以将此事件处理程序附加到具有多个不同元素的div。

为此,我们添加if条件以检查tagName是否为<li>

if (event.target.tagName == "LI") 

请注意该元素必须是calpitalised

解决方案如下

taskList.addEventListener("click", (event) => {

      if(event.target.tagName == "LI"){
         event.target.remove();
    }});

进一步阅读:

事件对象及其属性: https://developer.mozilla.org/en-US/docs/Web/API/Event

事件冒泡: https://developer.mozilla.org/en-US/docs/Web/API/Event/bubbles

的tagName: https://developer.mozilla.org/en-US/docs/Web/API/Element/tagName