2012-04-14 67 views
0

我似乎無法弄清楚這一點。它的工作正常的第一部分爲循環,但然後該變種在內部點擊功能丟失,我評論它在哪裏打破...JavaScript傳遞變量到內部點擊功能不起作用

另外,可能有一個更清潔的方式來寫它開始:

$(function() { 
var a = "rgb(58,88,90)"; 
var b = "rgb(123,156,158)"; 
for (var c = 1; c <= 3; c++) { 
    if ($("#select" + c).is(":checked")) { 
     $("#select" + c + "-icon").css("background", a); 
     var d = document.getElementById("select" + c + "_title").innerHTML; 
     $("#Selection_" + c).val(d) 
    } else { 
     $("#select" + c + "-icon").css("background", b); 
     $("#Selection_" + c).val("Off") 
    } 
    $("#select" + c).click(function() { 
    // here's where it stops working... var c is no longer recognized... 
     if ($("#select" + c).is(":checked")) { 
     $("#select" + c + "-icon").css("background", a); 
     var d = document.getElementById("select" + c + "_title").innerHTML; 
     $("#Selection_" + c).val(d) 
    } else { 
     $("#select" + c + "-icon").css("background", b); 
     $("#Selection_" + c).val("Off") 
    } 
    }) 
} 
return false }); 

這裏是第一對對象的它的定位:

<label for="select1"><aside id="select1-icon" class="icon-form right rounded"><img src="../common/images/icon-viewDemo.png" /></aside> 
       <input type="checkbox" id="select1" name="select" checked="checked" class="view" /> <h5 id="select1_title">Watch Demo</h5></label> 

和:

<input type="hidden" id="Selection_1" name="Selection_1" value=""/> 
+0

你怎麼知道'c'是「不再被識別」?當你在那裏做「提醒(c)」時會發生什麼? – Marc 2012-04-14 15:12:52

+0

嘿,感謝您的快速響應!在.click(function())行之後,我收到了一個N​​ull響應。 – 2012-04-14 15:15:32

+0

其實,只是試了一遍,它提示「4」 – 2012-04-14 15:19:22

回答

2

您捕捉你的循環變量,所以當for循環結束,變量c的值是4,這是在執行時的功能看到價值。

var x; 
for (var c = 0; c <= 3; c++) { 
    x = function() { alert(c); }; 
} 
x(); 

這會因爲你叫x()時間提醒4,變量c的值爲4

如果你想捕獲c的值而不是變量本身,你可以給每個函數一個單獨的副本。爲了便於閱讀,我將處理程序分成了一個單獨的本地函數。

function createClickHandler(c) { 
    return function() { 
     if ($("#select" + c).is(":checked")) { 
      $("#select" + c + "-icon").css("background", a); 
      var d = document.getElementById("select" + c + "_title").innerHTML; 
      $("#Selection_" + c).val(d) 
     } else { 
      $("#select" + c + "-icon").css("background", b); 
      $("#Selection_" + c).val("Off") 
     } 
    } 
}; 
$("#select" + c).click(createClickHandler(c)); 

您可以瞭解更多關於這種現象on this Web pagethis earlier stackoverflow question

+0

謝謝,雷蒙德。這工作完美。我試了幾個小時才發現它沒有任何運氣,所以謝謝你的解釋。 – 2012-04-14 15:57:23

+0

那個鏈接也很棒!再次感謝。 – 2012-04-14 16:04:03

0

c在全局範圍內不存在,所以單擊時不存在。如果您將其設爲全局,則在點擊發生時,它不會具有您想要的值。所以使用eval();用它的字面值代替c,因此當點擊時,你有你想要的價值。

$(
    function() { 
     var a = "rgb(58,88,90)"; 
     var b = "rgb(123,156,158)"; 
     for (var c = 1; c <= 3; c++) { 
      if ($("#select" + c).is(":checked")) { 
       $("#select" + c + "-icon").css("background", a); 
       var d = document.getElementById("select" + c + "_title").innerHTML; 
       $("#Selection_" + c).val(d); 
      } else { 
       $("#select" + c + "-icon").css("background", b); 
       $("#Selection_" + c).val("Off"); 
      } 
      eval(
       '$("#select"' + c + ').click(function() {' + 
        'if ($("#select"' + c + ').is(":checked")) {' + 
         '$("#select"' + c + '"-icon").css("background", a);' + 
         'var d = document.getElementById("select"' + c + 
          '"_title").innerHTML;' + 
         '$("#Selection_"' + c + ').val(d)' + 
        '} else {' + 
         '$("#select"' + c + '"-icon").css("background", b);' + 
         '$("#Selection_"' + c + ').val("Off");' + 
        '}' + 
       '});' 
      ); 
     } 
     return false; 
    } 
); 
+0

'eval'是一個危險的功能,應該避免。它也混淆了編譯器優化。變量'c'確實存在;它被封鎖捕獲。它只是沒有你期望的價值。 – 2012-04-14 15:47:02

+0

謝謝。我不太熟悉eval來嘗試它:) – 2012-04-14 15:59:49