2011-11-14 15 views
0

動態的Javascript onChange事件我有這個JavaScript片段:上選擇

var selectName["id1","id2","id3"]; 
setOnClickSelect = function (prefix, selectName) { 
     for(var i=0; i<selectName.length; i++) { 
      var selId = selectName[i]; 
      alert(selId); 
      $(selId).onchange = function() { 
       $(selId).value = $(selId).options[$(selId).selectedIndex].text; 
      } 
     } 
    } 

但是當我改變的價值我的ID1元素,警報寫給我總是「ID3」。 我可以修復它嗎?

編輯: 我已經改變了我的片段與這些語句:

setOnChangeSelect = function (prefix, selectName) { 
     for(var i=0; i<selectName.length; i++) { 
      var selId = selectName[i]; 
      $(selId).onchange = (function (thisId) { 
       return function() { 
        $(selId).value = $(thisId).options[$(thisId).selectedIndex].text; 
       } 
      })(selId); 
     } 
    } 

但selId總是最後一個元素。

+0

VAR selectName [ 「ID1」, 「ID2」, 「ID3」]; 只需更正 – Kris

+0

'onchange'回調函數內的selID將始終指向循環後的最後一個元素。我編輯的代碼是創建另一個範圍,以便在循環內用'thisId'維護'selId',並且可以在回調函數中返回。你試圖在這裏實現什麼? – steveyang

回答

0

這是由於行爲javaScript ClosureselId在循環結束時已設置爲selectName[2]而引起的,這就是爲什麼您返回'id3'的原因。

修正如下,關鍵是將回調函數封裝在另一個函數中以創建另一個閉包。

var selectName = ["id1","id2","id3"]; 

var setOnClickSelect = function (prefix, selectName) { 
     for(var i = 0; i < selectName.length; i++) { 
      var selId = selectName[i]; 
      $(selId).onchange = (function (thisId) { 
       return function() { 
       $(thisId).value = $(thisId).options[$(thisId).selectedIndex].text; 
       } 
      })(selId); 
     } 
    }; 

PS:有是var selectName["id1","id2","id3"] synyax錯誤,你應該使用var selectName = ["id1","id2","id3"];

+0

我已經回覆了你的主帖。 – CeccoCQ

+0

編輯後的代碼段仍然無法使用? – steveyang