Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Инициализация в цикле (https://javascript.ru/forum/jquery/48038-inicializaciya-v-cikle.html)

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#p...-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

Ммм... магия))


Часовой пояс GMT +3, время: 10:08.