
本文详细介绍了在J*aScript中,如何解决点击列表项时总是删除最后一个元素的问题。通过利用事件对象(`event.target`)获取被点击元素的文本内容,结合`Array.prototype.indexOf()`定位其在数组中的索引,并使用`Array.prototype.splice()`精确移除该项,最终实现动态购物清单中点击删除指定项目的正确功能。
在Web开发中,创建动态列表(如购物清单、待办事项列表)是常见的需求。用户通常期望能够通过点击列表中的特定项来对其进行操作,例如删除。然而,在实现“点击删除指定项”的功能时,开发者可能会遇到一个常见问题:无论点击哪个列表项,总是删除列表中的最后一个元素。本文将深入探讨这一问题的原因,并提供一个健壮的解决方案。
原始代码尝试通过以下方式删除项目:
核心问题在于,事件处理器没有正确识别用户点击的是哪一个具体的列表项,而是试图通过一个不相关的DOM元素来确定删除目标。
要正确删除被点击的列表项,我们需要做两件事:
为了让每个列表项都能响应点击事件,并传递正确的上下文信息,我们需要将 deleteItem 函数绑定到
原HTML片段:
<span value="\uOOD7" class="close" onclick="deleteItem(myArray)">
<ul id="itemList">
<!-- 列表项在此处生成 -->
</ul>
</span>修改后的HTML片段: 为了让点击
推荐的HTML结构(假设点击
<body>
<div class="container">
<h2>Shopping List</h2>
<div class="header">
<input type="text" id="input" placeholder="Item">
<span onclick="updateList()" id="addBtn"><button>Add Item</button></span>
</div>
<!-- 将删除逻辑直接绑定到 ul 上,利用事件委托 -->
<ul id="itemList">
<!-- 列表项在此处生成 -->
</ul>
</div>
<script src="mainForTask2.js"></script>
</body>注意: 这里的 updateList() 和 deleteItem(event) 不再需要传入 myArray,因为 myArray 是全局变量。
deleteItem 函数需要接收 event 对象,以便获取被点击的元素。
Jaaz
开源的AI设计智能体
216
查看详情
原始 deleteItem 函数:
deleteItem = (arr) => {
let red = document.getElementById("close"); // 错误:无法获取点击的li
const index = arr.indexOf(red);
const x = arr.splice(index, 1)
console.log(arr)
console.log(x)
list1.innerHTML = '';
arrayList(myArray)
idSelector()
}修正后的 deleteItem 函数:
deleteItem = (event) => {
// 阻止事件冒泡,如果需要的话
// event.stopPropagation();
// 确保点击的是列表项本身,而不是 ul 或其他子元素
if (event.target.tagName === 'LI') {
let clickedItemText = event.target.textContent; // 获取被点击列表项的文本内容
let index = myArray.indexOf(clickedItemText); // 在数组中查找该文本对应的索引
if (index > -1) { // 确保找到了该项
myArray.splice(index, 1); // 从数组中删除该项
}
// 清空并重新渲染列表
list1.innerHTML = '';
arrayList(myArray);
idSelector(); // 如果有需要更新列表项样式的函数
}
}为了让每个新创建的
在 上使用事件委托:
首先,确保 deleteItem 函数被绑定到
// 在初始化时绑定事件监听器到 ul 元素
list1.addEventListener('click', deleteItem);
// ... (其他代码)
// 修正后的 arrayList 函数(无需为每个li单独绑定事件)
arrayList = (arr) => {
list1.innerHTML = ''; // 先清空,再添加,避免重复
arr.forEach(item => {
let li = document.createElement('li');
li.textContent = item;
list1.appendChild(li);
});
}完整修正后的J*aScript代码示例:
// mainForTask2.js
let myArray = ["Sugar", "Milk", "Bread", "Apples"];
let list1 = document.querySelector("#itemList");
// 该函数将数组中的项目推送到无序列表中
arrayList = (arr) => {
list1.innerHTML = ''; // 每次重新渲染前清空列表
arr.forEach(item => {
let li = document.createElement('li');
li.textContent = item;
list1.appendChild(li);
});
}
// 初始渲染列表
arrayList(myArray);
// 该函数改变两个列表项的背景颜色以显示它们已售出
const idSelector = () => {
let idElement = document.getElementsByTagName("li");
// 检查元素是否存在,避免报错
if (idElement.length > 0) {
if (idElement[0]) idElement[0].style.color = "red";
if (idElement[3]) idElement[3].style.color = "red"; // 确保索引存在
}
}
// 初始设置样式
idSelector();
// 该函数使用用户输入从表单中添加项目到列表中
updateList = () => { // 不再需要传入arr,直接使用myArray
let newItem = document.getElementById("input").value.trim(); // 获取输入值并去除空白
if (newItem === "") {
alert("Please enter a value if you wish to add something to your list.");
} else {
myArray.push(newItem); // 添加到数组
document.getElementById("input").value = ''; // 清空输入框
arrayList(myArray); // 重新渲染列表
idSelector(); // 重新应用样式
}
}
// 该函数用于从购物清单和数组中删除用户选择的指定项目
deleteItem = (event) => {
// 检查点击的元素是否是 LI 标签
if (event.target.tagName === 'LI') {
let clickedItemText = event.target.textContent; // 获取被点击列表项的文本内容
let index = myArray.indexOf(clickedItemText); // 在数组中查找该文本对应的索引
if (index > -1) { // 确保找到了该项
myArray.splice(index, 1); // 从数组中删除该项
}
arrayList(myArray); // 重新渲染列表
idSelector(); // 重新应用样式
}
}
// 为 ul 元素添加事件监听器,实现事件委托
list1.addEventListener('click', deleteItem);
<li data-id="unique-item-id">Item Text</li>
在 deleteItem 中:
let itemId = event.target.dataset.id; // 然后根据 itemId 在数组中找到并删除
通过理解事件流和 event.target 的作用,我们可以精确地识别用户点击的特定列表项。结合 Array.prototype.indexOf() 和 Array.prototype.splice() 方法,我们可以高效且准确地管理动态列表的数据和视图。采用事件委托等最佳实践,能够进一步提升代码的性能和可维护性。
以上就是如何在J*aScript中实现点击删除特定列表项而非最后一项的详细内容,更多请关注其它相关文章!
# 清空
# 本溪seo的好方法
# 河北区网站推广方式
# 聊城智能网站建设费用
# 石家庄高端网站建设收费
# 展厅网站排名优化软件
# 企业网站优化问题
# 静安区推广营销招聘信息
# 丁立芳seo
# 哪个网站可以推广广告
# 互联网企业营销推广
# 全局变量
# 列表中
# 都能
# 而非
# 的是
# javascript
# 我们可以
# 该项
# 组中
# 绑定
# red
# 点击事件
# 常见问题
# apple
# ai
# 事件冒泡
# app
# 处理器
# js
# html
# java
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
《华夏千秋》龙女试炼功法获取方法
Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南
抖音猜你想搜能说明对方搜过吗
Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题
qq音乐官方网站入口_qq音乐在线听歌网页版链接
FotoBalloon图片左右镜像教程
Composer如何使用composer-plugin-api开发自定义插件
《万兴喵影》导出视频方法
Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法
什么是Satis,如何用它搭建一个私有的composer仓库?
电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】
Python实时数据流中高效查找最大最小值
《荔枝fm》导出文件教程
高德地图怎么查看未来行程规划_高德地图未来行程规划查看方法
电脑开不了机怎么办 电脑无法开机的解决方法
如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局
126邮箱申请入口官网_126邮箱注册免费登录2025
悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口
J*aScript模拟悬停与点击:自动化网页动态元素交互指南
优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理
Python中处理嵌套字典与列表的数据提取与过滤教程
Dagster资产间数据传递与用户配置管理教程
苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法
《海豚家》注销账号方法
汽车之家网页版免费登录_汽车之家官网首页直接进入
《气泡星球》兑换码礼包大全
如何查询个人病历记录
firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接
mysql触发器如何编写_mysql触发器编写规范与代码示例讲解
有道AI翻译入口 智能写作官方网站入口
创客贴登录页面入口 创客贴网页版最新网址链接
使用document.execCommand实现Web文本编辑器加粗/取消加粗
广州地铁app准妈咪徽章领取方法
Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法
C++ optional用法详解_C++17处理可能为空的返回值
Fedora怎么安装 Fedora Workstation安装步骤
《深林》冬季章节图文攻略
WooCommerce购物车:强制显示所有交叉销售商品教程
《糖豆》添加舞曲方法
《暗黑破坏神4》国服回归送狂欢礼包 价值6916元
POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩
Golang如何初始化module项目_Golang module init使用说明
2025SNH48年度青春盛典门票价格及购买方式
123平台官方登录入口 123邮箱网页端在线沟通工具
网易云音乐闹钟铃声设置教程
优化CSS动画与J*aScript定时器协同:构建稳定Toast提示
抖音如何解除|直播|权限绑定_抖音关闭并解绑|直播|功能的方法
优化 React onClick 事件处理:函数引用与箭头函数的对比
C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧
解决Pandas DataFrame高度碎片化警告:高效创建多列的策略
2025-10-29
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。