[转载]Java:Dom4j下载及使用教程

mikel阅读(1327)

[转载]Java:Dom4j下载及使用教程.

要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/
目前最新dom4j包下载地址:http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.zip

解开后有两个包,仅操作XML文档的话把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的话还需要加入包jaxen-1.1-beta-7.jar.

以下是相关操作:

一.Document对象相关

1.读取XML文件,获得document对象.
SAXReader reader = new SAXReader();
Document  document = reader.read(new File(“input.xml”));

2.解析XML形式的文本,得到document对象.
String text = “<members></members>”;
Document document = DocumentHelper.parseText(text);
3.主动创建document对象.
Document document = DocumentHelper.createDocument();
Element root = document.addElement(“members”);// 创建根节点
二.节点相关

1.获取文档的根节点.
Element rootElm = document.getRootElement();
2.取得某节点的单个子节点.
Element memberElm=root.element(“member”);// “member”是节点名
3.取得节点的文字
String text=memberElm.getText();
也可以用:
String text=root.elementText(“name”);这个是取得根节点下的name字节点的文字.

4.取得某节点下名为”member”的所有字节点并进行遍历.
List nodes = rootElm.elements(“member”);

for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
// do something
}
5.对某节点下的所有子节点进行遍历.
for(Iterator it=root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
// do something
}
6.在某节点下添加子节点.
Element ageElm = newMemberElm.addElement(“age”);
7.设置节点文字.
ageElm.setText(“29”);
8.删除某节点.
parentElm.remove(childElm);// childElm是待删除的节点,parentElm是其父节点
三.属性相关.
1.取得某节点下的某属性
Element root=document.getRootElement();
Attribute attribute=root.attribute(“size”);// 属性名name
2.取得属性的文字
String text=attribute.getText();
也可以用:
String text2=root.element(“name”).attributeValue(“firstname”);这个是取得根节点下name字节点的属性firstname的值.

3.遍历某节点的所有属性
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator();it.hasNext();){
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text);
}
4.设置某节点的属性和文字.
newMemberElm.addAttribute(“name”, “sitinspring”);
5.设置属性的文字
Attribute attribute=root.attribute(“name”);
attribute.setText(“sitinspring”);
6.删除某属性
Attribute attribute=root.attribute(“size”);// 属性名name
root.remove(attribute);
四.将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入的形式.
XMLWriter writer = new XMLWriter(new FileWriter(“output.xml”));
writer.write(document);
writer.close();
2.文档中含有中文,设置编码格式写入的形式.
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding(“GBK”);    // 指定XML编码
XMLWriter writer = new XMLWriter(new FileWriter(“output.xml”),format);

writer.write(document);
writer.close();
五.字符串与XML的转换
1.将字符串转化为XML
String text = “<members> <member>sitinspring</member> </members>”;
Document document = DocumentHelper.parseText(text);
2.将文档或节点的XML转化为字符串.
SAXReader reader = new SAXReader();
Document  document = reader.read(new File(“input.xml”));
Element root=document.getRootElement();
String docXmlText=document.asXML();
String rootXmlText=root.asXML();
Element memberElm=root.element(“member”);
String memberXmlText=memberElm.asXML();
六.使用XPath快速找到节点.
读取的XML文档示例
<?xml version=”1.0″ encoding=”UTF-8″?>
<projectDescription>
<name>MemberManagement</name>
<comment></comment>
<projects>
<project>PRJ1</project>
<project>PRJ2</project>
<project>PRJ3</project>
<project>PRJ4</project>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

使用XPath快速找到节点project.
public static void main(String[] args){
SAXReader reader = new SAXReader();

try{
Document  doc = reader.read(new File(“sample.xml”));

List projects=doc.selectNodes(“/projectDescription/projects/project”);

Iterator it=projects.iterator();

while(it.hasNext()){
Element elm=(Element)it.next();
System.out.println(elm.getText());
}

}
catch(Exception ex){
ex.printStackTrace();
}
}

[转载]18款适用于开发人员的网页代码编辑器

mikel阅读(1150)

[转载]18款适用于开发人员的网页代码编辑器_IT新闻_博客园.

本文介绍18款极具价值的网页代码编辑器。
1.Codeanywhere

clip_image002

Codeanywhere 是运行在浏览器上的代码编辑器,内嵌一个强大的FTP客户端。目前支持多数流行的网页格式(HTML、PHP、JavaScript、CSS和XML)。 Codeanywhere支持编辑多种类型的文件,集成了桌面编辑器中所有好的特征:高亮显示语法、自动填充代码、智能缩进、支持无限次的撤销和重做、无 数个tabs。
2.CodeRun Studio

clip_image003

CodeRun Studio提供了一个跨平台的集成开发环境。它帮助你在浏览器上轻松开发,调试,以及部署Web应用程序。你可以通过上传已有代码给好友共享的方式来测试它的功能。
3.Cloud9ide

clip_image004

Cloud9利用了云技术,运行在浏览器中,允许你随时随地运行、调试和部署应用程序。一个完整的game-changer会永久性的改变应用程序的开发方式。Cloud 9可以让你集中精力编程,不用顾及到搭建环境等琐事中。
4.Kodingen

clip_image005

Kodingen 是一种在线开发环境,在线代码编辑器,基于网页的代码编辑器。
5.Ecoder

clip_image006

Ecoder是基于网页的代码编辑器,它包含了一个文件浏览器、文件上传器、tabbed系统,支持同时编辑多个文件。这个web应用程序方便开发人员直接在线编辑代码,支持实时的语法高亮。
6.ShifEdit

clip_image007

ShifEdit提供了在线的集成开发环境,方便开发人员通过FTP、SFTP以及Dropbox来开发PHP、Ruby、Python、Perl、Java、HTML、CSS 以及JavaScript
7.Workspace

clip_image008

clip_image009

Workspace提供了在线的开发环境,方便管理基于网页的项目。它内嵌语法高亮编辑器,提供强大的编辑功能,支持在远程服务器端编辑文本,PHP、JavaScript、HTML、Java、Perl、SQL 等其它类型的文件。
8.JSFIDDLE

clip_image010

JSFIDDLE方便我们从HTML、CSS和JavaScript中编辑代码片段。支持在博客等平台上同其他人一起共享.
9.Ideone

clip_image011

Ideone是一个在线编译器和调试工具,允许我们在线编译和运行40多种编程语言。选择一种编程语言,输入源代码,在文本框中输入数据,选择是否运行代码,点击提交按钮,你就可以目睹代码的执行片段。
10.CSSDesk

clip_image013

CSSDesk是一个在线的HTML/CSS sandbox。输入你的HTML代码,调成CSS样式。你可以使用浏览器支持的任何一种HTML5或者CSS3标签。
11.Rendera

clip_image014

键入HTML代码,保持CSS样式。你可以使用浏览器中支持的任何一种HTML 5和CSS 3标签。
12.Drawter

clip_image015

Drawter是用JavaScript编写的工具,基于JQuery库。它可以运行在每个网页浏览器上,每个标签可以是绘制的一个层。
13.jsdo.

clip_image017

jsdo.是一个网站,你可以在浏览器中编写JavaScript、HTML5、CSS,并且支持共享。
14.Squad

clip_image019

Squad是一个基于网页的代码编辑器,你可以在任何地方访问它。
15.Ace

clip_image020

Ace是用JavaScript编写的独立代码编辑器,它内嵌在任何网页和JavaScript程序中,Ace是Cloud9 IDE上最主流的编辑器。
16.Amy Editor

clip_image021

Amy Editor是一款在线的源代码和文本编辑器。
17.Practicode

clip_image023

Practicode是一款在线的代码编辑器,方便你练习编写HTML、CSS、Javascript语言等等。
18.JS Bin

clip_image024

JS Bin是一个专门为JavaScript和CSS编程人员来测试片段代码,调试代码的工具。它方便你编辑,和测试JavaScript和HTML。
英文来源:http://www.queness.com/community-news/8390/18-useful-web-based-code-editors-for-developers

[转载]16篇重要的CSS页面打印技巧

mikel阅读(970)

[转载]16篇重要的CSS页面打印技巧_IT新闻_博客园.

很多人喜欢将网页中的重要信息打印出来,但是常常遇到这种情况,网页在浏览器中非常漂亮,打印出来却非常混乱,一些看起来引人注目和五彩缤纷的页面内容,打印出来却差强人意。作为网站设计者,也需要考虑页面对于打印机是否也同样友好。
之前为Web页面创建一个打印机友好的版本意味着要设计一个布局和格式都经过修改的单独页面,这样才能够在打印的时候获得令人满意的效果,而现在不需要这样做。
本文搜集了一些重要的CSS页面打印技巧,可以将打印页面变为打印机友好的版本。这将不仅节省纸张,同时也考虑了打印输出。
1. 打印样式表 – 权威指南

clip_image001

2. 优化你的网站结构以便打印

clip_image002

3. 友好打印使用CSS的图像和Logo

clip_image003

4. CSS技巧:最终获取打印样式表

clip_image004

5. 制作“打印本页”按钮

clip_image005

6. 创建友好打印页面的简单技巧

clip_image006

7. 打印表格

clip_image007

8. 打印样式表:基础知识

clip_image008

9. 7大打印样式表技巧

clip_image009

10. 10个打印样式表技巧

clip_image010

11. 如何制作打印机友好的网页

clip_image011

12. 让您的网站对打印机友好

clip_image012

13. 创建打印CSS样式表需知

clip_image013

14. 改进打印时的链接显示

clip_image014

15. CSS设计:即将打印

clip_image015

16. 完整的CSS打印手册

clip_image016

via http://slodive.com/web-development/css-print-page-tricks/

[原创]Delphi报表开发ReportMachine的小计和总计的计算

mikel阅读(1515)

最近在做一个Delphi的发货清单的打印程序,其中涉及到需要计算清单的小计和总计的功能,文字难以表达清楚,上图吧:

报表第一页的小计计算当前页面的商品价格总和,总计目前和小计一样是计算截止到当前页面的所有商品的金额和,下图为最后一页:

这下大家明白了吧,就是要实现这样的报表。

废话不多说了,开始讲解我的思路:

1.既然要计算小计,就是每页的金额和了,加入ReportMachine的计算文本框(TRMCalcMemoView),然后设置要汇总的字段值为数据字段“factSum”,然后选择计算文本框的属性面板中的“CalcOptions”选中“统计Brand”为要汇总的主项数据,统计类型为“合计(Sum)”,如图所示:

2.最难的部分就是总计的计算,这不能简单的用计算文本框就能解决的,于是不得不用ReportMachine的代码来处理,也就是在总计的文本框的OnBeforePrint事件中计算之前的小计文本框的值的和,然后赋值给总计文本框显示,先看下设计的报表:

红色文字为两项总计的文本框的Name属性值。下面是ReportMachine中自定义的OnBeforePrint事件函数代码如下:

unit Report;
var
   lValue,tValue: Double;//lValue=金额总计 tValue=税额总计

procedure Memo1_OnBeforePrint(Sender: TObject);
begin
    lValue:=lValue+CalcMemo1.CalcValue; //CalcMemo1为金额小计的文本框
    TRMMemoView(Sender).Memo.Text := lValue;
end;
procedure Memo40_OnBeforePrint(Sender: TObject);
begin
    tValue:=tValue+CalcMemo2.CalcValue;//CalcMemo2为税额小计的文本框
    TRMMemoView(Sender).Memo.Text := tValue;
end;

procedure Main;
begin
   Memo1.OnBeforePrint:= Memo1_OnBeforePrint; //指定金额总计的文本框的OnBeforePrint事件的处理函数
   Memo40.OnBeforePrint:= Memo40_OnBeforePrint;//指定税额总计的文本框的OnBeforePrint事件的处理函数
end;

end.

上面的代码先声明了两个事件函数用于计算两个累加的总计的值,然后赋值给相应的总计文本框;然后再Main中指定给总计文本框的事件,这样当打印总计之前先汇总赋值并打印。

[转载]擦亮自己的眼睛去看SQLServer之简单Insert

mikel阅读(916)

[转载]擦亮自己的眼睛去看SQLServer之简单Insert – 小军人 – 博客园.

本来是打算先写SQLServer历史的,不过感觉写那部分内容比较难还需要多查些资料。于是调整了下顺序写下简单的Insert语句。数据库结构还是采用上一篇的结构。具体查看上一篇文章擦亮自己的眼睛去看SQLServer之简单Select今天讨论的语句也比较简单,Insert语句。

一、Insert脚本

insert into Test([Name]) values(‘xiaojun’)

没什么好说的,因为想写这样的语句太简单。

二、 语句分析

这条语句到底发生了什么呢?假设读者已经知道了SQLServer整体架构或者已经阅读过这个系列第一篇文章。当这条语句被可靠的传递到关系引擎中后已经生成执行计划,并且开始被调度执行。接下来就发生了:

写事务日志: 数据修改事务中唯一一个总是需要写入磁盘的操作。并不是修改查询语句的清单,而是修改操作发生之后数据页面的具体变化。是由日志管理器完成。看到写入磁 盘,我们应该立刻联想到性能问题,因为这个操作是总是写入磁盘。如果一条语句的操作的数据很大的话,这个耗时是十分可怕的。举个例子:如果想知道这个差 距,你可以在百万或者千万的表中执行以下两条语句体会以下:truncate table  Test以及delete from Test。当然严谨的同学会说truncate是针对区操作,delete是针对页操作,truncate的锁消耗也比delete的锁消耗少。这些是会 导致truncate比delete快的原因。但是这些原因不是主要原因,主要原因就是这里说的写事务日志,delete是每次删除一行,并在事务日志中 为所删除的每行记录一项,而truncate是通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。既然事务日志会影响性能,为 什么还记录呢?主要解决保护数据以及数据一致性的问题。

接收写请求: 一旦访问方法接收到写事务日志成功的确认信息,就会接收写请求,将写请求发送缓存区管理器。注意了,这里是把请求交给缓存区管理器,缓存区管理器只是操作 缓存跟物理文件没有任何关系。这里强调的目的是,如果没有理解这里说的原理的话。你可能会为自己做了大量的插入操作,而数据文件的大小没有任何变化而感到 匪夷所思。访问方法表面上起了请求传递的作用,其实它很智能有一些比较复杂的算法来预测执行情况。

插入缓冲池:缓冲区管理器在内存中插入数据,插入成功后将确认结果发送给访问方法,最终确认结果到达客户端。

写入数据文件: 这个步骤可以由两个组件任何一个完成。惰性写入器线程定期检查SQLServer空闲缓冲列表的大小,当这个值过低的时候,惰性写入器会扫描整个数据缓 存,将所有一段时间没被使用的页面老化。如果找到一段时间没有被使用的脏页,惰性写入器则将其写入磁盘并且删除,然后将这个页面的内存空间标记为空闲空 间。惰性写入器还会监测服务器上的空闲物理内存,如果内存很少它会将SQLServer的空闲缓冲列表释放给windows,在SQLServer负载很 重时,它还会在服务器有空闲物理内存且已给SQLServer分配的内存还没有达到我们配置的最大服务器内存(max server memory)时增加SQLServer的空闲缓冲列表以适应负载。检查点是检查点线程创建的一个时间点,将保证脏页都写入磁盘,并且在页面头将缓存中的 这个页面标记为干净的页面注意检查点是不删除脏页的。至于检查点的执行时间是要分几种情况的:如果你配置了recovery interval(min),就以这个为准。如果没有配置,并且这上一次检查点结束后写入的事务日志数据超过10MB,则大约每分钟启动一致。还比如,我 们人为执行checkpoint执行,或者执行备份重启命令都会触发检查点。抛开我们人为操作,这个具体时间确实无法确定,SQLServer有内部启发 算法控制这个值。不过我们可以开启一个跟踪标志3502能查看。这个跟踪标志在错误日志中记录了检查点的开始与结束为止。sql语句为:dbcc traceon(3502)

三、结尾

今天主 要就是介绍了插入语句的执行过程,内容不多。你从这个过程中你会发现SQLServer真的很智能。比如这里的预写日志来保护数据,延迟将数据写入磁盘、 预测SQL执行情况、监控负载调整内存等等。设计的都是那么巧妙,大家可以想想如果我们在设计自己的软件时是否可以参考和借鉴呢?

今天分析就到此结束,文中如有描述不当的地方,欢迎指出。共同进步才是硬道理。

[转载]SQL Server表分区(一):基础知识和实现方式

mikel阅读(914)

[转载]SQL Server表分区(一):基础知识和实现方式 – James.H.Fu – 博客园.

1、什么是表分区?
SQL Server使用三种不同类型的文件存储数据,它们分别是.mdf、.ndf和.ldf。主要数据存储在
.mdf文件中,比如表,索引,存储过程等。.ndf文件也用于储存这些数据。.ldf文件用于存储操作日志。
表默认存储在.mdf文件中。更新表时SQL Server会对表锁。那么其它的操作必须等待正在更新操作完成。
如果一个表很大,那么无论是查询操作还是更新操作,性能都会很差。如果将表分别存储在物理上独立但逻辑上连续的
分区中,那么SQL Server可以大幅优化查询操作和更新操作的性能。

2、如何实现表分区?
1)确定分区策略,即划分数据的逻辑规则。比如将整形值小于100的数据放在一个分区上,将大于等于100的数据放在第二个
分区上,等等。
SQL Server中的使用分区函数来实现分区策略:

CREATE PARTITION FUNCTION PF_Order(DATETIME)
AS RANGE RIGHT FOR VALUES
('20090101','20100101','20110101')

2)确定分区存储架构,即划分数据的物理存储规则。最终分区可以存储在主文件组,即.mdf文件中,也可以存储在非主文件组,
即.ndf文件中。
SQL Server中的使用分区架构来实现分区存储架构:

CREATE PARTITION SCHEME PS_Order
AS PARTITION PF_Order
TO ([FG1],[FG2],[FG3],[FG4])

3)将表创建在分区存储架构上,并指定使用哪一列做为划分数据的依据。注意做为划分数据依据的列必须在聚集索引中
在更新数据时,SQL Server首先使用列的数据做为参数调用分区函数确定应该将该数据存储在哪个文件组(逻辑分区),
然后将数据写入文件组对应的物理文件中。

SQL Server中创建分区表:

CREATE TABLE dbo.[Order]
(
OrderID BIGINT IDENTITY(1,1),
OrderDate DATETIME NOT NULL,
CONSTRAINT PK_Order_OrderID_OrderDate PRIMARY KEY CLUSTERED(OrderID,OrderDate)
)
ON PS_Order(OrderDate)

下面是详细的示例代码:

--表分区测试代码
USE [master]
GO

--创建具有多个文件组的测试数据库
IF EXISTS(SELECT 1 FROM sys.databases WHERE [name]=N'TestTablePartitionDB')
BEGIN
    DROP DATABASE [TestTablePartitionDB]
END

CREATE DATABASE [TestTablePartitionDB]
ON PRIMARY
(
Name='PrimaryFG',
FileName='D:\Test\TablePartition\TestTablePartitionDB.mdf',
Size=5,
FileGrowth=1
),
FILEGROUP [FG1]
(
Name='FG1',
FileName='D:\Test\TablePartition\FG1.ndf',
Size=5,
FileGrowth=1
),
FILEGROUP [FG2]
(
Name='FG2',
FileName='D:\Test\TablePartition\FG2.ndf',
Size=5,
FileGrowth=1
),
FILEGROUP [FG3]
(
Name='FG3',
FileName='D:\Test\TablePartition\FG3.ndf',
Size=5,
FileGrowth=1
),
FILEGROUP [FG4]
(
Name='FG4',
FileName='D:\Test\TablePartition\FG4.ndf',
Size=5,
FileGrowth=1
)

USE TestTablePartitionDB
GO

--创建分区函数
CREATE PARTITION FUNCTION PF_Order(DATETIME)
AS RANGE LEFT FOR VALUES
('20090101','20100101','20110101')

--创建分区架构
CREATE PARTITION SCHEME PS_Order
AS PARTITION PF_Order
TO([FG1],[FG2],[FG3],[FG4])

--创建分区表
CREATE TABLE dbo.[Order]
(
OrderID BIGINT IDENTITY(1,1),
OrderDate DATETIME NOT NULL,
CONSTRAINT PK_Order_OrderID_OrderDate PRIMARY KEY CLUSTERED(OrderID,OrderDate)
)
ON PS_Order(OrderDate)

--测试数据的逻辑分区是哪个
SELECT $PARTITION.PF_Order('20090101')

--测试分区表的分区情况
SELECT partition_number,rows
FROM sys.partitions
WHERE [object_id]=object_id(N'dbo.[Order]')

--Drop index MyTable_IXC on MyTable with (Move To [Data Partition Scheme] (ID) )

[转载]八大Android土鳖设计

mikel阅读(925)

[转载]八大Android土鳖设计 | 优涩控.

Android诞生的那天起,这个可爱的小机器人凭借的开源的力量,硬是把iOS挤下市场占有率第一的宝座。虽然数字占优,但大众的心理中,iOS始终才是最佳体验的移动平台。

诚然,iOS成功的将界面做到了所见即所得的精简化,极致地把手机硬体键减少到一个,从而将用户可操作的范围项,控制在一个很小的空间内,有效降低 了用户的学习成本。但是,既然飘在外向出手三分诺维斯基依然可以与邓肯一样定义为这个世界上最优秀的大前锋,Android为什么不可以与iOS一样定义 为这个世界上最优秀的移动平台系统呢?

Android虽然存在多种硬体键设计,在可操作范围项,他控制得没有iOS那么精简,比如他可以在不同的界面中使用不同的Menu选项进行操作,比如一个应用可以同时跑多个进程和多个服务。但是,如果你能好好利用他,Android同样可以提供另外一种优秀的体验。

阿智写了一篇文章叫做《与其盲目抄袭,不如先研究彻底》,说的是国内缺乏对Android的研究,导致国产的Android应用整体质量不高。设计师们在Android上面大量的山寨了其他平台上的UI元素和设计方法,最终导致Android成为山寨大集合,用户体验的黑洞。这其中,不妨某些我们耳熟能详的产品。

这里所收集的,就是一些缺乏对Android深刻研究,照搬其他平台的UI元素,或者是土鳖的强奸用户的一些设计方法,写出这些的本意不是进行指责,而是希望让大家警醒。毕竟,山寨是我们都不想去做的事情。

1.返回在左上角

新浪微博,返回在左上角

在手机界面中有两种返回:返回上一个界面,返回上一层级的界面。Android应用里,界面上并不出现返回的按钮,而是统一通过硬体Back键完 成。因此无论怎样,在Android界面上出现任何的返回按钮(当然也包括生搬硬套iOS的返回按钮在左上角的这种形式),都是不正确且不合理的。

当然,也是存在例外的,比如在一个设置向导(Wizard)内。

向导中的返回出现在屏幕左下角

2.常驻通知栏

3G网络状态时刻常驻通知栏

在Android系统里,通知栏包含两类信息,Ongoing与Notifications(某些还包括快捷功能开关和程序运行的列表Rom不在此 讨论范围内)。他们的差异是,Notifications属于各种应用的新信息的通知,如新短信,新邮件等。他可以直接被清除,Ongoing则表示当前 正在运行的一些程序或者功能,且不可以直接被清除。

但是我们得留意的是,Ongoing上显示的应该是那些用户必须了解,且可能给用户使用手机带来影响的程序和功能,如正在播放音乐,正在通话中,正 在上传下载等。若你的应用无论是退出还是运行状态,对用户并不存在什么影响。那就完全不用通过常驻通知栏的方式告知用户,交给系统管理你的应用的进程 (Process)即好。

3.退出需要确认

新浪微博,退出需要确认

首先我们得理解Android界面的堆栈机制,如图所示,用户的每次操作活动(activity)都会保存起来,当使用Back键时,如系统会自动杀死之前的活动。

diagram_backstack

但若当前已经是在应用的根界面了,使用Back键,这个应用的进程的所有自动被挂起,后台服务除外。它并不消耗CPU资源,但会占一些内存。 Android与Java类似,系统有一个规则来回收内存,进行内存调度有个阀值,只有低于这个值系统才会从一个列表中,从后向前彻底关闭应用的进程。这 样设计的好处是,他能够方便用户在多任务切换时,最大限度的提高速度,因为进程只是被挂起而已。

从系统设计的角度上看,退出需要确认甚至说是一个流氓的行为。而从防止用户误操作的角度上看,这也是一个谬论。因为按Back键时,进程会被挂起, 用户并不存在信息损失等风险,即使是误操作,按照Android的堆栈机制,用户也可以非常轻松地恢复应用。你一定没见过iOS按Home键之后,给你来 个确认退出框吧?

4.检查更新设置

版本更新设置

我深刻理解开发者这么做的原因:Android系统中应用更新都由Market进行推送,而使用Market的前提是,手机绑定了Google帐 号。问题的关键在于,某些厂家的Android手机并不要求用户绑定Google帐号,他们自己甚至也推出应用商场,想分一杯羹。

这可苦了Android应用开发者,为了能够让不同的用户即时获取更新信息,他们不得不在自己的应用内增加检查更新功能,随即,就产生了检查更新的设置。

但是请各位开发者思考一下,您真的有必要给用户这个设置吗?你的应用真的可能每日都会更新吗?也许你只要设定一个默认的某周检查一次更新即好。

5.没有分享

找不到微信实在太可惜了

分享功能属于Android的一大特色,只需两个客户端支持,用户即可在任意两个本地的客户端中进行信息的分享,如把微博保存到本地的Evernote应用中,在图库中挑选一张图片通过WhatsApp发送给朋友。

Android的分享功能,能够任意地本地两个客户端,他能够更加高效的满足用户不同的任务流程。比如拍照分享,Android可以使用Camera 360拍照后设置各种滤镜,直接起本地任意微博客户端发送至微博。先拍照,再分享,也符合用户的操作习惯。

对比起来iOS则比较麻烦,要么开发者麻烦地把滤镜功能做到微博客户端中,要么用户麻烦地先拍照设置滤镜保存至图库,然后在发微博界面从图库中进行挑选。

Android的分享机制,反而能够有效的避免客户端功能膨胀,帮助开发者节省工作量的同时,也切合和用户多种使用场景。真正的实现了,让一个应用只解决用户一个问题的理念,这不得不说是iOS的笑话。

6.没有焦点状态

官方Gallery内的焦点状态

某些Android手机带有轨迹球等输入设备,用户可以滚动轨迹球定焦于界面的某个控件上。这能有效帮助某些触摸障碍的用户。更加重要的是,随着Android@Home的发布,Android系统将有可能出现在冰箱,洗衣机等家电设备上,并且是通过有五维导航键的方式进行控制,这就显得焦点状态变得额外重要了。

更加可以预见的一点是,Android目前还没有像iOS上的Voice Over那样,提供无障碍访问的解决方案,假设一旦提供了,轨迹球就能够给更多盲人用户带来更好的移动设备体验。

7.大量缓存图片

由某个应用在Gallery内产生的大量缓存图片

Android没有像iOS那样,彻底去除了文件的概念,所以,如果你的应用如果没有处理好缓存文件的话如图片,这些图片就大量的积压在系统的Gallery中,严重拖慢速度。对于这种问题,只需要把缓存图片改为Gallery无法识别的类型即好。

8.没有Move to SDcard

坑爹的Google Maps现在还不支持Move to SDcard

如果你的应用大小超过5M,如果不提供Move to SDcard功能就实在过意不去,因为毕竟还有大量的用户只有250M以下的机身内存空间。当然,Google的地图应用一直都还是霸占着多大12M的机身内存。

无论如何,Android是一个优秀的手机平台,我也像热爱iOS那样热爱着这个手机系统。我也时刻相信,虽然Android的开发成本过大,但只要正确理解其系统设计理念,Android的应用依然可以非常优秀。

[转载]程序员常犯的5个非技术性错误

mikel阅读(753)

[转载]程序员常犯的5个非技术性错误 – 职场博客 – 伯乐在线.

一个好的软件开发人员需要培养两种技能:技术技能和非技术技能。不幸的是一些开发者只注重技术的部分,以致养成一些陋习,下面是最常犯的5个非技术性错误:

0. 缺乏自律

Jim Rohn曾经说过:自律是目标和成果之间的桥梁。我一直认为,不论是成为一名软件开发人员,亦或是想在生活的其它任何领域取得成功,自律都是最珍贵的技能之一。事实上,很少有人兼具智慧和自律。

Steve Pavlina强调了自律的5个基本原则“……容忍(Acceptance)、毅力(Willpower)、努力(Hard Work)、勤勉(Industry)以及坚持不懈(Persistence)。将每一个单词的首字母提出,构成一个缩略词:鞭子(A WHIP)。这样更便于记忆,因为很多人总是把自律和鞭策自我联系在一起。……” 我力荐大家阅读Steve Pavlina写的关于自律的一系列文章

正如我以前的文章每天写出好代码的5个建议中解释的一样,对于自律,我的个人做法是每天遵循以下步骤

  • 将一天要做的事情列成清单。
  • 一次只做一件事。
  • 正确做事。
  • 不要半途而废。
  • 与其道歉,不如补救,而放弃最不可取。

1. 自我意识过甚

据我的经验,程序员有点自我意识过甚,但凡过于自我的人都很难意识到这点,以下几个指标可以帮助你认识到自己是否自我意识过甚。

  • 你认为自己是最棒的程序员。
  • 你抵触交流。
  • 你要求检查代码,是为了炫耀而不是为获得建设性的建议。

网上有很多关于程序员及其自我主义的文章,我在此推荐两篇,一篇是来自Mike Bernat的《无私的程序设计(Egoless programmin)》,另一篇是来自stackoverflow.com与此相关的讨论“你如何控制自大”。

2. 不善沟通交流

Woodrow Wilson说:“我若要说上十分钟,须花一个星期准备;若是十五分钟,需三天;若是半个小时,需两天;若是一个小时,我现在就能准备好。”

沟通是我们人类的主要活动。做一个优秀的交流者,这不容易,但就我们的职业而言,却是必不可少的技能。对于设计、代码、同行评估、文档编写、试着去说服别人自己的设计是最好的、编写代码等等,我们总在交流意见。

擅长沟通的人通常会像这样阐述事情:

  • 专注。他们只说需要理解的内容
  • 清晰。容易理解。
  • 简洁。增一分则太过,减一分则不足。

对成为一个更好的沟通者,我有两个建议:

  • 如果自认不是个好的沟通者,事先做好充分的准备直到达到集中、清晰、简洁的要求
  • 交谈之中,首先倾听,思考妥当后再说出自己的看法。

在我先前发布的文章《在开发团队中做出决定的七个最佳惯例》中,有更多关于提高交际能力的小窍门。

3. 忽略用户

“如果我们不关心用户,自有他人关心。”你在此的唯一原因就是服务用户,但有时候很容易忘记这一信条。我曾经所在的团队只注重于技术和平台,而不是令 用户满意。我们花费一个多月的时间创造一个构架,却未能给用户带来任何价值;到开始使用的时候,我们发现它完全不适应用户的需要。

4. 不能合理安排工作

开发者们总是为自己镀金,他们研究新的或更有趣的技术;做所有觉得更酷的工程处理方法。这样无疑妨碍到了项目,但我并不是说时不时投入到旁的活动中是 不正常的。诚然我们都需要分散注意力,但是你若发现自己老是处于前面所提到的状态,那么你有必要重新考虑自己优先处理工作的方式。我再次推荐你读每天写出好代码的5个建议这篇文章。

[原创]狗粮开发模式

mikel阅读(944)

最近在读《观止》里面又说道微软在开发NT操作系统的时候,开发最后采用了“吃自己做的狗粮”的开发方法,也就是在自己开发的NT操作系统上继续开发NT,同时修复使用中的Bug。

看到这儿突然冒出个想法,我们平时开发程序为什么不能采用这样的开发方式,现在的敏捷开发只不过是先出雏形,然后迭代的添加功能、交付功能给用户使用,为什么我们不能吃自己做的狗粮,然后迭代的开发程序呢?!

分析这种开发模式需要做的几点要求:

1、快速开发出基本功能:

先利用敏捷方式开发出一个原型,并定义一种脚本语言,这种脚本语言类似JavaScript、ActionScript

2、使用开发原型然后利用脚本语言进行接下来的开发功能

3、Bug管理系统的辅助

4、版本的控制管理

[转载]锁定表头和固定列(Fixed table head and columns)

mikel阅读(952)

[转载]锁定表头和固定列(Fixed table head and columns) – ☆磊☆ – 博客园.

前段时间需要这个功能,但是找了很多都不能完美的实现,不是只能锁定表头,就是浏览器兼容问题什么的,在此就自己做了一个锁定表头和列的js方法,依赖于JQuery

因为方法很简单,就未封装成插件的形式,仅仅以代码方式发布。这里把自己做的方式写出来,以资纪念。

支持IE6+,FF3.6+,Opera9+,Chrome9+

一、实现方式

这里的准备使用4个table实现,具体如下图:

image

上图红色部分为要取出来的部分,蓝色部分为拼接后可以看到的部分。最终结果如下图

image

实现后效果:

姓名 班级 成绩
主科 文科 理科 总分
语文 数学 英语 政治 历史 地理 物理 化学 生物
学生1 班级3 64 104 150 93 32 82 26 44 83 678
学生2 班级2 120 66 150 85 5 50 72 32 90 670
学生3 班级2 133 61 49 97 67 13 64 8 60 552
学生4 班级3 7 136 105 86 56 11 98 29 18 546
学生5 班级2 129 146 62 64 67 1 70 57 16 612
学生6 班级2 45 29 51 91 9 2 37 3 26 293
学生7 班级1 28 25 127 96 43 90 75 13 28 525
学生8 班级3 78 64 20 29 70 92 100 69 30 552
学生9 班级2 65 10 139 19 57 86 57 79 76 588
学生10 班级2 113 142 4 100 41 69 12 45 20 546
学生11 班级3 41 84 42 23 89 88 6 4 21 398
学生12 班级1 4 102 111 61 76 12 25 66 39 496
学生13 班级2 49 144 56 75 18 58 39 13 88 540
学生14 班级1 119 81 73 53 37 88 79 69 30 629
学生15 班级3 120 78 86 58 50 7 20 42 24 485
学生16 班级1 65 71 9 64 45 31 18 53 5 361
学生17 班级1 72 139 24 20 39 49 19 21 23 406
学生18 班级3 50 84 53 70 77 81 38 80 25 558
学生19 班级1 56 147 134 59 57 31 48 86 7 625
学生20 班级1 103 38 96 100 21 88 36 37 18 537
学生21 班级1 133 150 28 37 96 88 12 36 87 667
学生22 班级2 140 59 42 95 94 50 3 58 63 604
学生23 班级1 2 51 19 17 19 7 93 35 49 292
学生24 班级3 67 2 91 23 22 37 79 52 63 436
学生25 班级3 29 17 149 44 13 29 98 70 6 455
学生26 班级3 126 117 112 11 100 55 87 1 18 627
学生27 班级3 144 115 131 97 19 92 79 4 72 753
学生28 班级2 107 77 143 94 89 90 35 70 3 708
学生29 班级3 14 33 44 78 5 67 27 49 23 340
学生30 班级3 77 117 51 75 74 43 25 2 24 488
学生31 班级1 76 140 148 50 100 33 83 81 23 734
学生32 班级1 29 25 146 28 79 73 47 8 91 526
学生33 班级2 96 44 121 3 4 94 17 20 19 418
学生34 班级2 97 48 68 82 39 16 24 79 79 532
学生35 班级3 126 69 40 13 48 34 81 5 97 513
学生36 班级1 144 24 18 71 58 21 12 95 45 488
学生37 班级1 23 94 93 78 46 88 72 15 90 599
学生38 班级2 73 103 45 17 69 18 3 67 55 450
学生39 班级3 19 16 36 18 50 48 19 75 24 305
学生40 班级1 6 44 50 73 58 21 84 49 68 453
学生41 班级2 94 98 24 34 52 27 87 95 1 512
学生42 班级2 27 68 60 75 93 4 38 44 27 436
学生43 班级3 102 146 138 72 58 19 34 57 60 686
学生44 班级2 51 81 150 95 8 48 96 90 66 685
学生45 班级1 93 37 109 84 100 59 90 59 81 712
学生46 班级2 125 60 32 70 93 65 74 44 77 640
学生47 班级1 139 45 52 54 6 64 46 45 66 517
学生48 班级2 14 73 118 4 36 43 24 8 73 393
学生49 班级3 45 114 114 6 65 94 32 30 1 501
学生50 班级2 112 77 19 33 30 32 90 18 77 488
学生51 班级2 19 66 140 36 44 34 62 17 34 452
学生52 班级2 61 98 107 78 2 17 54 28 89 534
学生53 班级1 48 23 65 23 70 58 36 45 75 443
学生54 班级1 81 9 46 37 86 87 83 39 63 531
学生55 班级1 48 23 145 53 2 9 80 35 31 426
学生56 班级1 117 92 44 65 3 98 0 70 67 556
学生57 班级3 148 25 63 29 96 34 34 34 92 555
学生58 班级1 51 22 97 58 80 16 19 91 20 454
学生59 班级2 118 1 20 62 26 93 77 66 34 497
学生60 班级3 129 19 109 78 33 15 74 67 58 582
学生61 班级3 112 68 65 15 79 63 97 72 85 656
学生62 班级3 117 14 73 6 6 98 3 81 2 400
学生63 班级1 87 103 0 2 30 21 43 87 25 398
学生64 班级2 65 79 49 53 86 33 57 99 83 604
学生65 班级2 144 7 122 47 11 76 64 66 71 608
学生66 班级2 18 140 96 54 10 6 45 41 85 495
学生67 班级2 30 14 70 20 44 25 77 97 20 397
学生68 班级3 60 7 147 38 7 53 88 54 92 546
学生69 班级2 86 115 23 90 52 50 89 79 42 626
学生70 班级3 132 25 21 25 44 86 58 61 3 455
学生71 班级3 149 102 68 98 96 7 95 25 47 687
学生72 班级2 28 138 74 30 0 43 95 57 68 533
学生73 班级3 54 148 81 40 86 23 91 73 95 691
学生74 班级1 143 39 76 5 55 90 31 18 95 552
学生75 班级2 83 95 48 86 61 97 68 84 24 646
学生76 班级1 138 1 141 9 50 1 14 5 11 370
学生77 班级3 25 33 46 25 62 93 41 43 75 443
学生78 班级1 18 114 93 22 38 73 66 69 79 572
学生79 班级3 84 10 72 94 30 95 32 41 56 514
学生80 班级2 113 39 10 23 28 33 32 7 23 308
学生81 班级3 83 36 13 13 89 15 39 71 72 431
学生82 班级3 52 68 39 22 16 9 75 37 95 413
学生83 班级3 90 0 132 20 36 86 69 39 95 567
学生84 班级1 61 89 67 10 33 31 99 34 4 428
学生85 班级1 83 93 105 79 19 30 0 84 7 500
学生86 班级1 88 143 19 56 9 56 36 89 77 573
学生87 班级1 70 0 115 66 36 76 0 16 89 468
学生88 班级3 17 60 49 80 12 99 30 8 1 356
学生89 班级1 129 128 48 76 47 46 46 89 1 610
学生90 班级3 143 14 86 1 69 55 85 3 43 499
学生91 班级2 44 127 143 22 7 18 62 33 44 500
学生92 班级1 37 41 130 71 17 61 68 1 19 445
学生93 班级3 45 17 22 10 90 1 83 31 11 310
学生94 班级2 19 40 99 59 77 1 90 9 68 462
学生95 班级1 126 19 68 91 53 68 23 87 85 620
学生96 班级1 131 126 126 53 13 18 70 85 33 655
学生97 班级1 53 47 33 87 98 98 62 28 95 601
学生98 班级1 107 88 49 91 6 17 66 24 58 506
学生99 班级1 118 145 69 4 70 29 43 13 45 536
学生100 班级2 48 8 115 63 93 53 91 59 93 623
姓名 班级 成绩
主科 文科 理科 总分
语文 数学 英语 政治 历史 地理 物理 化学 生物
学生1 班级3 64 104 150 93 32 82 26 44 83 678
学生2 班级2 120 66 150 85 5 50 72 32 90 670
学生3 班级2 133 61 49 97 67 13 64 8 60 552
学生4 班级3 7 136 105 86 56 11 98 29 18 546
学生5 班级2 129 146 62 64 67 1 70 57 16 612
学生6 班级2 45 29 51 91 9 2 37 3 26 293
学生7 班级1 28 25 127 96 43 90 75 13 28 525
学生8 班级3 78 64 20 29 70 92 100 69 30 552
学生9 班级2 65 10 139 19 57 86 57 79 76 588
学生10 班级2 113 142 4 100 41 69 12 45 20 546
学生11 班级3 41 84 42 23 89 88 6 4 21 398
学生12 班级1 4 102 111 61 76 12 25 66 39 496
学生13 班级2 49 144 56 75 18 58 39 13 88 540
学生14 班级1 119 81 73 53 37 88 79 69 30 629
学生15 班级3 120 78 86 58 50 7 20 42 24 485
学生16 班级1 65 71 9 64 45 31 18 53 5 361
学生17 班级1 72 139 24 20 39 49 19 21 23 406
学生18 班级3 50 84 53 70 77 81 38 80 25 558
学生19 班级1 56 147 134 59 57 31 48 86 7 625
学生20 班级1 103 38 96 100 21 88 36 37 18 537
学生21 班级1 133 150 28 37 96 88 12 36 87 667
学生22 班级2 140 59 42 95 94 50 3 58 63 604
学生23 班级1 2 51 19 17 19 7 93 35 49 292
学生24 班级3 67 2 91 23 22 37 79 52 63 436
学生25 班级3 29 17 149 44 13 29 98 70 6 455
学生26 班级3 126 117 112 11 100 55 87 1 18 627
学生27 班级3 144 115 131 97 19 92 79 4 72 753
学生28 班级2 107 77 143 94 89 90 35 70 3 708
学生29 班级3 14 33 44 78 5 67 27 49 23 340
学生30 班级3 77 117 51 75 74 43 25 2 24 488
学生31 班级1 76 140 148 50 100 33 83 81 23 734
学生32 班级1 29 25 146 28 79 73 47 8 91 526
学生33 班级2 96 44 121 3 4 94 17 20 19 418
学生34 班级2 97 48 68 82 39 16 24 79 79 532
学生35 班级3 126 69 40 13 48 34 81 5 97 513
学生36 班级1 144 24 18 71 58 21 12 95 45 488
学生37 班级1 23 94 93 78 46 88 72 15 90 599
学生38 班级2 73 103 45 17 69 18 3 67 55 450
学生39 班级3 19 16 36 18 50 48 19 75 24 305
学生40 班级1 6 44 50 73 58 21 84 49 68 453
学生41 班级2 94 98 24 34 52 27 87 95 1 512
学生42 班级2 27 68 60 75 93 4 38 44 27 436
学生43 班级3 102 146 138 72 58 19 34 57 60 686
学生44 班级2 51 81 150 95 8 48 96 90 66 685
学生45 班级1 93 37 109 84 100 59 90 59 81 712
学生46 班级2 125 60 32 70 93 65 74 44 77 640
学生47 班级1 139 45 52 54 6 64 46 45 66 517
学生48 班级2 14 73 118 4 36 43 24 8 73 393
学生49 班级3 45 114 114 6 65 94 32 30 1 501
学生50 班级2 112 77 19 33 30 32 90 18 77 488
学生51 班级2 19 66 140 36 44 34 62 17 34 452
学生52 班级2 61 98 107 78 2 17 54 28 89 534
学生53 班级1 48 23 65 23 70 58 36 45 75 443
学生54 班级1 81 9 46 37 86 87 83 39 63 531
学生55 班级1 48 23 145 53 2 9 80 35 31 426
学生56 班级1 117 92 44 65 3 98 0 70 67 556
学生57 班级3 148 25 63 29 96 34 34 34 92 555
学生58 班级1 51 22 97 58 80 16 19 91 20 454
学生59 班级2 118 1 20 62 26 93 77 66 34 497
学生60 班级3 129 19 109 78 33 15 74 67 58 582
学生61 班级3 112 68 65 15 79 63 97 72 85 656
学生62 班级3 117 14 73 6 6 98 3 81 2 400
学生63 班级1 87 103 0 2 30 21 43 87 25 398
学生64 班级2 65 79 49 53 86 33 57 99 83 604
学生65 班级2 144 7 122 47 11 76 64 66 71 608
学生66 班级2 18 140 96 54 10 6 45 41 85 495
学生67 班级2 30 14 70 20 44 25 77 97 20 397
学生68 班级3 60 7 147 38 7 53 88 54 92 546
学生69 班级2 86 115 23 90 52 50 89 79 42 626
学生70 班级3 132 25 21 25 44 86 58 61 3 455
学生71 班级3 149 102 68 98 96 7 95 25 47 687
学生72 班级2 28 138 74 30 0 43 95 57 68 533
学生73 班级3 54 148 81 40 86 23 91 73 95 691
学生74 班级1 143 39 76 5 55 90 31 18 95 552
学生75 班级2 83 95 48 86 61 97 68 84 24 646
学生76 班级1 138 1 141 9 50 1 14 5 11 370
学生77 班级3 25 33 46 25 62 93 41 43 75 443
学生78 班级1 18 114 93 22 38 73 66 69 79 572
学生79 班级3 84 10 72 94 30 95 32 41 56 514
学生80 班级2 113 39 10 23 28 33 32 7 23 308
学生81 班级3 83 36 13 13 89 15 39 71 72 431
学生82 班级3 52 68 39 22 16 9 75 37 95 413
学生83 班级3 90 0 132 20 36 86 69 39 95 567
学生84 班级1 61 89 67 10 33 31 99 34 4 428
学生85 班级1 83 93 105 79 19 30 0 84 7 500
学生86 班级1 88 143 19 56 9 56 36 89 77 573
学生87 班级1 70 0 115 66 36 76 0 16 89 468
学生88 班级3 17 60 49 80 12 99 30 8 1 356
学生89 班级1 129 128 48 76 47 46 46 89 1 610
学生90 班级3 143 14 86 1 69 55 85 3 43 499
学生91 班级2 44 127 143 22 7 18 62 33 44 500
学生92 班级1 37 41 130 71 17 61 68 1 19 445
学生93 班级3 45 17 22 10 90 1 83 31 11 310
学生94 班级2 19 40 99 59 77 1 90 9 68 462
学生95 班级1 126 19 68 91 53 68 23 87 85 620
学生96 班级1 131 126 126 53 13 18 70 85 33 655
学生97 班级1 53 47 33 87 98 98 62 28 95 601
学生98 班级1 107 88 49 91 6 17 66 24 58 506
学生99 班级1 118 145 69 4 70 29 43 13 45 536
学生100 班级2 48 8 115 63 93 53 91 59 93 623
姓名 班级 成绩
主科 文科 理科 总分
语文 数学 英语 政治 历史 地理 物理 化学 生物
学生1 班级3 64 104 150 93 32 82 26 44 83 678
学生2 班级2 120 66 150 85 5 50 72 32 90 670
学生3 班级2 133 61 49 97 67 13 64 8 60 552
学生4 班级3 7 136 105 86 56 11 98 29 18 546
学生5 班级2 129 146 62 64 67 1 70 57 16 612
学生6 班级2 45 29 51 91 9 2 37 3 26 293
学生7 班级1 28 25 127 96 43 90 75 13 28 525
学生8 班级3 78 64 20 29 70 92 100 69 30 552
学生9 班级2 65 10 139 19 57 86 57 79 76 588
学生10 班级2 113 142 4 100 41 69 12 45 20 546
学生11 班级3 41 84 42 23 89 88 6 4 21 398
学生12 班级1 4 102 111 61 76 12 25 66 39 496
学生13 班级2 49 144 56 75 18 58 39 13 88 540
学生14 班级1 119 81 73 53 37 88 79 69 30 629
学生15 班级3 120 78 86 58 50 7 20 42 24 485
学生16 班级1 65 71 9 64 45 31 18 53 5 361
学生17 班级1 72 139 24 20 39 49 19 21 23 406
学生18 班级3 50 84 53 70 77 81 38 80 25 558
学生19 班级1 56 147 134 59 57 31 48 86 7 625
学生20 班级1 103 38 96 100 21 88 36 37 18 537
学生21 班级1 133 150 28 37 96 88 12 36 87 667
学生22 班级2 140 59 42 95 94 50 3 58 63 604
学生23 班级1 2 51 19 17 19 7 93 35 49 292
学生24 班级3 67 2 91 23 22 37 79 52 63 436
学生25 班级3 29 17 149 44 13 29 98 70 6 455
学生26 班级3 126 117 112 11 100 55 87 1 18 627
学生27 班级3 144 115 131 97 19 92 79 4 72 753
学生28 班级2 107 77 143 94 89 90 35 70 3 708
学生29 班级3 14 33 44 78 5 67 27 49 23 340
学生30 班级3 77 117 51 75 74 43 25 2 24 488
学生31 班级1 76 140 148 50 100 33 83 81 23 734
学生32 班级1 29 25 146 28 79 73 47 8 91 526
学生33 班级2 96 44 121 3 4 94 17 20 19 418
学生34 班级2 97 48 68 82 39 16 24 79 79 532
学生35 班级3 126 69 40 13 48 34 81 5 97 513
学生36 班级1 144 24 18 71 58 21 12 95 45 488
学生37 班级1 23 94 93 78 46 88 72 15 90 599
学生38 班级2 73 103 45 17 69 18 3 67 55 450
学生39 班级3 19 16 36 18 50 48 19 75 24 305
学生40 班级1 6 44 50 73 58 21 84 49 68 453
学生41 班级2 94 98 24 34 52 27 87 95 1 512
学生42 班级2 27 68 60 75 93 4 38 44 27 436
学生43 班级3 102 146 138 72 58 19 34 57 60 686
学生44 班级2 51 81 150 95 8 48 96 90 66 685
学生45 班级1 93 37 109 84 100 59 90 59 81 712
学生46 班级2 125 60 32 70 93 65 74 44 77 640
学生47 班级1 139 45 52 54 6 64 46 45 66 517
学生48 班级2 14 73 118 4 36 43 24 8 73 393
学生49 班级3 45 114 114 6 65 94 32 30 1 501
学生50 班级2 112 77 19 33 30 32 90 18 77 488
学生51 班级2 19 66 140 36 44 34 62 17 34 452
学生52 班级2 61 98 107 78 2 17 54 28 89 534
学生53 班级1 48 23 65 23 70 58 36 45 75 443
学生54 班级1 81 9 46 37 86 87 83 39 63 531
学生55 班级1 48 23 145 53 2 9 80 35 31 426
学生56 班级1 117 92 44 65 3 98 0 70 67 556
学生57 班级3 148 25 63 29 96 34 34 34 92 555
学生58 班级1 51 22 97 58 80 16 19 91 20 454
学生59 班级2 118 1 20 62 26 93 77 66 34 497
学生60 班级3 129 19 109 78 33 15 74 67 58 582
学生61 班级3 112 68 65 15 79 63 97 72 85 656
学生62 班级3 117 14 73 6 6 98 3 81 2 400
学生63 班级1 87 103 0 2 30 21 43 87 25 398
学生64 班级2 65 79 49 53 86 33 57 99 83 604
学生65 班级2 144 7 122 47 11 76 64 66 71 608
学生66 班级2 18 140 96 54 10 6 45 41 85 495
学生67 班级2 30 14 70 20 44 25 77 97 20 397
学生68 班级3 60 7 147 38 7 53 88 54 92 546
学生69 班级2 86 115 23 90 52 50 89 79 42 626
学生70 班级3 132 25 21 25 44 86 58 61 3 455
学生71 班级3 149 102 68 98 96 7 95 25 47 687
学生72 班级2 28 138 74 30 0 43 95 57 68 533
学生73 班级3 54 148 81 40 86 23 91 73 95 691
学生74 班级1 143 39 76 5 55 90 31 18 95 552
学生75 班级2 83 95 48 86 61 97 68 84 24 646
学生76 班级1 138 1 141 9 50 1 14 5 11 370
学生77 班级3 25 33 46 25 62 93 41 43 75 443
学生78 班级1 18 114 93 22 38 73 66 69 79 572
学生79 班级3 84 10 72 94 30 95 32 41 56 514
学生80 班级2 113 39 10 23 28 33 32 7 23 308
学生81 班级3 83 36 13 13 89 15 39 71 72 431
学生82 班级3 52 68 39 22 16 9 75 37 95 413
学生83 班级3 90 0 132 20 36 86 69 39 95 567
学生84 班级1 61 89 67 10 33 31 99 34 4 428
学生85 班级1 83 93 105 79 19 30 0 84 7 500
学生86 班级1 88 143 19 56 9 56 36 89 77 573
学生87 班级1 70 0 115 66 36 76 0 16 89 468
学生88 班级3 17 60 49 80 12 99 30 8 1 356
学生89 班级1 129 128 48 76 47 46 46 89 1 610
学生90 班级3 143 14 86 1 69 55 85 3 43 499
学生91 班级2 44 127 143 22 7 18 62 33 44 500
学生92 班级1 37 41 130 71 17 61 68 1 19 445
学生93 班级3 45 17 22 10 90 1 83 31 11 310
学生94 班级2 19 40 99 59 77 1 90 9 68 462
学生95 班级1 126 19 68 91 53 68 23 87 85 620
学生96 班级1 131 126 126 53 13 18 70 85 33 655
学生97 班级1 53 47 33 87 98 98 62 28 95 601
学生98 班级1 107 88 49 91 6 17 66 24 58 506
学生99 班级1 118 145 69 4 70 29 43 13 45 536
学生100 班级2 48 8 115 63 93 53 91 59 93 623
姓名 班级 成绩
主科 文科 理科 总分
语文 数学 英语 政治 历史 地理 物理 化学 生物
学生1 班级3 64 104 150 93 32 82 26 44 83 678
学生2 班级2 120 66 150 85 5 50 72 32 90 670
学生3 班级2 133 61 49 97 67 13 64 8 60 552
学生4 班级3 7 136 105 86 56 11 98 29 18 546
学生5 班级2 129 146 62 64 67 1 70 57 16 612
学生6 班级2 45 29 51 91 9 2 37 3 26 293
学生7 班级1 28 25 127 96 43 90 75 13 28 525
学生8 班级3 78 64 20 29 70 92 100 69 30 552
学生9 班级2 65 10 139 19 57 86 57 79 76 588
学生10 班级2 113 142 4 100 41 69 12 45 20 546
学生11 班级3 41 84 42 23 89 88 6 4 21 398
学生12 班级1 4 102 111 61 76 12 25 66 39 496
学生13 班级2 49 144 56 75 18 58 39 13 88 540
学生14 班级1 119 81 73 53 37 88 79 69 30 629
学生15 班级3 120 78 86 58 50 7 20 42 24 485
学生16 班级1 65 71 9 64 45 31 18 53 5 361
学生17 班级1 72 139 24 20 39 49 19 21 23 406
学生18 班级3 50 84 53 70 77 81 38 80 25 558
学生19 班级1 56 147 134 59 57 31 48 86 7 625
学生20 班级1 103 38 96 100 21 88 36 37 18 537
学生21 班级1 133 150 28 37 96 88 12 36 87 667
学生22 班级2 140 59 42 95 94 50 3 58 63 604
学生23 班级1 2 51 19 17 19 7 93 35 49 292
学生24 班级3 67 2 91 23 22 37 79 52 63 436
学生25 班级3 29 17 149 44 13 29 98 70 6 455
学生26 班级3 126 117 112 11 100 55 87 1 18 627
学生27 班级3 144 115 131 97 19 92 79 4 72 753
学生28 班级2 107 77 143 94 89 90 35 70 3 708
学生29 班级3 14 33 44 78 5 67 27 49 23 340
学生30 班级3 77 117 51 75 74 43 25 2 24 488
学生31 班级1 76 140 148 50 100 33 83 81 23 734
学生32 班级1 29 25 146 28 79 73 47 8 91 526
学生33 班级2 96 44 121 3 4 94 17 20 19 418
学生34 班级2 97 48 68 82 39 16 24 79 79 532
学生35 班级3 126 69 40 13 48 34 81 5 97 513
学生36 班级1 144 24 18 71 58 21 12 95 45 488
学生37 班级1 23 94 93 78 46 88 72 15 90 599
学生38 班级2 73 103 45 17 69 18 3 67 55 450
学生39 班级3 19 16 36 18 50 48 19 75 24 305
学生40 班级1 6 44 50 73 58 21 84 49 68 453
学生41 班级2 94 98 24 34 52 27 87 95 1 512
学生42 班级2 27 68 60 75 93 4 38 44 27 436
学生43 班级3 102 146 138 72 58 19 34 57 60 686
学生44 班级2 51 81 150 95 8 48 96 90 66 685
学生45 班级1 93 37 109 84 100 59 90 59 81 712
学生46 班级2 125 60 32 70 93 65 74 44 77 640
学生47 班级1 139 45 52 54 6 64 46 45 66 517
学生48 班级2 14 73 118 4 36 43 24 8 73 393
学生49 班级3 45 114 114 6 65 94 32 30 1 501
学生50 班级2 112 77 19 33 30 32 90 18 77 488
学生51 班级2 19 66 140 36 44 34 62 17 34 452
学生52 班级2 61 98 107 78 2 17 54 28 89 534
学生53 班级1 48 23 65 23 70 58 36 45 75 443
学生54 班级1 81 9 46 37 86 87 83 39 63 531
学生55 班级1 48 23 145 53 2 9 80 35 31 426
学生56 班级1 117 92 44 65 3 98 0 70 67 556
学生57 班级3 148 25 63 29 96 34 34 34 92 555
学生58 班级1 51 22 97 58 80 16 19 91 20 454
学生59 班级2 118 1 20 62 26 93 77 66 34 497
学生60 班级3 129 19 109 78 33 15 74 67 58 582
学生61 班级3 112 68 65 15 79 63 97 72 85 656
学生62 班级3 117 14 73 6 6 98 3 81 2 400
学生63 班级1 87 103 0 2 30 21 43 87 25 398
学生64 班级2 65 79 49 53 86 33 57 99 83 604
学生65 班级2 144 7 122 47 11 76 64 66 71 608
学生66 班级2 18 140 96 54 10 6 45 41 85 495
学生67 班级2 30 14 70 20 44 25 77 97 20 397
学生68 班级3 60 7 147 38 7 53 88 54 92 546
学生69 班级2 86 115 23 90 52 50 89 79 42 626
学生70 班级3 132 25 21 25 44 86 58 61 3 455
学生71 班级3 149 102 68 98 96 7 95 25 47 687
学生72 班级2 28 138 74 30 0 43 95 57 68 533
学生73 班级3 54 148 81 40 86 23 91 73 95 691
学生74 班级1 143 39 76 5 55 90 31 18 95 552
学生75 班级2 83 95 48 86 61 97 68 84 24 646
学生76 班级1 138 1 141 9 50 1 14 5 11 370
学生77 班级3 25 33 46 25 62 93 41 43 75 443
学生78 班级1 18 114 93 22 38 73 66 69 79 572
学生79 班级3 84 10 72 94 30 95 32 41 56 514
学生80 班级2 113 39 10 23 28 33 32 7 23 308
学生81 班级3 83 36 13 13 89 15 39 71 72 431
学生82 班级3 52 68 39 22 16 9 75 37 95 413
学生83 班级3 90 0 132 20 36 86 69 39 95 567
学生84 班级1 61 89 67 10 33 31 99 34 4 428
学生85 班级1 83 93 105 79 19 30 0 84 7 500
学生86 班级1 88 143 19 56 9 56 36 89 77 573
学生87 班级1 70 0 115 66 36 76 0 16 89 468
学生88 班级3 17 60 49 80 12 99 30 8 1 356
学生89 班级1 129 128 48 76 47 46 46 89 1 610
学生90 班级3 143 14 86 1 69 55 85 3 43 499
学生91 班级2 44 127 143 22 7 18 62 33 44 500
学生92 班级1 37 41 130 71 17 61 68 1 19 445
学生93 班级3 45 17 22 10 90 1 83 31 11 310
学生94 班级2 19 40 99 59 77 1 90 9 68 462
学生95 班级1 126 19 68 91 53 68 23 87 85 620
学生96 班级1 131 126 126 53 13 18 70 85 33 655
学生97 班级1 53 47 33 87 98 98 62 28 95 601
学生98 班级1 107 88 49 91 6 17 66 24 58 506
学生99 班级1 118 145 69 4 70 29 43 13 45 536
学生100 班级2 48 8 115 63 93 53 91 59 93 623

二、整体的框架

1、最下面的是原始的Table。

2、用左边的table覆盖在上层,命名为tableColumn。

3、用上部的table覆盖在更上层,命名为tableHead。

4、在左上角覆盖固定不动的table,命名为tableFix。

自然在各自的外层都要用div框起来,以便后面的浮动和覆盖等等,所以结构的html如下:

<div id="MyTable_tableLayout">
	<div id="MyTable_tableFix">
		<table id="MyTable_tableFixClone" border="1" cellspacing="0" cellpadding="0"></table>
	</div>
	<div id="MyTable_tableHead">
		<table id="MyTable_tableHeadClone" border="1" cellspacing="0" cellpadding="0"></table>
	</div>
	<div id="MyTable_tableColumn">
		<table id="MyTable_tableColumnClone" border="1" cellspacing="0" cellpadding="0"></table>
	</div>
	<div id="MyTable_tableData">
		<table id="MyTable" border="1" cellspacing="0" cellpadding="0"></table>
	</div>
</div>

三、代码实现

整体框架结构出来后,下面要做的就是确定每个区域的高度,宽度,定位就算完成了。

首先确定下调用接口,调用时已经有table了,我们希望很简单的一行js即可高定,就用了一个方法实现。由于使用项目中table线宽全部都是1,所以未考虑其他线宽问题。

function FixTable(TableID, FixColumnNumber, width, height)

第一个参数:table的ID,第二个参数:要锁定的列数目,第三个参数:显示的宽度,第四个参数:显示的高度。

(一)首先创建上面所诉的框架出来:

			if ($("#" + TableID + "_tableLayout").length != 0) {
				$("#" + TableID + "_tableLayout").before($("#" + TableID));
				$("#" + TableID + "_tableLayout").empty();
			}
			else {
				$("#" + TableID).after("<div id='" + TableID + "_tableLayout' style='overflow:hidden;height:" + height + "px; width:" + width + "px;'></div>");
			}
 
			$('<div id="' + TableID + '_tableFix"></div>'
			+ '<div id="' + TableID + '_tableHead"></div>'
			+ '<div id="' + TableID + '_tableColumn"></div>'
			+ '<div id="' + TableID + '_tableData"></div>').appendTo("#" + TableID + "_tableLayout");
 
 
			var oldtable = $("#" + TableID);
 
			var tableFixClone = oldtable.clone(true);
			tableFixClone.attr("id", TableID + "_tableFixClone");
			$("#" + TableID + "_tableFix").append(tableFixClone);
			var tableHeadClone = oldtable.clone(true);
			tableHeadClone.attr("id", TableID + "_tableHeadClone");
			$("#" + TableID + "_tableHead").append(tableHeadClone);
			var tableColumnClone = oldtable.clone(true);
			tableColumnClone.attr("id", TableID + "_tableColumnClone");
			$("#" + TableID + "_tableColumn").append(tableColumnClone);
			$("#" + TableID + "_tableData").append(oldtable);
 
			$("#" + TableID + "_tableLayout table").each(function () {
				$(this).css("margin", "0");
			});

(二)计算tableFix,tableHead的高度:

			var HeadHeight = $("#" + TableID + "_tableHead thead").height();
			HeadHeight += 2;
			$("#" + TableID + "_tableHead").css("height", HeadHeight);
			$("#" + TableID + "_tableFix").css("height", HeadHeight);

(三)计算tableFix,tableColumn的宽度:

			var ColumnsWidth = 0;
			var ColumnsNumber = 0;
			$("#" + TableID + "_tableColumn tr:last td:lt(" + FixColumnNumber + ")").each(function () {
				ColumnsWidth += $(this).outerWidth(true);
				ColumnsNumber++;
			});
			ColumnsWidth += 2;
			if ($.browser.msie) {
				switch ($.browser.version) {
					case "7.0":
						if (ColumnsNumber >= 3) ColumnsWidth--;
						break;
					case "8.0":
						if (ColumnsNumber >= 2) ColumnsWidth--;
						break;
				}
			}
			$("#" + TableID + "_tableColumn").css("width", ColumnsWidth);
			$("#" + TableID + "_tableFix").css("width", ColumnsWidth);

(四)为tableHead和tableColumn添加联动的滚动条事件:

			$("#" + TableID + "_tableData").scroll(function () {
				$("#" + TableID + "_tableHead").scrollLeft($("#" + TableID + "_tableData").scrollLeft());
				$("#" + TableID + "_tableColumn").scrollTop($("#" + TableID + "_tableData").scrollTop());
			});

(五)为整体添加样式,定位:

			$("#" + TableID + "_tableFix").css({ "overflow": "hidden", "position": "relative", "z-index": "50", "background-color": "Silver" });
			$("#" + TableID + "_tableHead").css({ "overflow": "hidden", "width": width - 17, "position": "relative", "z-index": "45", "background-color": "Silver" });
			$("#" + TableID + "_tableColumn").css({ "overflow": "hidden", "height": height - 17, "position": "relative", "z-index": "40", "background-color": "Silver" });
			$("#" + TableID + "_tableData").css({ "overflow": "scroll", "width": width, "height": height, "position": "relative", "z-index": "35" });
 
			$("#" + TableID + "_tableFix").offset($("#" + TableID + "_tableLayout").offset());
			$("#" + TableID + "_tableHead").offset($("#" + TableID + "_tableLayout").offset());
			$("#" + TableID + "_tableColumn").offset($("#" + TableID + "_tableLayout").offset());
			$("#" + TableID + "_tableData").offset($("#" + TableID + "_tableLayout").offset());

(六)为较小的table修正样式:

			if ($("#" + TableID + "_tableHead").width() > $("#" + TableID + "_tableFix table").width()) {
				$("#" + TableID + "_tableHead").css("width", $("#" + TableID + "_tableFix table").width());
				$("#" + TableID + "_tableData").css("width", $("#" + TableID + "_tableFix table").width() + 17);
			}
			if ($("#" + TableID + "_tableColumn").height() > $("#" + TableID + "_tableColumn table").height()) {
				$("#" + TableID + "_tableColumn").css("height", $("#" + TableID + "_tableColumn table").height());
				$("#" + TableID + "_tableData").css("height", $("#" + TableID + "_tableFix table").height() + 17);
			}

完整代码如下:

function FixTable(TableID, FixColumnNumber, width, height) {
	/// <summary>
	///     锁定表头和列
	///     <para> sorex.cnblogs.com </para>
	/// </summary>
	/// <param name="TableID" type="String">
	///     要锁定的Table的ID
	/// </param>
	/// <param name="FixColumnNumber" type="Number">
	///     要锁定列的个数
	/// </param>
	/// <param name="width" type="Number">
	///     显示的宽度
	/// </param>
	/// <param name="height" type="Number">
	///     显示的高度
	/// </param>
	if ($("#" + TableID + "_tableLayout").length != 0) {
		$("#" + TableID + "_tableLayout").before($("#" + TableID));
		$("#" + TableID + "_tableLayout").empty();
	}
	else {
		$("#" + TableID).after("<div id='" + TableID + "_tableLayout' style='overflow:hidden;height:" + height + "px; width:" + width + "px;'></div>");
	}

	$('<div id="' + TableID + '_tableFix"></div>'
	+ '<div id="' + TableID + '_tableHead"></div>'
	+ '<div id="' + TableID + '_tableColumn"></div>'
	+ '<div id="' + TableID + '_tableData"></div>').appendTo("#" + TableID + "_tableLayout");


	var oldtable = $("#" + TableID);

	var tableFixClone = oldtable.clone(true);
	tableFixClone.attr("id", TableID + "_tableFixClone");
	$("#" + TableID + "_tableFix").append(tableFixClone);
	var tableHeadClone = oldtable.clone(true);
	tableHeadClone.attr("id", TableID + "_tableHeadClone");
	$("#" + TableID + "_tableHead").append(tableHeadClone);
	var tableColumnClone = oldtable.clone(true);
	tableColumnClone.attr("id", TableID + "_tableColumnClone");
	$("#" + TableID + "_tableColumn").append(tableColumnClone);
	$("#" + TableID + "_tableData").append(oldtable);

	$("#" + TableID + "_tableLayout table").each(function () {
		$(this).css("margin", "0");
	});


	var HeadHeight = $("#" + TableID + "_tableHead thead").height();
	HeadHeight += 2;
	$("#" + TableID + "_tableHead").css("height", HeadHeight);
	$("#" + TableID + "_tableFix").css("height", HeadHeight);


	var ColumnsWidth = 0;
	var ColumnsNumber = 0;
	$("#" + TableID + "_tableColumn tr:last td:lt(" + FixColumnNumber + ")").each(function () {
		ColumnsWidth += $(this).outerWidth(true);
		ColumnsNumber++;
	});
	ColumnsWidth += 2;
	if ($.browser.msie) {
		switch ($.browser.version) {
			case "7.0":
				if (ColumnsNumber >= 3) ColumnsWidth--;
				break;
			case "8.0":
				if (ColumnsNumber >= 2) ColumnsWidth--;
				break;
		}
	}
	$("#" + TableID + "_tableColumn").css("width", ColumnsWidth);
	$("#" + TableID + "_tableFix").css("width", ColumnsWidth);


	$("#" + TableID + "_tableData").scroll(function () {
		$("#" + TableID + "_tableHead").scrollLeft($("#" + TableID + "_tableData").scrollLeft());
		$("#" + TableID + "_tableColumn").scrollTop($("#" + TableID + "_tableData").scrollTop());
	});

	$("#" + TableID + "_tableFix").css({ "overflow": "hidden", "position": "relative", "z-index": "50", "background-color": "Silver" });
	$("#" + TableID + "_tableHead").css({ "overflow": "hidden", "width": width - 17, "position": "relative", "z-index": "45", "background-color": "Silver" });
	$("#" + TableID + "_tableColumn").css({ "overflow": "hidden", "height": height - 17, "position": "relative", "z-index": "40", "background-color": "Silver" });
	$("#" + TableID + "_tableData").css({ "overflow": "scroll", "width": width, "height": height, "position": "relative", "z-index": "35" });

	$("#" + TableID + "_tableFix").offset($("#" + TableID + "_tableLayout").offset());
	$("#" + TableID + "_tableHead").offset($("#" + TableID + "_tableLayout").offset());
	$("#" + TableID + "_tableColumn").offset($("#" + TableID + "_tableLayout").offset());
	$("#" + TableID + "_tableData").offset($("#" + TableID + "_tableLayout").offset());

	if ($("#" + TableID + "_tableHead").width() > $("#" + TableID + "_tableFix table").width()) {
		$("#" + TableID + "_tableHead").css("width", $("#" + TableID + "_tableFix table").width());
		$("#" + TableID + "_tableData").css("width", $("#" + TableID + "_tableFix table").width() + 17);
	}
	if ($("#" + TableID + "_tableColumn").height() > $("#" + TableID + "_tableColumn table").height()) {
		$("#" + TableID + "_tableColumn").css("height", $("#" + TableID + "_tableColumn table").height());
		$("#" + TableID + "_tableData").css("height", $("#" + TableID + "_tableFix table").height() + 17);
	}
}