关于js一组按钮绑定一个事件——只点击第一个按钮有效的问题

2 篇文章 0 订阅

记录一个写项目遇到的问题:
使用<c:forEach标签遍历购物车商品,实现点击每个商品数量加减按钮,出现了给按钮绑定事件,只有点击购物车的第一个商品按钮才有效的问题(点击其他商品按钮没反应,浏览器和后端均不报错)
改了好久啊终于改好了〒▽〒
初步猜想: 遍历购物车商品数组时,事件可能只绑定了第一个商品,其他的商品没有获取到。
原因:
循环内是一组class或id相同的标签,而且是运行时动态加入页面的,如果用选择器直接获取var id=$("#id").val()那么只可能获取的是第一个元素,所以点击按钮只有第一个有效(只有第一个元素绑定了事件)。
id选择器获取的永远都是第一个出现的dom!
也就是说,使用id选择器获取并不能获取到数组,而是第一个值

解决: 在html页面里动态添加的模块(循环),想要获取一组循环中的其中一个元素值:
使用document.getElementsByName("arrid");获取一组name为arrid的元素数组,再使用下标取出其中一个元素。下标获取方法是,把button的value设置成序号,通过以下方式获取下标。
var status=$("button:focus").val();

注意以下方式的不同

	//找到指定id属性值得对象 返回找到的一个对象  
    var id=document.getElementById("uid");  
    //找到指定name属性的对象,返回数组  
    var arr=document.getElementsByName("user");  
    //找到指定标签对象 ,返回数组  
    var arr=document.getElementsByTagName("input");  
    //找到指定class的对象,返回数组  
    var arr=document.getElementsByClassName("user");

项目实现购物车加减按钮部分代码如下:

1.html代码

<c:forEach items="${cartList}" var="cart" varStatus="status">
			<tr>
				<td>${status.index}</td>
				<td><input type="checkbox" name="cartid" value="${cart.id}" class="input1" id="selectid"></td>
				<td><img src="images/${cart.flowername}.jpg " width=150 height=150></td>
				<td>${cart.flowername}</td>
				<td>${cart.price}</td>
				<td><span><button value="${status.index}" class="decnum">-</button></span>
					<input type="hidden" name="arrid" value="${cart.id}">
					<input type="text" value="${cart.num}" name="arrcartnum" class="cartnuminput">
					<span><button  class="addnum" value="${status.index}">+</button></span>
				</td>
			</tr>
			</c:forEach>

2.js代码

$(function () {
		      //获取购物车id数组
		      var cartidarr=document.getElementsByName("arrid");
		      //获取购物车num数组
		      var cartnumarr=document.getElementsByName("arrcartnum");
              $(".decnum").on("click",function () {
                  var userid=${user.id};//用户id
				  var status=$("button:focus").val();//通过鼠标焦点获取当前购物车编号
				  //alert("status="+status);
				  var deccartid=cartidarr[status].value;//获取当前购物车具体商品id
				  //alert("当前获取的购物车编id为:"+deccartid);
				  var cartnum=cartnumarr[status].value;//获取此购物车具体商品数量
				  //alert("cartnum="+cartnum);
				  if(cartnum>1){//商品数量未减到0
					      cartnum--;
					      $(".cartnuminput").val(cartnum);//前端修改页面显示数量
                          $.ajax({//通过ajax向后台传送数据修改数据库
						  data:{
						      userid:userid,
                              deccartid:deccartid
						  },
						  url:"deccartnum",
						  type:"post",
						  success:function (result) {
							  if(result>0){
							      alert("减少商品数量成功");
                                  location.href="getallcarmessage?userid="+userid;
							  }else{
							      alert("减少商品数量失败");
							  }
                          }
					  });
                  }else{//删除商品
				      //alert("删除商品id为:"+deccartid);
				      $.ajax({
						  data:{
                              deccartid:deccartid
						  },
						  type:"post",
						  url:"cartdelete",
						  success:function (result) {
							  if(result>0){
							      alert("删除商品成功");
                                  location.href="getallcarmessage?userid="+userid;
							  }else{
                                  alert("删除商品失败");
							  }
                          }
					  });
                  }
              });
			  $(".addnum").on("click",function () {
				  //alert("点击+按钮");
                  var userid=${user.id};//用户id
                  var status=$("button:focus").val();//通过鼠标焦点获取当前购物车编号
                  //alert("status="+status);
                  var addcartid=cartidarr[status].value;//获取当前购物车id
				  //alert("add  id="+addcartid);
                  var cartnum=cartnumarr[status].value;//获取此购物车具体商品数量
				  //alert("cartnum="+cartnum);
				  if(cartnum<50){
				      cartnum++;
				      $.ajax({
						  data:{
						      addcartid:addcartid
						  },
						  url:"addcartnum",
						  type:"post",
						  success:function (result) {
                              if(result>0){
                                  alert("增加商品数量成功");
                                  location.href="getallcarmessage?userid="+userid;
                              }else{
                                  alert("增加商品数量失败");
                              }
                          }
					  });
                  }else{
				      alert("您增加的商品已经超过上限,增加失败!");
                  }
              });
               });

希望以上笔记对你有帮助,如有错误,欢迎指正。
别忘了点完赞再划走呦~ヾ(✿゚▽゚)ノ感谢~

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
编辑推荐 《精通AngularJS》指出AngularJS诞生于Google,已用于开发多款Google产品。它是一套JavaScript前端框架,用于开发当下流行的数据驱动的单页面Web应用。其核心特性是:MVC、模块化、自动双向数据绑定、语义化标签、依赖注入等。 作者简介 Pawel Kozlowski有15年以上的Web开发经验,接触过多种Web技术、语言和平台。他精通客户端和服务器端编程,并始终在寻找能提高生产率的工具和流程。Pawel是自由和开源软件的坚定支持者,他在AngularJS 社区非常活跃,为AngularJS项目贡献了大量的代码。他也对Angular UI (AngularJS的配套框架)有所贡献,并为AngularJS 提供了Twitter Bootstrap 相关的指令(directives)。不写代码时,Pawel 常在会议与活动上为AngularJS布道。 Peter Bacon Darwin已经积累了20年以上的编程经验,他在.NET发布之前,就已经用它工作了。他还对IronRuby的开发有所贡献。他曾在Avanade和IMGROUP做IT顾问。退休后,自由开发和照顾孩子占用了他大部分的时光。Peter是AngularJS社区的名人。他最近加入了Google的AngularJS团队。他还是Angular UI项目的创始成员。他曾在Devoxx UK和其他活动中发表过有关AngularJS的演讲,并开办过AngularJS的培训课程。他希望帮助企业更好地利用AngularJS。 目录 序1 第1章Angular之禅7 11邂逅AngularJS7 熟悉框架8 参与AngularJS项目8 社区8 在线学习资源9 库和扩展9 工具9 Batarang10 Plunker与jsFiddle10 IDE扩展和插件10 12AngularJS速成10 HelloWorld——AngularJS示例10 双向数据绑定12 AngularJS中的MVC模式12 鸟瞰13 深入作用域15 视图21 模块与依赖注入26 模块26 协作对象27 注册服务29 模块的生命周期33 模块依赖35 13AngularJS和其他框架38 jQuery与AngularJS39 苹果与橙子40 窥视未来41 14总结41 第2章构建与测试43 21介绍示例应用44 熟悉问题领域44 技术栈45 持久化存储46 MongoLab46 服务器端环境47 第三方JavaScript库48 BootstrapCSS48 22构建系统48 构建系统准则49 自动化所有事情49 尽早报错,清晰报错49 不同的工作流,不同的命令50 构建脚本同样是代码50 工具50 Gruntjs51 测试库与工具51 Jasmine51 Karmarunner52 23组织文件和目录52 根目录52 进入源代码目录54 AngularJS的特定文件54 轻装上路56 深入测试目录57 文件命名约定57 24AngularJS模块和文件57 一个文件,一个模块58 模块内部59 注册provider的不同语法59 声明配置和运行块的语法61 25自动化测试62 单元测试63 剖析Jasmine测试64 测试AngularJS对象65 测试服务65 测试控制器67 Mock对象和异步代码测试68 端对端测试70 日常工作流71 Karmarunner的提示与技巧72 执行测试子集73 调试73 26小结74 第3章与后端服务器通信75 31使用$http进行XHR和JSONP请求75 熟悉数据模型和MongoLabURLs76 $httpAPI快速导览76 配置对象说明77 转换请求数据78 处理HTTP响应79 转换响应数据79 处理同源政策约束79 利用JSONP克服同源政策约束80 JSONP的限制81 利用CORS克服同源政策约束81 服务器端代理83 32promiseAPI与$q84 工作中的promise和$q服务85 学习$q服务的基础知识85 promise是第一类JavaScript对象87 聚合回调88 注册回调和承诺的生命周期88 异步动作的链式调用89 关于$q的其他91 AngularJS中的$q集成93 33promiseAPI与$http94 34与RESTful端点通信95 $resource服务95 构造级与实例级方法97 $resource创建异步方法100 $resource服务的限制101 使用$http自定

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nan_black

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值