javascript - html列表添加和删除使用和js
问题描述
我正在尝试使用 html 输入框和 js 制作一个简单的列表。该列表在单击“添加技能”时创建,并在单击“删除”时被删除。但是当我尝试在删除后添加一些技能时,最后删除的项目也回来了。
var skillList="";
var i = 0;
function addSkill(){
var skills= document.getElementById("addSkill").value;
if(skills != ""){
skillList += "<li><span name='skillItem' id='skillItem"+ i +"'>" + skills + "</span> " +
"<a onclick='removeSkill()'>remove</a></li>";
i++;
document.getElementById("skill").innerHTML = skillList;
document.getElementById("addSkill").value="";
}
}
function removeSkill(){
skillList="";
var items = document.querySelectorAll("#skill li"),index,tab = [];
for(var j = 0; j < items.length; j++){
tab.push(items[j].innerHTML);
}
for(var j = 0; j < items.length; j++){
items[j].onclick = function(){
index = tab.indexOf(this.innerHTML);
items[index].parentNode.removeChild(items[index]);
tab.splice(j,1);
};
}
console.log(tab);
for(var j=0; j<tab.length;j++){
skillList += "<li>" + tab[j] + "</li>";
}
}
<td><label>skills:</label></td>
<td>
<ul id="skill"></ul>
<input type="text" name="skill" id="addSkill"/>
<a onclick="addSkill();" value="">add skill</a>
</td>
解决方案
您完全迷失在removeSkill
函数中的循环和索引中,这比您正在做的事情要容易得多——一行代码。不需要循环和数组。
您还有许多其他古老的编码风格,应该避免使用。
- 你不需要仅仅因为你想给某人一些东西来点击就使用超链接。所有可见元素都支持一个
click
事件。只有在您实际导航到某个地方时才使用超链接。 - 没有表格就不能使用表格单元格。
- 不要使用内联 HTML 事件属性 (
onclick
)。将所有 JavaScript 与 HTML 分开,并使用.addEventListener()
. - 不要通过将字符串连接在一起来创建新的 HTML。它很快就变成了一场噩梦,需要你使用
.innerHTML
,这对性能和安全都有影响。相反,创建新的 DOM 对象,根据需要配置它们的属性,然后将它们附加到文档中。
请参阅下面的内联评论:
// Get all the element references you'll need just once:
var skillList = document.querySelector("#skillList");
var newSkill = document.querySelector("#newSkill");
var btnAddSkill = document.querySelector("input[type='button'");
// Do all of your event binding in JavaScript, not with inline HTML event attributes
btnAddSkill.addEventListener("click", addSkill);
function addSkill(){
if(newSkill.value !== ""){
// Don't build new HTML by concatenating strings. Create elements and configure them as objects
var li = document.createElement("li");
li.textContent = newSkill.value;
// Only use hyperlinks for navigation, not to have something to click on. Any element can be clicked
var span = document.createElement("span");
span.classList.add("remove");
span.textContent = "remove skill";
span.addEventListener("click", removeSkill);
li.appendChild(span); // Add the span to the bullet
skillList.appendChild(li); // Add the bullet to the list
newSkill.value = "";
}
}
function removeSkill(){
// Just remove the closest <li> ancestor to the <span> that got clicked
skillList.removeChild(this.closest("li"));
}
.remove { display:inline-block; margin-left:10px; padding:2px 4px; background:rgba(200,0,225,.7); color:#ff0; cursor:pointer; }
li {margin:8px 0; border-bottom:1px dashed #e0e0e0; }
<h1>Skills:</h1>
<input type="text" name="skill" id="newSkill">
<input type="button" value="add skill">
<ul id="skillList"></ul>
推荐阅读
- python - 将数组的numpy数组转换为二维数组
- kotlin - Kotlin FlatMap && 递归
- javascript - 如何获取具有嵌套属性的 Javascript 对象的子集?
- angularjs - Firebase 动态链接 REST Api 忽略深层链接中的 # 符号
- nvidia - 如何使用 TensorRT 转换 Faster R-CNN?
- linux - plink.exe 在 ssh 会话中使用 Control-C
- sql - 如何在sql的while循环中的object_id语句中使用表名中的变量
- node.js - 使用 moment.js 解析迄今为止的年龄整数
- django - 不能对保存的表单使用 celery 延迟:对象不是 JSON 可序列化的
- r - 无法在 ADLA 中安装派对包 (R)