2012-04-14 66 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