日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

js循环动态绑定带参数函数遇到的问题及解决方案[转]

發(fā)布時(shí)間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js循环动态绑定带参数函数遇到的问题及解决方案[转] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天寫原生javascript時(shí),想利用綁定事件實(shí)現(xiàn)類似jquery中on方法的功能:于是有了for循環(huán)里綁定事件,無意中發(fā)現(xiàn)定義類能解決好多問題!

例如:一個(gè)不確定長(zhǎng)度的列表,在鼠標(biāo)經(jīng)過某一條的時(shí)候改變背景

 1  
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 3 <html xmlns="http://www.w3.org/1999/xhtml" > 
 4 <head> 
 5 <title>Untitled Page</title> 
 6 </head>  7 <body>  8 <ul id="list">  9 <li>第1條記錄</li> 10 <li>第2條記錄</li> 11 <li>第3條記錄</li> 12 <li>第4條記錄</li> 13 <li>第5條記錄</li> 14 <li>第6條記錄</li> 15 </ul> 16 <script type="text/javascript"> 17 var list_obj = document.getElementById("list").getElementsByTagName("li"); //獲取list下面的所有l(wèi)i的對(duì)象數(shù)組 18 for (var i = 0; i <= list_obj.length; i++) { 19 list_obj[i].onmouseover = function() { 20 this.style.backgroundColor = "#cdcdcd"; 21 } 22 list_obj[i].onmouseout = function() { 23 this.style.backgroundColor = "#FFFFFF"; 24 } 25 } 26 </script> 27 </body> 28 </html> 

繼續(xù):添加一個(gè)顯示“這是第幾條記錄”的功能

 1  
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 3 <html xmlns="http://www.w3.org/1999/xhtml" > 
 4 <head> 
 5 <title>Untitled Page</title> 
 6 </head>  7 <body>  8 <ul id="list">  9 <li>第1條記錄</li> 10 <li>第2條記錄</li> 11 <li>第3條記錄</li> 12 <li>第4條記錄</li> 13 <li>第5條記錄</li> 14 <li>第6條記錄</li> 15 </ul> 16 <script type="text/javascript"> 17 var list_obj = document.getElementById("list").getElementsByTagName("li"); //獲取list下面的所有l(wèi)i的對(duì)象數(shù)組 18 for (var i = 0; i <= list_obj.length; i++) { 19 list_obj[i].onmousemove = function() { 20 this.style.backgroundColor = "#cdcdcd"; 21 } 22 list_obj[i].onmouseout = function() { 23 this.style.backgroundColor = "#FFFFFF"; 24 } 25 list_obj[i].onclick = function() { 26 alert("這是第" + i + "記錄"); 27 } 28 } 29 </script> 30 </body> 31 </html> 

? ? ? 運(yùn)行后我們發(fā)現(xiàn),一直不論點(diǎn)擊哪個(gè)li都顯示“這是第6條記錄”。

? ? ??其實(shí)這里for循環(huán)已將整個(gè)列表循環(huán)了一遍,并執(zhí)行了i++,所以這里i變成了6。

? ? ??有什么好的辦法解決這個(gè)問題嗎? ?
  看看什么是閉包:
  閉包時(shí)是指內(nèi)層的函數(shù)可以引用存在與包圍他的函數(shù)內(nèi)的變量,即使外層的函數(shù)的執(zhí)行已經(jīng)終止。
  這個(gè)例子中我們可以這樣做:?

 1  
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 3 <html xmlns="http://www.w3.org/1999/xhtml" > 
 4 <head> 
 5 <title>Untitled Page</title> 
 6 </head>  7 <body>  8 <ul id="list">  9 <li>第1條記錄</li> 10 <li>第2條記錄</li> 11 <li>第3條記錄</li> 12 <li>第4條記錄</li> 13 <li>第5條記錄</li> 14 <li>第6條記錄</li> 15 </ul> 16 <script type="text/javascript"> 17 function tt(nob) { 18 this.clickFunc = function() { 19 alert("這是第" + (nob + 1) + "記錄"); 20 } 21 } 22 var list_obj = document.getElementById("list").getElementsByTagName("li"); //獲取list下面的所有l(wèi)i的對(duì)象數(shù)組 23 for (var i = 0; i <= list_obj.length; i++) { 24 list_obj[i].onmousemove = function() { 25 this.style.backgroundColor = "#cdcdcd"; 26 } 27 list_obj[i].onmouseout = function() { 28 this.style.backgroundColor = "#FFFFFF"; 29 } 30 var col = new tt(i); 31 list_obj[i].onclick = col.clickFunc; 32 } 33 </script> 34 </body> 35 </html> 

  經(jīng)過以上文章可以得知,引起這個(gè)問題的原因其實(shí)是因?yàn)閖s的閉包難題。按照面向?qū)ο蟮腏AVA語言的理解可以解釋為:js循環(huán)動(dòng)態(tài)綁定帶參數(shù)函 數(shù)中的參數(shù),其實(shí)相當(dāng)于java中的引用傳遞,而非值傳遞。傳遞進(jìn)來的引用只相當(dāng)于一個(gè)指針,指向的是一個(gè)內(nèi)存地址,這個(gè)內(nèi)存地址存放的才是具體的值,而 外面的循環(huán)會(huì)不斷的修改這個(gè)存放地址中的值,所以最后循環(huán)結(jié)束之后,參數(shù)的值只能找到最后一個(gè)。
知道了原因就很好解決了。New一個(gè)新的“函數(shù)類”(姑且這么稱呼吧)。測(cè)試OK。一下是修改后的代碼:

 1  
 2 //在新增按鈕上綁定函數(shù) 
 3 document.getElementById("add").attachEvent("onclick",addFunction);  4 var jc_count = 0;//定義需要改變第幾行的值  5 function txzmcFunction(x,y){//下拉框中綁定的函數(shù)  6 var sql="select txzjc from dm_txzmc where dm='"+x.value+"'";//取得下拉框中的代碼,通過ajax獲得相應(yīng)的中文名稱  7 jc_count = y;//定義當(dāng)前行是第幾行  8 ajaxSelect(sql,"txzjcFunction");//封裝的ajax函數(shù)  9 } 10 function txzjcFunction(x){//接收封裝的ajax函數(shù)返回值,并賦值 11 document.getElementById("_subarea_hxax_clzjxxb_hxax_txzxxb_update_txzjc_"+jc_count).value=x; 12 } 13 function bb(dx,sz){//解決動(dòng)態(tài)綁定閉包問題要用到函數(shù) 14 this.clickFunc=function(){ 15 txzmcFunction(dx,sz);//調(diào)用相應(yīng)的函數(shù) 16 } 17 } 18 function addFunction(){ //動(dòng)態(tài)循環(huán)綁定 19 var count=document.getElementById("_subarea_hxax_clzjxxb_hxax_txzxxb_update_maxcount").value;//獲取最大的行數(shù) 20 for (var i=0;i<count ;i++ )//循環(huán)綁定 21 { 22 var obj=document.getElementById("_subarea_hxax_clzjxxb_hxax_txzxxb_update_txzmc_" +i); 23 var tp = new bb(obj,i);//解決閉包問題,new一個(gè)新的函數(shù)類 24 obj.onchange = tp.clickFunc; 25 } 26 } 27 //顯示頁面時(shí)執(zhí)行一次 28 addFunction(); 

轉(zhuǎn)載于:https://www.cnblogs.com/zhhc/p/4704481.html

總結(jié)

以上是生活随笔為你收集整理的js循环动态绑定带参数函数遇到的问题及解决方案[转]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。