![](/img/trans.png)
[英]JavaScript closure triggers all inside the loop when registering OpenLayers event even with anonymous function or bind
[英]closure in loop:variable declared in loop not being properly presetting into handler function, when bind an event listener
我正在为自动化单元测试编写日志记录功能。
html元素结构:
<li>
<strong>
<ol>
<li>
<strong>
<ol>
我想在单击<strong>
(在相同<li>
下的<ol>
<li>
进行切换时创建它。
码:
for(var i = 0, l = logSuites.length; i < l; i++) {
var suite = logSuites[i];
$("#tests").append('<li><strong>....</strong></li>');
var suiteSl = $('#tests > li:nth-child(' + (i + 1) + ')');
var caseli = "<li>...</li>...";
...
suiteSl.append('<ol style="display:none">' + caseli + '</ol>');
var caseLiSl = suiteSl.children('ol');
var toggleCases = function() {
caseLiSl.toggle();
};
suiteSl.children('strong').bind('click', toggleCases);
}
问题是每次触发事件时,都会切换最后一个<ol>
。.函数toggleCases
的变量caseLiSl
始终是它在for
循环中的最后一次稳定时间for
这是一个更常见的问题。 我们在循环中使用闭包(持续或持续),它始终保留增量的最后一个值。
可以在以下问题中找到答案: JavaScript是否不支持使用局部变量的闭包?
我想你应该做
suiteSl.children('strong').bind('click', function(){
$(this).children('ol').toggle();
});
通过这种方式, this
变量引用了clicked元素,而您仅切换了它的直接<ol>
子元素
这又是循环问题中通常的闭合。
您可能应该阅读以下内容: http : //www.mennovanslooten.nl/blog/post/62
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.