Новые строки в табличной форме не будут уменьшаться

#javascript #jquery

#javascript #jquery

Вопрос:

Следующий код выполняется на странице, которая дает вам возможность добавлять и удалять строки из таблицы полей ввода. Это работает для существующих полей, но когда я добавляю новые строки и пытаюсь удалить их в порядке, требующем замены атрибутов ID и name, это не работает — это не заменит атрибуты ID и name. Есть идеи, что происходит?

Предполагается, что следующая функция уменьшит количество оставшихся строк после того, как текущая строка, которая будет удалена, была передана в цикле, и заменит число в атрибутах ID и name. Затем удалите строку.

  $("#tblData").delegate("button", "click", function()
       {

           var id1 = $(this).closest('tr').find('td input').attr('id');


           id1 = parseInt(id1.match(/d /));


         var count = 0;
         var ID;
         var name;
         var str;
         var str2;
         var n1, n2;
            $('#tblData > tbody > tr').each(function() {
              $(this).find('td').each(function(){
                    //do your stuff, you can use $(this) to get current cell

                    if ($(this).children().children().next().prop("tagName") == "INPUT")
                    {                            
                        if (count > id1){
                            // get id and name attributes
                            ID = $(this).children().children().next().attr("id");
                            name = $(this).children().children().next().attr("name");
                            // match number and replace number in ID
                            str=ID;
                            n1=parseInt(str.match(/d /));
                            n1 = n1-1;           
                            ID = ID.replace(/d /,n1);


                            // match number and replace number in name
                            str2=name;
                            n2=parseInt(str2.match(/d /));
                            n2 = n2-1;    
                            name = name.replace(/d /,n2);


                            $(this).children().children().next().attr("id",ID);
                            $(this).children().children().next().attr("name",name);
                        }                        
                    } else if ($(this).children().children().next().prop("tagName") == "SELECT") {

                        if (count > id1){
                            ID = $(this).children().children().next().attr("id");
                            name = $(this).children().children().next().attr("name");
                            // match number and replace number in ID
                            str=ID;
                            n1=parseInt(str.match(/d /));
                            n1 = n1-1;            
                            ID = ID.replace(/d /,n1);           

                            // match number and replace number in name
                            str2=name;
                            n2=parseInt(str2.match(/d /));
                            n2 = n2-1;      
                            name = name.replace(/d /,n2);

                            $(this).children().children().next().attr("id",ID);
                            $(this).children().children().next().attr("name",name);
                        }          
                    }
                });                                     
                count = count   1;

           });  

        $(this).closest('tr').remove();
       }
    );
  

Функция добавления строки

 function Add(){

var id = $( "#tblData tbody tr:last-child td input" ).attr('id');

id = parseInt(id.substring(12, 13))   1;

//alert(id);
    $("#tblData tbody").append(
            "<tr>" 
            "<td><label for='BookingRoom_Room_No'>Room  No</label><select single='single' size='1' name='BookingRoom[" id "][roomId]' id='BookingRoom_" id "_roomId'><option value='1'>1</option><option value='2'>2</option></select></td>" 
            "<td><label for='BookingRoom_startDate' class='required'>Start Date <span class='required'>*</span></label><input name='BookingRoom[" id "][startDate]' id='BookingRoom_" id "_startDate' type='text' /></td>" 
            "<td><label for='BookingRoom_endDate' class='required'>End Date <span class='required'>*</span></label><input name='BookingRoom[" id "][endDate]' id='BookingRoom_" id "_endDate' type='text'  /></td>" 
            "<td><label for='BookingRoom_adults' class='required'>Adults <span class='required'>*</span></label><select single='single' size='5' name='BookingRoom[" id "][adults]' id='BookingRoom_" id "_adults'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option><option value='5'>5</option></select></td>" 
            "<td><label for='BookingRoom_children' class='required'>Children <span class='required'>*</span></label><select single='single' size='5' name='BookingRoom[" id "][children]' id='BookingRoom_" id "_children'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option><option value='5'>5</option></select></td>" 
            "<td><button type='button'>Delete</button></td>" 
            "</tr>");

};
  

Ответ №1:

Не используйте delegate , используйте on вместо :

 $("#tblData").on("click", "button", function()
  

Кстати, вы предпочтете использовать символ двойной кавычки вместо символа одиночной кавычки для переноса атрибутов HTML.

И вы инкапсулируете слишком много времени this с помощью jquery в своей функции… рекомендуется никогда не вызывать дважды один и тот же элемент с помощью jquery, вместо этого сохраняйте его в переменной :

 var $that = $(this); // put a $ before your var to remember that it is a jquery element