Вход

Просмотр полной версии : Инициализация в цикле


xmlns
17.06.2014, 14:29
Добрый день.
Есть объект:
var data = {
Dashes: ["dashes", true, function(tr)
{
var isValid = true, cells = tr.find("td");
cells.each(function() { if($(this).text() !== '—' && $(this).text() !== '') { return isValid = false; } });
return isValid;
}],
Matched: ["matched", true, function(tr)
{
var isValid = true, cells = tr.find("td"), text = cells.last().text();
cells.each(function() { if($(this).text() !== '' && ($(this).text() === '—' || $(this).text() !== text)) { return isValid = false; } });
return isValid;
}],
Mismatched: ["mismatched", true, function(tr)
{
var isValid = false, cells = tr.find("td"), text = cells.last().text();
cells.each(function() { if($(this).text() !== text && $(this).text() !== '') { isValid = true; return false; } });
return isValid;
}]
};

И есть код для инициализации в цикле:
for(var key in data)
{
$("body").on("click", "#clb-hide" + key, function()
{
if($("#clb-compareTable tbody tr").is(".clb-ct-" + data[key][0])) $("#clb-compareTable tbody tr.clb-ct-" + data[key][0]).hide();
else
{
$("#clb-compareTable tbody tr:not([class])").each(function()
{
if(data[key][2]($(this)))
$(this).addClass("clb-ct-" + data[key][0]).hide();
});
}
$("#clb-hide" + key).hide(0,function() { $("#clb-show" + key).show(); alert($("#clb-show" + key).attr("id")); });
isHidden = true;
return false;
});
$("body").on("click", "#clb-show" + key, function()
{
$("#clb-compareTable tbody tr.clb-ct-" + data[key][0]).show();
$("#clb-show" + key).hide(0,function() { $("#clb-hide" + key).show(); });
return false;
});
}
Сделано, чтобы не городить однотипный три раза. Смысл вроде ясен: на каждую из трех кнопок повесить СВОЙ обработчик, который выполнить некоторые действия, указанные для ДАННОЙ кнопки.

На самом деле получается какое-то гониво. Вместо того, чтобы выполнялось действие у данной нажатой кнопки, выполняется действие для последней кнопки (она у меня последняя в объекте data). Чтобы нужно сделать, чтобы инициализация в цикле была верной?
Или все-таки придется писать три однотипных кода?

рони
17.06.2014, 14:40
xmlns,
http://javascript.ru/basic/closure#primer-oshibochnogo-ispolzovaniya

xmlns
17.06.2014, 15:03
Это все замечательно, но я так и не понял, что у меня конкретно нужно поменять?
У по всякому пихал return function () {...}(key) - не получается.

xmlns
17.06.2014, 15:05
А такое не работает:
$("body").on("click", "#clb-hide" + key, function()
{
....
}(key));

рони
17.06.2014, 15:12
xmlns,
а так?
Object.keys(data).forEach(function (key) {


$("body").on("click", "#clb-hide" + key, function()
{
if($("#clb-compareTable tbody tr").is(".clb-ct-" + data[key][0])) $("#clb-compareTable tbody tr.clb-ct-" + data[key][0]).hide();
else
{
$("#clb-compareTable tbody tr:not([class])").each(function()
{
if(data[key][2]($(this)))
$(this).addClass("clb-ct-" + data[key][0]).hide();
});
}
$("#clb-hide" + key).hide(0,function() { $("#clb-show" + key).show(); alert($("#clb-show" + key).attr("id")); });
isHidden = true;
return false;
});
$("body").on("click", "#clb-show" + key, function()
{
$("#clb-compareTable tbody tr.clb-ct-" + data[key][0]).show();
$("#clb-show" + key).hide(0,function() { $("#clb-hide" + key).show(); });
return false;
});



});

xmlns
17.06.2014, 15:26
Ммм... магия))