Lab 02. Table Sorter

题目

在给定源代码:source-code.zip的基础上,完成Table sorter。

Table sorter包括JavaScript和一点CSS,能够让原始的html table变得可以分别按照各栏数据值,对各行排序。

效果

  1. 在表头任意一个栏目中点击一下,下面各行将按照此栏目值的升序排序
    1. 按照字符串比较来确定顺序
  2. 再次点击该栏目,变更为降序排序
  3. 点击其它栏目,则按其它栏目的值重新排序
  4. 注意,排序时,栏目奇偶行的背景色保持奇数白色、偶数浅灰色
未点击 点击 再击 点击其它

* 虽然上面例图中只显示了To-Do表格的变化,实际上Staff表格也是sortable的。

要求

  1. 不能改动原html,只能够添加js和css文件
  2. 不能使用任何类库,只能用原生DOM API
  3. JavaScript必须模块化,JS的调用入口,必须按照下面的图示:

    也就是说,JS中要完成makeAllTablesSortable(table-doms) 方法,该方法接受一组普通table DOM元素,将它们全部变成sortable

附加要求

学有余力的同学还可以尝试用这个makeAllTablesSortable,使其它网页的table变得sortable。具体做法是打开一个有table的网页,开启控制台,然后在控制台中执行你的makeAllTablesSortable方法,看看能否将tables变得sortable。

完成了附加要求的同学,请在提交的README中给出URL列表,说明可以变更的网页。

重点

  1. JavaScript基本语法
  2. 程序的模块化设计
  3. DOM
  4. DOM Event

高级提点:Object Oriented Programming

简单的css:

th {
    border: 1px solid #98A9EC;
    background-color: #031B7F;
    color: white;
    transition:background-color 1s;
}

th:hover {
    background-color: #A3B1FC;
}

td {
    border: 1px solid #7181BC;
    padding: 2px;
}

td, th {
    text-align: left;
    height: 20px;
    padding: 2px;
}

.alternate {
    background-color: #DDDDDD;
}

table {
    border:0;
    border-spacing:0;
  }

  #todo {
      width: 470px;
  }

 #staff  {
     width: 420px;
  }

.Ascending {
    background-image: url("ascend.png");
    background-position: right;
    background-repeat: no-repeat;
    background-color: #A3B1FC;
}

.Descending {
    background-image: url("descend.png");
    background-position: right;
    background-repeat: no-repeat;
    background-color: #A3B1FC;
}

js代码:

/*
    Author: ye jiaqi
    Time: 13 March 2015
*/

// making all tables sortable
window.onload = function() {
    var tables = getAllTables();
    makeAllTablesSortable(tables);
}

// to get all tables in the web page
function getAllTables() {
    return document.getElementsByTagName("table");
}

// make the tables sortable by clicking on the table head
function makeAllTablesSortable(tables) {
    for(var i = 0; i < tables.length; i ++) {
        // get all table heads for each table
        var table_heads = tables[i].getElementsByTagName("th");
        // ther is someone who do not use the "th" tag
        if (table_heads.len == 0) {
            table_heads = tables[i].rows[0];
        }

        // give each thead an id to clarify each colum
        for(var j = 0; j < table_heads.length; j++) {
            table_heads[j].setAttribute("id", j);
        }

        // for each click on the the head, make a response
        for(var j = 0; j < table_heads.length; j++) {
            // give another function
            table_heads[j].onclick = function() {
                // this.parentNode.parentNode.parentNode means the table
                sort(this.parentNode.parentNode.parentNode, this);
            }
        }
    }
}

function sort(table, head) {
    var to_sort = [];
    head_id = head.id;
    row_len = table.rows.length;
    // get the Sequence if whether the table colum is already sorted or not
    Sequence = head.getAttribute("class");

    // get each row for sorting
    for(var i = 1; i < row_len; i++) {
        to_sort[i] = table.rows[i];
    }

    // sort it
    to_sort.sort(compare(Sequence));

    // prevent reference error
    for(var i = 0; i < row_len-1; i++) {
        to_sort[i] = to_sort[i].innerHTML;
    }

    // change the rows
    for(var i = 0; i < row_len-1; i++) {
        table.rows[i+1].innerHTML = to_sort[i];
    }

    // set other soeted colum to be none
    for (var i = 0; i < table.rows[0].cells.length; i++) {
        table.rows[0].cells[i].setAttribute("class", "")
    }

    // set the Sequnce
    if(Sequence != "Ascending")
        head.setAttribute("class", "Ascending")
    else
        head.setAttribute("class", "Descending")

}

function compare(Sequence) {
    return function(row1,row2) {
        var value1 = row1.cells[head_id].innerHTML;
        var value2 = row2.cells[head_id].innerHTML;

        // use  diffrenet sorting method for different status

        if (value1 < value2) {
            return  (Sequence == "Ascending" ? 1 : -1);
        } else if (value1 > value2) {
            return  (Sequence == "Ascending" ? -1 : 1);
        } else  {
            return 0;
        }
    }
}

github:https://github.com/ghostbody/hw2-table-sorter

时间: 2024-10-24 22:03:06

Lab 02. Table Sorter的相关文章

Software Testing Techniques LAB 02: Selenium

1. Installing 1. Install firefox 38.5.1 2. Install SeleniumIDE    After installing, I set the view of toolbox, then we can see this 3. Install Selenium Client & WebDrive 4. Install Selenium Standalone Server 5. Installed Test After downloading we hav

【黑金教程笔记之003】【建模篇】【Lab 02 闪耀灯和流水灯】—笔记

(1)       扫描频率和闪耀频率? 模块: /**************************************** module name:flash_module function:flash a led at 10Hz by yf.x 2014-11-4 ***************/ module flash_module( CLK, RST_n, LED ); input CLK,RST_n; output LED; /************************

springmvc的简单使用以及ssm框架的整合

Spring web mvc是基于servlet的一个表现层框架 首先创建一个简单的web工程了解它的使用 web.xml的配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee&quo

mybatis的动态sql编写以及一对一关系查询和一对多的查询

创建mybatis数据库,运行以下sql语句 /* SQLyog Ultimate v8.32 MySQL - 5.5.27 : Database - mybatis ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @[email protected]@UNIQU

JavaScript实现表格排序

Table sorter包括JavaScript和一点CSS,能够让原始的html table变得可以分别按照各栏数据值,对各行排序. 效果 在表头任意一个栏目中点击一下,下面各行将按照此栏目值的升序排序 按照字符串比较来确定顺序 再次点击该栏目,变更为降序排序 点击其它栏目,则按其它栏目的值重新排序 注意,排序时,栏目奇偶行的背景色保持奇数白色.偶数浅灰色 要求 不能改动原html,只能够添加js和css文件 不能使用任何类库,只能用原生DOM API JavaScript必须模块化,JS的调

AWR Report 关键参数详细分析

WORKLOAD REPOSITORY report for DB Name DB Id Instance Inst num Startup Time Release RAC CALLDB 1251068085 calldb1 1 07-Dec-12 21:12 11.2.0.3.0 YES Host Name Platform CPUs Cores Sockets Memory (GB) calldb01 AIX-Based Systems (64-bit) 128 32   250.25  

SoYun社工库最新源码以及审计出的漏洞报告信息

本文作者:浅蓝 前段时间有人发过搜云的源码,都好长时间了. 这次我放出个最新的. 是在他换模板之前的源码.(现在的搜云后端基本没什么变化 换了个模板而已) 同时审计出来了一些漏洞.. 我里面的数据库配置信息等重要敏感信息换成了"马赛克" 以下附上审计出的漏洞 1.user.ph#sql注入 265行 $card = $_POST['card']; if ($_POST['card']) {     $sql = "select * from alipay where card

SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合

之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBatis框架的学习(六)——MyBatis整合Spring.本文我再来讲SpringMVC和MyBatis整合开发的方法,这样的话,Spring.MyBatis和SpringMVC三大框架的整合开发我们就学会了.这里我使用的Spring是Spring4.1.3这个版本(SpringMVC自然也是这个版本),MyBatis是MyBatis3.2.7这个版本. 为了更好的学习SpringMVC和MyBatis整合开发的方法

插件收集

JQuery插件库: http://plugins.jquery.com/全套UI:全球jQuery的UI框架集锦,有国产DWZ框架入选 http://www.4wei.cn/archives/1001093收集源于http://www.iteye.com/problems/85278JQuery:1. JQuery UI http://jqueryui.com/demos/2. DWZ富客户端框架 http://j-ui.com/3. Easy UI http://www.jeasyui.co