如何在greasemonkey中对现有表进行排序?

时间:2011-01-10 23:48:15

标签: javascript sorting greasemonkey

我正在为一个带有表格的页面写一个greasemonkey user.js。 (表格是100行乘18列。)现在我要做的是让它在列上排序,并让它在Chrome和Firefox中运行。

到目前为止,所有搜索答案都会产生使用jquery / dojo或类似内容的建议。

我可以在没有任何外部代码的情况下完成吗?所有这只是以不同的顺序替换行的问题,对吧?或者这是一个愚蠢的说法?

问题是我已经在使用dojo来满足某些查询需求,但由于我希望它能够在Firefox和Chrome中运行,我只需在我的脚本中复制粘贴整个dojo的东西..

此外,到目前为止我发现的大多数解决方案似乎更适合在构建表时使用,而不是用于更改现有表。

感谢任何帮助。

编辑:表格中的所有单元格都包含数字。

2 个答案:

答案 0 :(得分:3)

聪明的方法是使用像tablesorter这样的工具 但是,既然你不想使用外部代码(现在),那就可以通过艰难的方式完成。

这是如何以半硬的方式做到这一点。请注意,我使用jQuery AM 。你很聪明地将至少包含在你的脚本中。

继续use the // @require directive。您仍然可以使用Tampermonkey extension在Chrome中运行GM脚本 (还有other ways of including jQuery in GM scripts under Chrome。)

无论如何,像这样的代码:会做的伎俩:

//--- Get the table we want to sort.
var jTableToSort    = $("table#myTable");

//--- Get the rows to sort, but skip the first row, since it contains column titles.
var jRowsToSort     = jTableToSort.find ("tr:gt(0)");

//--- Sort the rows in place.
jRowsToSort.sort (SortByFirstColumnTextAscending).appendTo (jTableToSort);

function SortByFirstColumnTextAscending (zA, zB)
{
     var ValA_Text  = $(zA).find ("td:eq(0)").text ();
     var ValB_Text  = $(zB).find ("td:eq(0)").text ();

     if      (ValA_Text  >  ValB_Text)
        return 1;
     else if (ValA_Text  <  ValB_Text)
        return -1;
     else
        return 0;
}


你可以see it in action at jsFiddle


更新

要对数字进行排序,您可以使用以下排序功能:

function SortBy2ndColumnNumber (zA, zB)
{
   var ValA = parseFloat ($(zA).find ("td:eq(1)").text () );
   var ValB = parseFloat ($(zB).find ("td:eq(1)").text () );

   return ValA - ValB;
}

<强> See number sorting in action at jsFiddle

答案 1 :(得分:2)

我试图不回答这些“我可以请一些代码吗”的问题,但是因为安德斯需要我。这是一个没有库的简单答案。但是有一些很大的假设:

  1. 只有要排序的列中的整数
  2. 仅对一列进行排序
  3. 没有分类状态的指示
  4. 没有IE,因为它无法执行Array.prototype.slice.call技巧。
  5. 你可以很好地改进getRowValue以超越假设#1。

    function sortTable(table, col) {
      var rows = Array.prototype.slice.call(table.getElementsByTagName('tr'), 0);
      rows.sort(function(a,b) {
        return getRowValue(a, col) - getRowValue(b, col);
      });
    
      for (var i=0, row; row = rows[i]; i++) {
        table.appendChild(row);
      }
    
      function getRowValue(row, col) {
        return parseInt(row.cells[col].innerHTML, 10);
      }
    }​
    

    DEMO: http://jsbin.com/akexe4