如果动态更新表,则JQuery行选择器无法正常工作

时间:2016-05-18 08:08:39

标签: javascript jquery html

我有一个TB1表,有20行。前2行和后2行是其中的一种标题。现在通过一个AJAX调用,我将新表格作为具有相同结构的html。然后我从该html中删除前2行和后2行,然后将html插入到我的表TB1正好在第2行的上方。代码在我的AJAX调用函数中如下所示:

     var op = $(html);//html returned by AJAX call
        var tblData = op.find("#myTable > tbody");
        var $tblData = $(tblData );
        $tblData.find('tr:first').remove();//remove first 2 lines of headers from response
        $tblData.find('tr:first').remove();
        $tblData.find('tr:last').remove();//remove the last 2 headers rows
        $tblData.find('tr:last').remove();


       //add data just after the last data row
       $("#TB1 tr:nth-last-child(2)").before($tblData .html());
       $("#TB1 tr:last").remove(); //sometimes I need remove the last 1 header row on some condition

现在我的表-TB1有20个(旧行)+16个(删除标题后的新行)= 36行。 当我对TB1行进行长度检查时,它给出了36这是正确的。 但是当在JQuery中放入一些选择器来阅读nth-childnth-last-child时,它就无法正常工作。有时它不会返回新添加的行并且不返回任何内容。像nth-child(24)一样,除了nth-child(26)将返回第24个数字的行之外什么也不会给我。与nth-last-child相同。 因此,以某种方式动态添加和删除行会搞乱选择器。 处理这种情况的方法是什么?

2 个答案:

答案 0 :(得分:0)

尝试再次找到最后一行。

$("#TB1").find("tr:last").remove()

这完全取决于您在定义变量时所处的表的状态。

可能是你应该使用一个会返回最后一行的函数。

function getLastRowFromTable(talbe){
  return $(table).find("tr:last");
}

getLastRowFromTable('#TB1').remove();

这样你就可以获得当前的最后一行。

答案 1 :(得分:0)

你在这里遗漏了很多代码,这很难帮助你,但我可以假设你的问题可以通过在ajax调用上使用.done()函数轻松解决。

所以基本上是这样的:

  $.ajax({
   //WHATEVER YOUR AJAX CALL DOES TO RETURN THE HTML.
  }).done(function(html)){
 var op = html;//html returned by AJAX call
    var tblData = op.find("#myTable > tbody");
    var $tblData = $(tblData );
    $tblData.find('tr:first').remove();//remove first 2 lines of headers from response
    $tblData.find('tr:first').remove();
    $tblData.find('tr:last').remove();//remove the last 2 headers rows
    $tblData.find('tr:last').remove();


   //add data just after the last data row
   $("#TB1 tr:nth-last-child(2)").before($tblData .html());
   $("#TB1 tr:last").remove(); //sometimes I need remove the last 1 header row on some condition
 });

这应该确保只有在完成ajax函数返回数据后才会执行javascript(这可能是你的问题,因为ajax是异步的,因此你的浏览器不会等到它继续它继续它的假设做c: