[Ctrl+A 全選 注:如需引入外部Js需刷新才能執行] PS:閉包很難,很復雜! 經過以上文章可以得知,引起這個問題的原因其實是因為js的閉包難題。按照面向對象的JAVA語言的理解可以解釋為:js循環動態綁定帶參數函數中的參數,其實相當於java中的引用傳遞,而非值傳遞。傳遞進來的引用只相當於一個指針,指向的是一個內存地址,這個內存地址存放的才是具體的值,而外面的循環會不斷的修改這個存放地址中的值,所以最後循環結束之後,參數的值只能找到最後一個。 知道了原因就很好解決了。New一個新的“函數類”(姑且這麼稱呼吧)。測試OK。一下是修改後的代碼: 復制代碼 代碼如下: //在新增按鈕上綁定函數 document.getElementById("add").attachEvent("onclick",addFunction); var jc_count = 0;//定義需要改變第幾行的值 function txzmcFunction(x,y){//下拉框中綁定的函數 var sql="select txzjc from dm_txzmc where dm='"+x.value+"'";//取得下拉框中的代碼,通過ajax獲得相應的中文名稱 jc_count = y;//定義當前行是第幾行 ajaxSelect(sql,"txzjcFunction");//封裝的ajax函數 } function txzjcFunction(x){//接收封裝的ajax函數返回值,並賦值 document.getElementById("_subarea_hxax_clzjxxb_hxax_txzxxb_update_txzjc_"+jc_count).value=x; } function bb(dx,sz){//解決動態綁定閉包問題要用到函數 this.clickFunc=function(){ txzmcFunction(dx,sz);//調用相應的函數 } } function addFunction(){ //動態循環綁定 var count=document.getElementById("_subarea_hxax_clzjxxb_hxax_txzxxb_update_maxcount").value;//獲取最大的行數 for (var i=0;i<count ;i++ )//循環綁定 { var obj=document.getElementById("_subarea_hxax_clzjxxb_hxax_txzxxb_update_txzmc_" +i); var tp = new bb(obj,i);//解決閉包問題,new一個新的函數類 obj.onchange = tp.clickFunc; } } //顯示頁面時執行一次 addFunction();