分享一个jquery重复绑定事件的问题

这篇文章主要分享一下前端在使用jQuery给元素绑定click事件时遇到的一点小问题。

今天在通过JS代码动态绑定元素的点击事件时遇到一点问题,如上图所示,需要实现动态控制低级内丹格子的解锁,每种宠物造型都有一个内丹数量。如图,忘川童子可学习的内丹数量是4(包含了高级内丹),所以实际的内丹数量是3,所以上图只解锁了3个低级内丹的格子。

 对比游戏内数据

前端实现的效果如下,点击对话框左边的数据列表,动态加载上方和右侧面板的数据,这里只关注内丹的加载。

/*** 加载宠物内丹*/
function loadNeidans() {let rowData = $("#chongwu_datalist").datalist("getSelected");$("#chongwu_id").val(rowData.id);$("#chongwu_id_").val(rowData.id);for (let i = 1; i <= 4; i++) {$(".neidan_" + i + ">img").attr("src", "/images/lock.png");}$(".gaoji_neidan>img").attr("src", "/images/add.png");$(".zhaunshu_neidan>img").attr("src", "/images/add.png");// 根据当前宠物的造型为4个低级内丹格子动态绑定点击事件get("/chongwu_category/selectById", {id: rowData.categoryId}, function (res) {// 得到当前宠物造型可以学习的低级内丹数let count = res.neidanQuantity - 1;// 如果小于4,则有内丹格子未解锁if (count < 4) {for (let i = 1; i <= count; i++) {$(".neidan_" + i).click(function() {loc = i;clickNeidan(0);});$(".neidan_" + i + ">img").attr("src", "/images/add.png");}for (let i = count + 1; i <= 4; i++) {$(".neidan_" + i).click(function () {alertMsg("这只召唤灵只能学习" + count + "个低级内丹");});}} else {for (let i = 1; i <= 4; i++) {$(".neidan_" + i + ">img").attr("src", "/images/add.png");$(".neidan_" + i).on("click", function() {loc = i;clickNeidan(0);});}}}, error);get("/chongwu_neidan/selectNeidans", {chongwuId: rowData.id}, function (res) {if (res && res.length > 0) {for (let i = 0; i < res.length; i++) {let neidan = res[i];let image = neidan.image;let location = neidan.location;if (location === 0) {$(".gaoji_neidan>img").attr("src", image);} else {$(".neidan_" + neidan.location + ">img").attr("src", image);}}}}, error);get("/zhuanshu_neidan/selectByChongwuId", {chongwuId: rowData.id}, function (response) {let result = response.data;if (result) {$(".zhaunshu_neidan>img").attr("src", result.image).attr("title", result.name);}}, error);
}

重点关注下面这块代码,这里通过选中宠物的宠物类型ID查询宠物类型信息,根据内丹数量动态设置低级内丹对应格子的图片以及点击事件。

    // 根据当前宠物的造型为4个低级内丹格子动态绑定点击事件get("/chongwu_category/selectById", {id: rowData.categoryId}, function (res) {// 得到当前宠物造型可以学习的低级内丹数let count = res.neidanQuantity - 1;// 如果小于4,则有内丹格子未解锁if (count < 4) {for (let i = 1; i <= count; i++) {$(".neidan_" + i).click(function() {loc = i;clickNeidan(0);});$(".neidan_" + i + ">img").attr("src", "/images/add.png");}for (let i = count + 1; i <= 4; i++) {$(".neidan_" + i).click(function () {alertMsg("这只召唤灵只能学习" + count + "个低级内丹");});}} else {for (let i = 1; i <= 4; i++) {$(".neidan_" + i + ">img").attr("src", "/images/add.png");$(".neidan_" + i).on("click", function() {loc = i;clickNeidan(0);});}}}, error);

比如,忘川童子的内丹数量是4-1=3,所以最后一个内丹格子无效,点击时应该提示进行相应提示

上面的代码看起来好像没什么问题,但是多点几次左边列表的宠物就会发现,点击锁图标所在的格子会弹出越来越多的对话框。

具体原因是每次选择宠物都会给元素绑定一次click事件,那么在每次绑定之前解绑之前的click事件就行了,通过jQuery的unbind(事件名)方法解除事件的绑定,修改之后的代码如下,问题完美解决了。

/*** 加载宠物内丹*/
function loadNeidans() {let rowData = $("#chongwu_datalist").datalist("getSelected");$("#chongwu_id").val(rowData.id);$("#chongwu_id_").val(rowData.id);for (let i = 1; i <= 4; i++) {$(".neidan_" + i + ">img").attr("src", "/images/lock.png");}$(".gaoji_neidan>img").attr("src", "/images/add.png");$(".zhaunshu_neidan>img").attr("src", "/images/add.png");// 根据当前宠物的造型为4个低级内丹格子动态绑定点击事件get("/chongwu_category/selectById", {id: rowData.categoryId}, function (res) {// 得到当前宠物造型可以学习的低级内丹数let count = res.neidanQuantity - 1;// 如果小于4,则有内丹格子未解锁if (count < 4) {for (let i = 1; i <= count; i++) {$(".neidan_" + i).unbind("click").click(function() {loc = i;clickNeidan(0);});$(".neidan_" + i + ">img").attr("src", "/images/add.png");}for (let i = count + 1; i <= 4; i++) {$(".neidan_" + i).unbind("click").click(function () {alertMsg("这只召唤灵只能学习" + count + "个低级内丹");});}} else {for (let i = 1; i <= 4; i++) {$(".neidan_" + i + ">img").attr("src", "/images/add.png");$(".neidan_" + i).unbind("click").click(function() {loc = i;clickNeidan(0);});}}}, error);get("/chongwu_neidan/selectNeidans", {chongwuId: rowData.id}, function (res) {if (res && res.length > 0) {for (let i = 0; i < res.length; i++) {let neidan = res[i];let image = neidan.image;let location = neidan.location;if (location === 0) {$(".gaoji_neidan>img").attr("src", image);} else {$(".neidan_" + neidan.location + ">img").attr("src", image);}}}}, error);get("/zhuanshu_neidan/selectByChongwuId", {chongwuId: rowData.id}, function (response) {let result = response.data;if (result) {$(".zhaunshu_neidan>img").attr("src", result.image).attr("title", result.name);}}, error);
}

总结:这种问题一般遇上的几率很少,因为很少有这种动态绑定事件的需求,写这篇文章是为了记录自己项目中遇到的问题,可能这篇文章会对部分遇到类似问题的童鞋有点帮助。

好了,文章就分享到这里了,看完觉得对你有所帮助,不要忘了点赞+收藏哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/15799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker如何运行容器?

文章目录 1 容器操作1.1容器相关命令1.2 创建并运行一个容器docker命令解析nacos启动成功 访问进入容器&#xff0c;修改配置文件 总结 接上集 CentOS 7安装Docker https://blog.csdn.net/qq_39017153/article/details/131955100 1 容器操作 1.1容器相关命令 容器操作的命令如…

【LeetCode 算法】Linked List Cycle II 环形链表 II

文章目录 Linked List Cycle II 环形链表 II问题描述&#xff1a;分析代码哈希快慢指针 Tag Linked List Cycle II 环形链表 II 问题描述&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链…

FPGA实现NIC 10G UDP协议栈网卡,纯verilog代码编写,提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、10G网卡基本性能简介4、详细设计方案接口概述PCIe HIPDMA IFAXI总线接口时钟同步处理TXQ和RXQ队列TXCQ和RXCQ队列完成EQ MAC PHY流水线队列管理发送调度程序端口和接口数据路径以及发送和接收引擎分段内存接口 5、vivado工程详解6、上板…

Vue教程(三):计算属性

1、姓名案例—插值语法版 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>姓名案例-插值语法版</title><script type"text/javascript" src"../js/vue.js"><…

【Docker】制作Docker私有仓库

文章目录 1. 安装私有镜像仓库2. 镜像仓库可视化3. 参考资料 1. 安装私有镜像仓库 由于之后我们需要推送到私有镜像仓库&#xff0c;我们预先安装好&#xff0c;使用的是Docker公司开发的私有镜像仓库Registry。 下载Registry的Docker镜像&#xff1b; docker pull registry:2使…

极验4代滑块验证码破解(补环境直接强暴式拿下)

目录 前言一、分析二、验证总结借鉴 前言 极验第四代好像简单了特别多&#xff0c;没有什么技巧&#xff0c;环境党直接5分钟拿下。 网址: aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vYWRhcHRpdmUtY2FwdGNoYS1kZW1v 一、分析 直接去它官网&#xff0c;滑动滑块打开控制台瞅瞅 可以看…

Spring Boot 3.x 系列【49】启动流程 | 创建、准备应用上下文

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 1. 前言2. 核心类2.1 ServletWebServerApplicationContext2.2 AnnotatedBeanDefinitionReader ClassPathBeanDefinitionSc…

CSS中有哪些单位?

CSS中有多种单位可用于指定尺寸、长度、角度等值。 下面是一些常见的CSS单位&#xff1a; 1. px (pixels)&#xff1a;像素单位&#xff0c;是相对于屏幕上的单个像素点的长度单位。 2. % (percentage)&#xff1a;百分比单位&#xff0c;相对于父元素的特定属性的值进行计算…

day18-二叉树统一迭代写法

二叉树统一迭代写法 思路 前面说了&#xff0c;前序/后序和中序不能统一的原因是因为&#xff0c;访问和处理的时机不同&#xff0c;如果要做到同时处理&#xff0c;我们可以在要处理的结点后放一个空指针作为标记。如下 前序代码&#xff1a; class Solution { public:vec…

【Leetcode】69.x的平方根

一、题目 1、题目描述 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例1: 输入:x = 4 输出:2示例2: 输入:…

Maven pom.xml文件中build,plugin标签的具体使用

<build> 标签 <build> 标签是 pom.xml 文件中一个重要的标签&#xff0c;用于配置 Maven 项目的构建过程。在 <build> 标签下&#xff0c;可以配置构建相关的设置&#xff0c;包括源代码目录、输出目录、插件配置等。 以下是 <build> 标签的详细使用方…

数学建模学习(8):单目标和多目标规划

优化问题描述 优化 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 线性规划 线性规划是指目标函数和约束都是线性的情况 [x,fval]linprog(f,A,b,Aeq,Beq,LB,U…

MyBatis缓存-提高检索效率的利器--二级缓存

文章目录 缓存-提高检索效率的利器缓存-官方文档二级缓存基本介绍二级缓存原理图 二级缓存快速入门快速入门注意事项和使用陷阱理解二级缓存策略的参数 四大策略如何禁用二级缓存mybatis 刷新二级缓存的设置 缓存-提高检索效率的利器 缓存-官方文档 文档地址: https://mybati…

秋叶整合包如何安装Python包

前几天写了一篇《手把手教你在本机安装Stable Diffusion秋叶整合包》的文章&#xff0c;有同学运行时遇到缺少Python Module的问题&#xff0c;帮助他处理了一下&#xff0c;今天把这个经验分享给大家&#xff0c;希望能帮助到更多的同学。 有时候启动某些插件的时候会出现 Mo…

【单机多卡】torch改造代码为DDP单机多卡分布式并行

torch分布式数据并行DDPtorch.nn.parallel.DistributedDataParallel代码修改记录。&#xff08;要求pytorch_version>1.0&#xff09; 目录 1.&#x1f344;&#x1f344;要修改的地方概览 2.✏️✏️初始化 3.✏️✏️设置当前进程GPU 4.✏️✏️设置sampler 5.✏️✏…

【设计模式】简单工厂模式

C语言实现简单的工厂模式 #include <stdio.h> #include <stdlib.h>// 图形类型枚举 typedef enum {CIRCLE,SQUARE,RECTANGLE } ShapeType;// 图形结构体 typedef struct {ShapeType type;float area; } Shape;// 创建圆形 Shape* createCircle() {Shape* circle …

大数据开发面试必问:Hive调优技巧系列一

Hive必问调优 Hive 调优拆解:Hive SQL 几乎是每一位互联网分析师的必备技能&#xff0c;相信很多小伙伴都有被面试官问到 Hive 优化问题的经历。所以掌握扎实的 HQL 基础尤为重要&#xff0c;hive优化也是小伙伴应该掌握的一项技能&#xff0c;本篇文章具体从hive建表优化、HQ…

数据结构-链表结构-单向链表

链表结构 说到链表结构就不得不提起数据结构&#xff0c;什么是数据结构&#xff1f;就是用来组织和存储数据的某种结构。那么到底是某种结构呢&#xff1f; 数据结构分为&#xff1a; 线性结构 数组&#xff0c;链表&#xff0c;栈&#xff0c;队列 树形结构 二叉树&#x…

QWidget窗口类

QWidget窗口类 设置父对象窗口位置窗口尺寸窗口标题和图标信号槽函数例子1例子3例子3 设置父对象 // 构造函数 QWidget::QWidget(QWidget *parent nullptr, Qt::WindowFlags f Qt::WindowFlags());// 公共成员函数 // 给当前窗口设置父对象 void QWidget::setParent(QWidget…

Linux系统下MySQL读写分离

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、基于Amoeba读写分离 1.基于程序代码内部实现 2.基于中间代理层实现 三、操作步骤 1.在主机Amoeba上安装java环境 2.安装并配置Amoeba 3.配置Amoeba读写分离…