【知了堂学习笔记】利用js、ajax实现遍历行传参
来源:互联网 发布:淘宝自定义导航条代码 编辑:程序博客网 时间:2024/06/07 00:31
一.单个下拉框
在网页中遍历出来的每行都有一个select,怎么才能将对应select选中的内容传递到各行对应的编辑(a标签)内,点击后将参数内容传递到servlet中,进行操作。
实现效果图如下:
思路:将每行的材料编号除了给材料编号那一列显示之外,同样也赋给调入仓库和编辑标签,用于区分每行不同的下拉框和a标签。通过js(window.onload)在页面加载完成后,执行,获取所有select,然后利用循环遍历出所有的下拉框,然后写出每个下拉框的onchange事件,获取编号相同的a标签,然后获取其href,然后将需要添加的参数通过字符串替换添加到a标签的href中:
window.onload = function() {var sels = document.getElementsByName("selects "); // 得到所有的select集合for(var i = 0;i < selects.length; i++) {selects [i].onchange = function() { // 事件绑定var submit = document.getElementById(this.title); // 确定按钮var url = submit.href; // urlvar index = this.selectedIndex; // 下拉框选中的索引var value = this.options[index].text; // 下拉框中值url = url.replace("&remove_newWare =", "& remove_newWare ="+value);}}}
Jsp页面表格代码:
<c:forEach items="${pb.beanList }" var="material" varStatus="i"><tr class="tableItem"><td >${material.material_id }</td><td>${material.material_name }</td><td>材料</td><td>${material.material_count }</td><td>${material.warehouse_id }</td><td> <select name="selects" title="${material.material_id }"> <option>--请选择--</option> <c:forEach items="${listWarehouse }" var="warehouseid"> <option value="${warehouseid.warehouse_id }">${warehouseid.warehouse_id }</option> </c:forEach> </select></td><td>${rcount[i.count-1] }</td><td><a href="${ctx }/removes.do?method=editRemovesMaterial&material_id=${material.material_id &remove_newWare=" id="${material.material_id }">确认</a></td> </tr></c:forEach>
这样过后,确实能将下拉框中选中的值,传到每行对应的a标签中,但是这里又发现一个问题,就是如果我第一次选择后,没有提交,而是再次选择或者多次重新选择,那么a标签中remove_newWare就会被多次替换导致,最终有多个选中的值出现在它的后面。所以这里需要改进,下面是改进后的代码。
window.onload = function() { var sels = document.getElementsByName("selects"); // 得到所有的select, 集合for(var i = 0;i < sels.length; i++) {sels[i].onchange = function() { // 事件绑定var submit = document.getElementById(this.title); // 确定按钮var url = submit.href; // urlfunction GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");//构造一个含有目标参数的正则表达式对象 var r = url.substr(1).match(reg);//匹配目标参数 if(r!=null)return unescape(r[2]); return null;//返回参数值}var removeNew = GetQueryString("remove_newWare");if(removeNew==null||removeNew==""){var index = this.selectedIndex; // 下拉框选中的索引var value = this.options[index].text; // 下拉框中值url = url.replace("&remove_newWare=&", "&remove_newWare="+value+"&");submit.setAttribute('href', url);}else{var index = this.selectedIndex; // 下拉框选中的索引var value = this.options[index].text; // 下拉框中值url = url.replace("&remove_newWare="+removeNew+"&", "&remove_newWare="+value+"&");submit.setAttribute('href', url);}} }这里我先是加了一个截取参数的正则表达式GetQueryString(),可以获取对应参数的值。在下面我先截取判断a标签中的remove_newWare参数,判断它的值是否之前被添加过,如果没有,则替换;如果有则将新的值替换以前的值,这样就能保证最后remove_newWare的值只有一个。
二.多个下拉框
在实际运用中,我们还可能遇到,多个下拉框的情况,且第二个下拉框需要通过第一个下拉框的值确定,然后将第二个下拉框的值传给a标签。那么这种情况又该怎么实现呢?
思路:首先我们可以通过选择第一个下拉框中的值,将该值通过js获取,然后将获取的值通过ajax传递到servlet,通过方法查询到,相应第二个下拉框需要的值,然后通过json传到页面,然后将相应的值添加到select中,然后通过上面的方法,将值传递给对应的a标签。
但是在实际过程中,我又遇到了一个问题,就是我已经使用title和id,那么这里多了一个select,我又该怎么将编号的值给它呢,我想到了class,但是使用了class之后,我发现通过var sonselect参数并不能使用,于是我查了相关资料,知道了原来要是用class必须在后面加上对应的[],才能使用,因为class可能有多个,使用时需要知道它的准确位置。
jsp代码:
<c:forEach items="${pb.beanList }" var="product" varStatus="i"> <tr class="tableItem"><td>${product.product_id }</td><td>${product.product_name }</td><td>产品</td><td>${product.product_count }</td><td><span>${product.warehouse_id }</span><span>${product.shelf_id }</span></td><td> <select name="seles" title="${product.product_id }"><option>--请选择--</option><c:forEach items="${listWarehouse }" var="warehouseid"><option value="${warehouseid.warehouse_id }" id="${warehouseid.warehouse_id }">${warehouseid.warehouse_id }</option></c:forEach> </select> <select class="${product.product_id }" name="selesa"><option>--请选择--</option> </select></td><td>${rcount[i.count-1] }</td><td><a href="${ctx }/removes.do?method=editRemovesProduct&remove_newShelf=" id="${product.product_id }">确认</a></td> </tr></c:forEach>
下面是js代码:
var seles = document.getElementsByName("seles"); // 得到所有的select, 集合for(var i = 0;i < seles.length; i++) {seles[i].onchange = function() { var sonselect = document.getElementsByClassName(this.title);//确定子下拉框var index = this.selectedIndex; // 下拉框选中的索引var value = this.options[index].text; // 下拉框中值setWare(sonselect,value);var title = this.title;sonselect[0].onchange = function(){var submit = document.getElementById(title);var url = submit.href; // urlfunction GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");//构造一个含有目标参数的正则表达式对象 var r = url.substr(1).match(reg);//匹配目标参数 if(r!=null)return unescape(r[2]); return null;//返回参数值}var removeNew = GetQueryString("remove_newShelf");if(removeNew==null||removeNew==""){var index = this.selectedIndex; // 下拉框选中的索引var value = this.options[index].text; // 下拉框中值url = url.replace("&remove_newShelf=&", "&remove_newShelf="+value+"&");submit.setAttribute('href', url);}else{var index = this.selectedIndex; // 下拉框选中的索引var value = this.options[index].text; // 下拉框中值url = url.replace("&remove_newShelf="+removeNew+"&", "&remove_newShelf="+value+"&");submit.setAttribute('href', url);}}}}}function setWare(selectid,pid){ $.ajax({ type: "POST", url: "${ctx}/removes.do", data: "method=getShelfId&warehouse_id="+pid, async: false, success : function(msg) { for(var i = 0;i< msg.length;i++){//创建option元素节点var opEle = document.createElement("option");$(opEle).append("<option value='"+msg[i]+"'>"+msg[i]+"</option>");//将option元素节点追加到第二个下拉列表中去$(opEle).appendTo($(selectid));} }, dataType:"json" });}
Servlet方法中的代码,我就不贴了,大家对以上的内容有什么疑问可以和我交流讨论。
- 【知了堂学习笔记】利用js、ajax实现遍历行传参
- 【知了堂学习笔记】利用ajax实现web中的批量删除
- [知了堂学习笔记] jQuery Ajax
- [知了堂学习笔记] Ajax入门
- [知了堂学习笔记] 原生Ajax
- [知了堂学习笔记]_jQuery Ajax
- [知了堂学习笔记] 二叉树建立及其遍历的思路和实现
- [知了堂学习笔记]_ js和jquery方法区别
- 【知了堂学习笔记】JFreeChart
- [知了堂学习笔记]_JavaScript
- 【知了堂学习笔记】Nginx+Tomcat实现简单负载均衡
- 【知了堂学习笔记】myBatis实现增删查改
- [知了堂学习笔记] javascript DOM学习
- 【知了堂学习笔记】c3p0连接池
- 【知了堂学习笔记】正则表达式
- 【知了堂学习笔记】正则表达式
- 【知了堂学习笔记】正则表达式
- [知了堂学习笔记]_jQuery 事件参考手册
- 476. Number Complement 难度:简单
- ACM-ICPC2017北京网络赛(I) Minimum
- maven标签详解
- 安卓:文字阴影
- 主成分分析(Principal components analysis)-最大方差解释
- 【知了堂学习笔记】利用js、ajax实现遍历行传参
- 【转】时钟周期,机器周期,指令周期的区别
- 3D CNN
- DeepLearing学习笔记-Sigmoid函数的梯度
- java对象序列化
- Java中的数组
- 空气净化器十大品牌旗舰店带给你空气清新的室内环境
- 在win10里从源码编译nodejs的安装包和学习源码
- 面向对象编程-继承