1. 程式人生 > >【知了堂學習筆記】利用js、ajax實現遍歷行傳參

【知了堂學習筆記】利用js、ajax實現遍歷行傳參

在網頁中遍歷出來的每行都有一個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; // url
				var 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; // url
				function 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; // url
					function 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方法中的程式碼,我就不貼了,大家對以上的內容有什麼疑問可以和我交流討論。