分享一个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);
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python Web 开发及 Django 总结

title: Python Web 开发及 Django 总结 date: 2023-07-24 17:26:26 tags: PythonWeb categories:Python cover: https://cover.png feature: false Python 基础部分见&#xff1a;Python 基础总结 1. 创建项目 1.1 命令行 1、下载安装 Django 在终端输入 pip install djan…

【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Pythonmatlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【iOS】Frame与Bounds的区别详解

iOS的坐标系 iOS特有的坐标是&#xff0c;是在iOS坐标系的左上角为坐标原点&#xff0c;往右为X正方向&#xff0c;向下为Y正方向。 bounds和frame都是属于CGRect类型的结构体&#xff0c;系统的定义如下&#xff0c;包含一个CGPoint&#xff08;起点&#xff09;和一个CGSiz…

【云原生系列】云计算概念与架构设计介绍

1 什么是云计算 云计算是一种基于互联网的计算模式&#xff0c;在这个模式下&#xff0c;各种计算资源&#xff08;例如计算机、存储设备、网络设备、应用程序等&#xff09;可以通过互联网实现共享和交付。云计算架构设计的主要目标是实现高效、可扩展、可靠、安全和经济的计算…

Spring优雅的在事务提交/回滚前后插入业务逻辑

业务背景 业务那边想要统计下我们这边每天注册商户成功和失败的数量&#xff0c;你看看怎么给他弄下这个功能 功能实现 TransactionSynchronizationManager.registerSynchronization&#xff0c;发现这是spring事务提供的注册回调接口的方法。 在事务注解方法中&#xff0c…

【双评价笔记】农业指向之水资源评价

农业指向水资源单项评价是基于区域内及邻近地区气象站点长时间序列降水观测资料,通过空间插值得到多年平均降水量分布图层,降水量按照200,400,800,1200这个间断点分为好(很湿润),较好(湿润),一般(半湿润),较差(半干旱),差(干旱)5 个等级。 本次实验过程采用的评价分…

婚庆服务小程序app开发方案详解

开发一款婚庆行业服务小程序有哪些功能呢&#xff1f; 1、选择分类 选择婚庆、婚车、婚宴、司仪、彩妆、婚庆用品、跟拍、摄影等&#xff0c;筛选出对应的商家 2、选择商家 选择分类后&#xff0c;可以选择商家&#xff0c;查看各个商家的详细介绍情况。 3、选择服务套餐 各…

mysql主从同步怎么跳过错误

今天介绍两种mysql主从同步跳过错误的方法&#xff1a; 一、两种方法介绍 1、跳过指定数量的事务&#xff1a; mysql>slave stop; mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER 1 #跳过一个事务 mysql>slave start2、修改mysql的配置文件&#xff0c;通过slav…

android jetpack DataStore(java)代替SharedPreferences

目录 Preferences DataStore 怎么用&#xff1f;导入依赖创建 Preferences DataStore读取内容写入内容 Proto DataStore怎么用&#xff1f;导入依赖创建proto创建Serializer使用DataStore DataStore 提供两种不同的实现&#xff1a;Preferences DataStore 和 Proto DataStore。…

对各种项目梳理Maven、SpringBoot等介绍

对于maven 项目 首先结束pom.xm依赖库 深入比较几种maven仓库的优先级 Maven与IDEA_idea打包和maven打包区别_快乐搬砖的博客-CSDN博客 pom.xml通过什么下载依赖和驱动呢&#xff1f; 以及maven下的settings.xml <settings xmlns"http://maven.apache.org/SETTIN…

神码ai火车头伪原创设置【php源码】

大家好&#xff0c;给大家分享一下python考什么内容&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 1、Python 计算机二级都考什么 Python要到什么程度 考试内容 一、Python语言的基本语法元素…

VsCode与Idea编辑器更换背景图

目录 VsCode Idea VsCode 需要安装background插件 安装完成后&#xff0c;打开设置&#xff0c;搜索background 然后就可以在json文件进行图片设置&#xff0c;透明度等等 Idea 打开File -> Settings 然后找到Appearance &#xff0c; 往下滑&#xff0c;找到BackGround …

聊聊原子弹之父:奥本海默

最近诺兰的电影奥本海默即将热映,其改编自Kai Bird和 Martin J. Sherwin的 2005 年Pulitzer Prize 获奖小说:“American Prometheus: The Triumph and Tragedy of J. Robert Oppenheimer”。这本小说作者研究奥本海默25年,才得以成形,可见奥神本人身上的故事曲折和传奇。 …

从零开始学Docker(三):DockerFile镜像定制

宿主机环境&#xff1a;RockyLinux 9 前言&#xff0c;定制docker镜像的方式有两种&#xff1a; 手动修改容器内容&#xff0c;然后docker commit提交容器为新的镜像通过在dockerfile中定义一系列的命令和参数构成的脚本&#xff0c;然后这些命令应用于基础镜像&#xff0c;依…

C++——模板的作用2:特例化

目录 模板的形式&#xff1a; 一.模板的多参数应用&#xff1a; 例&#xff1a; 错误使用1&#xff1a;使用不标准的模板形参表 ​编辑 错误使用2&#xff1a;使用变量作为实参传递给函数模板 二.模板的特例化&#xff1a; 类模板&#xff1a; 针对模板的特化步骤&am…

SpringBoot的static静态资源访问、参数配置、代码自定义访问规则

目录 1. 静态资源1.1 默认静态资源1.2 Controller高优先级1.3 修改静态资源的URL根路径1.4 修改静态资源的目录1.5 访问webjars依赖包的静态资源1.6 静态资源的关闭1.7 静态资源在浏览器的缓存1.8 静态资源实战1.9 通过代码自定义静态资源访问规则 1. 静态资源 查看源码如下&a…

【前端工程化】未使用docker时,前端项目实现线上秒级回滚

目录 一. 前言 二. 思路 三. 实践 3.1 准备单页应用项目 3.2 保存历史构建index.html内容 3.3 模拟服务端托管前端应用 3.4 快速回滚node服务端代码开发 3.5 快速回滚前端可视化页面开发 3.6 快速回滚测试 四. 总结 一. 前言 项目快速回滚是前端工程化中很重要的一环&…

【LeetCode每日一题】——566.重塑矩阵

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 566.重塑矩阵 四【题目描述】 在 MATLAB 中&…

HTML5中的data-*属性

介绍&#xff1a; data-*全局属性是一类被称为自定义数据属性的属性&#xff0c;它赋予我们在所有 HTML 元素上嵌入自定义数据属性的能力。 data-*的使用 <div class"child" data-name"小红" data-age"18"></div> 在js里有两种获…

Vue2 第二节 ----初识Vue(简单示例,模板语法,数据绑定)

知识点&#xff1a; 1.Vue的简单示例 2.模板语法 3.数据绑定 4.el和data的两种写法 5.MVVM模型 一. Vue的简单实例 <div id"root"><h1>hello, {{name.toUpperCase()}}, {{address}}</h1></div><script type"text/javascript&q…