2016-04-20 64 views
0

我有Javascript从Web API提取页面中的数据。为什么不是jQuery驱动的表格排序工作?

在部分伪代码,这就是:

for each page 
    ajax (url+pageid, function (result) 
    { 
     for each row of data 
      tbody_domnode .appendChild (create_row (row)); 

     sort_table (tbody_domnode, sort_func); 
    } 

function create_row (row) 
{ 
     var tr = document .createElement ('tr'); 
     tr .timestamp = row .timestamp;   // miliseconds in UNIX epoch 
     tr .title = tr .timestamp;    // for debugging 
     ... 
     return tr; 
} 

那多的作品很好,除了sort_table,这是代码,我已经适应从另一个问题在这里。我是jQuery的新手,所以有几个方面,我不明白。

在任何情况下,它都可以使用几乎可以使用,但通过将鼠标悬停在表格行上,某些时间戳(如标题元素所示)出现故障。这是完整的排序代码。

function sort_table_rows (tbody, sort_function) 
{ 
    var rows = $("tr", tbody); 

    rows .sort (sort_function); 

    rows .each (function (index, row) 
    { 
     $(rows) .append (row); 
    }); 
} 

function sort_func (a, b) 
{ 
    return a .timestamp - b .timestamp; 
} 

我是否正确使用jQuery函数对tbody_domnode中的tr节点进行排序?或者我应该寻找其他地方的错误?

+0

很多错码;很难知道从哪里开始。 :) jQuery对象(比如'rows'变量)在任何有用的意义上都不是真正的数组。所以像这样排序是不可行的。也许它有效,可能不会。然后接近结束时,当你想追加一个jQuery对象时,你可以追加整个事物,不需要循环。在jQuery中,jQuery对象是一个jQuery对象,无论它包含一个元素还是多个元素。但在这种情况下,你基本上是将行附加到自己的行列,这是疯狂的。 –

+0

哦....凯。谢谢。知道一个正确的做法的例子吗? – spraff

回答

0

今天大多数新代码都会使用AngularJs这样的数据绑定框架来保持代码更简单,甚至可以使用简单的templating解决方案。

如果您仅仅使用jQuery而不是尝试对html进行排序,那么仅仅使用数据并根据需要完全重新创建html会更简单。您可以使用.data('key', value)将数据附加到jQuery元素,其中值可以是任何对象或数组。

所以在开始时你可以做$(tbody_domnode).data('serverData', result)。然后,在需要时将数据使用排序功能排序,只要你想显示的结果完全取代TBODY内容:

function paintRows(tbody) 
{ 
    var $tbody = $(tbody); 
    $tbody.remove('tr'); 
    var data = $tbody.data('serverData'); 

    $.each(data, function(index, rowData) { 
    ...create and add the row to the tbody 
    }); 
}