【发布时间】:2012-01-06 01:42:43
【问题描述】:
在我的示例代码中,我有 2 个下拉列表(但在实际代码中,数字会有所不同,因为下拉列表是动态创建的)并且 我想要做的是计算有多少下拉列表被选择为非零值。我使用闭包来跟踪具有非零选定值的下拉列表的总数。我成功地做到了(参考http://jsfiddle.net/annelagang/scxNp/9/)。
旧/工作代码
$("select[id*='ComboBox']").each(
function() {
$(this).change(
function() {
compute(this);
});
});
var compute = (function () {
var total = 11;
var selectedDdl = [];
$("#total").text(total);
return function (ctrl) {
var id = $(ctrl).attr("id");
var ddlMeal = document.getElementById(id);
var found = jQuery.inArray(id, selectedDdl);
if (ddlMeal.options[ddlMeal.selectedIndex].value != 0){
if(found == -1){
total += 1;
selectedDdl.push(id);
}
else{
total = total;
}
}
else {
total -= 1;
var valueToRemove = id;
selectedDdl = $.grep(selectedDdl, function(val)
{ return val != valueToRemove; });
}
$("#total").text(total);
};
}());
注意: 我用 11 初始化了总变量,因为正如我在实际代码中提到的,我可以有超过 2 个下拉列表,我只是想测试我的代码是否可以处理超过 2 的值.
当我尝试在 .change() 事件中传输闭包时,它不再起作用(请参阅http://jsfiddle.net/annelagang/scxNp/12/)有人可以帮我解决这个问题吗?我已经做这个代码几天了,它变得非常令人沮丧。
新的/无效的代码:
$("select[id*='ComboBox']").each(
function() {
$(this).change(
function() {
(function () {
var total = 11;
var selectedDdl = [];
$("#total").text(total);
return function (ctrl) {
var id = $(ctrl).attr("id");
var ddlMeal = document.getElementById(id);
var found = jQuery.inArray(id, selectedDdl);
if (ddlMeal.options[ddlMeal.selectedIndex].value != 0){
if(found == -1){
total += 1;
selectedDdl.push(id);
}
else{
total = total;
}
}
else {
total -= 1;
var valueToRemove = id;
selectedDdl = $.grep(selectedDdl, function(val)
{ return val != valueToRemove; });
}
$("#total").text(total);
};
}());
});
});
提前致谢。
附:我也愿意接受不那么混乱的解决方案。
【问题讨论】:
-
在您的问题中发布相关代码会很有帮助。即使 jsfiddle 消失,它也能保持问题的相关性。
-
添加了代码。感谢您的建议。
标签: javascript jquery closures