简单的onclick无法删除子节点
Simple onclick fails to remove child node
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
window.onload = function() {
var oBtn = document.getElementById('btn1');
var oTxt = document.getElementById('txt1');
var oUl = document.getElementById('ul1');
var aA = [];
oBtn.onclick = function() {
var oLi = document.createElement('li');
var aLi = document.getElementsByTagName('li');
// add <a> to li
oLi.innerHTML = oTxt.value + ' <a href="javascript:;">delete</a>';
if (aLi.length > 0) {
oUl.insertBefore(oLi, aLi[0]);
} else {
oUl.appendChild(oLi);
}
// everytime add an li, add <a> which is in <li> to aA
aA.push(oLi.children[0]);
};
for (var i = 0; i < aA.length; i++) {
aA[i].onclick = function() {
oUl.removeChild(this.parentNode);
}
}
}
</script>
</head>
<body>
<input id='txt1' type="text" />
<!-- Add an li element -->
<input id="btn1" type="button" value="Add li" />
<ul id="ul1">
</ul>
</body>
</html>
大家好,我是一个javascript初学者,我有一个麻烦在点击事件,以下是我的问题:
当我点击oBtn.onclick
时,它创建了一个li
元素到ul
,然后li
的innerHTML
包含标签"a"并被推送到一个名为aA的数组。
然而,在aA[i].onclick
中,它不起作用,那么我的代码中的问题是什么?
您从未做过任何事情来连接a
元素的click
事件的事件处理程序。看到评论:
window.onload = function() {
var oBtn = document.getElementById('btn1');
var oTxt = document.getElementById('txt1');
var oUl = document.getElementById('ul1');
var aA = [];
oBtn.onclick = function() {
var oLi = document.createElement('li');
var aLi = document.getElementsByTagName('li');
// Create deletion link and hook it up
var a = document.createElement('a');
a.href = "javascript:;";
a.innerHTML = "delete";
a.onclick = deleteOnClick;
// add text and <a> to li
// note the use of createTextNode, in case the user types something with < in it
oLi.appendChild(document.createTextNode(oTxt.value + " "));
oLi.appendChild(a);
// Add at the beginning of the list
oUl.insertBefore(oLi, oUl.firstChild);
// everytime add an li, add <a> which is in <li> to aA
aA.push(oLi.children[0]);
};
// Called by click handler to delete the clicked' element's parent
function deleteOnClick() {
var parent = this.parentNode;
parent.parentNode.removeChild(parent);
}
};
<input id='txt1' type="text" />
<!-- Add an li element -->
<input id="btn1" type="button" value="Add li" />
<ul id="ul1">
</ul>
其他注释:
-
onclick
是快速和容易的,但它不能很好地发挥与其他。看看使用现代事件处理(addEventListner
)。如果您需要支持过时的浏览器,如IE8,请参阅此答案,以获得即使缺少addEventListener
也能工作的功能。 -
在
head
中加载脚本(不使用async
或defer
)是糟糕的做法。除非有很好的理由做其他事情,否则将它们放在文档正文的末尾,就在结束</body>
标记之前。 -
window
上的load
事件发生在页面加载过程的非常晚,直到所有图像和样式表以及其他外部资源完成加载之后。除非有很好的理由等待那么长时间,否则请尽早连接处理程序。如果你把你的脚本放在body
的末尾(见#2),你可以在脚本的顶层做它。 -
把你的代码包装成这样的作用域函数:
(function() { // ...your code here... })();
将为您省去不少麻烦,否则所有顶级变量和函数都是全局变量。全局命名空间已经太拥挤了,导致冲突成为一个问题。
-
为您的
delete
处理程序研究事件委托的想法。您可以处理ul
元素上的单击,然后检查它在冒泡时是否经过a
元素。这让您不必担心稍后创建删除链接时将其连接起来。
您需要在创建锚点之后绑定锚点单击事件-您尝试在创建锚点之前绑定它
window.onload = function() {
var oBtn = document.getElementById('btn1');
var oTxt = document.getElementById('txt1');
var oUl = document.getElementById('ul1');
var aA = [];
oBtn.onclick = function() {
var oLi = document.createElement('li');
var aLi = document.getElementsByTagName('li');
// add <a> to li
oLi.innerHTML = oTxt.value + ' <a href="javascript:;">delete</a>';
if (aLi.length > 0) {
oUl.insertBefore(oLi, aLi[0]);
} else {
oUl.appendChild(oLi);
}
// everytime add an li, add <a> which is in <li> to aA
// aA.push(oLi.children[0]); <- don't think you need this array anymore
// bind your anchor click here
oLi.children[0].onclick = function() {
oUl.removeChild(this.parentNode);
}
};
}
<input id='txt1' type="text" />
<!-- Add an li element -->
<input id="btn1" type="button" value="Add li" />
<ul id="ul1">
</ul>
相关文章:
- 删除HTML节点而不删除其子节点
- jQuery如何用1行来附加html和删除子节点
- 如何在JavaScript中删除子节点触发点击事件时的父节点
- Kendo TreeView-只向没有子节点的父节点添加删除图像图标
- 使用 JavaScript 从 XML 中删除子节点
- jQuery - 如何循环删除仅某些子节点
- 如何从 Javascript 对象中删除所有子节点
- 从 JSON 中删除子节点
- 如何在 jstree 中删除所选节点的子节点
- 从react中的父dom节点中删除子组件
- 可以't删除所有子节点
- DOM Javascript正在删除子节点
- 如何使用jquery删除树视图子节点
- 删除子节点错误
- 删除子节点
- 如何查找父节点和删除子节点
- 删除子节点后,我无法重新运行函数本身
- 简单的onclick无法删除子节点
- 如何在JavaScript中删除子节点
- Firebase——批量删除子节点