首页 > 软件 > GetPtoolInfo_v1.5如何使用

GetPtoolInfo_v1.5如何使用

软件 2025-02-04

Windows的任务管理器

Windows2000/XP内含的任务管理器(Taskmgr)相信大家都熟悉吧,相比之下XP里的要比2000功能更加强大,返回的信息也更加的详细,不过您是否觉得还有很多希望获得的消息没有包含在里面吗?您是否觉得Windows的系统管理工具箱里的东西太分散了吗?下面就让我们看看它们的开发原理,并动手实现一个真正的任务管理器。现在我们是调用Win32API来实现这些功能的,但是大家都说MS隐藏了太多的细节,以后我们将讨论更多关于Windows内核的东东。
可能大家对任务管理器里最熟悉的功能要数进程管理了,常常我们在怀疑中了病毒/木马的时候都会看看任务管理器里有没有什么特别的进程在运行,所以进程查看器应该是一个非常重要的功能。我们除了需要获得进程的名称外,还有什么呢?当然包括它的进程标识符(ProcessID),用户信息(UserName),CPU使用时间(CPUTime)和存储器的使用情况(MemoryUsage),还有它的优先权(BasePriority)。
CPU和Memory信息可以帮助我们分析进程的运行情况,而优先权可以表示进程在CPU分配处理器使用时的优先情况。这些都是通用的进程信息,让我们再看看其他的信息吧。进程的父进程标识符(Parent Process ID),创建时间(Create Time),程序名称等在很多情况下也是我们关心的信息。我们再看看进程相关的性能信息。在Windows下通常有两种模式:内核模式(Kernel: Level 0)和用户模式(User: Level 3),进程往往在两种模式中来回切换,所以可以获得进程在内核模式和用户模式各自的使用时间。同时还包括进程相关的工作集(WorkingSet),分页池(PagedPool),非分页池(NonePagedPool)和页面文件(PageFile)信息。进程相关的I/O操作包括读/写/其他等动作,我们可以获得这些操作的次数和传送数据的数量。
如果您怀疑某个进程是木马,那您还想获得哪些信息呢?简单的进程名称应该是不够的吧!我们希望获得进程的实际程序的路径,这样可以帮助我们判断究竟是那个程序在运行。前段时间不是在讨论什么进程隐藏的,其中一种就是“创建远程线程”,而注体往往又是以动态链接库(DLL)的形式存在的,我们就希望看到某个具体进程所包含的所有模块(Module),常常是DLL也。“线程”是一个大家熟悉的名字,它是Windows系统中的实现体,而进程则是线程运行的环境。一个进程到底创建了多少线程了?我们同样可以枚举进程内部的所有线程信息。如果您发现一个木马进程,下面的动作就应该是分析它的运行机制(如果您对它感兴趣),不过最终您还是要将它结束吧。在Windows2k下,很多系统关键进程在TaskMgr里是不能被结束的,不过现在您不用担心了。好的,对进程的操作当然就包括结束进程。如果您用过中文的XP,您是否常常遇到任务栏“假死”的情况,虽然您的电脑没有挂掉,但却动弹不得,那好我们也同样可以将任意的进程挂起来,不管您对它做什么动作(除了结束),它都不会有任何的反应。有了挂起进程,同样我们也可以将进程从“挂起”状态激活哈。
桌面窗口是大家接触得最多的交互界面了,您是否想获得每个窗口的标题信息呢?当然我们还可以获得与窗口关联的进程,线程与窗口句柄属性。如果大家对VC比较熟悉,就应该知道其中的一个SPY++工具吧,它就可以获得桌面窗口,进程和线程的详细信息,不过现在就不用打开这个,打开那个了,通通搞定了! 系统性能是每个用户关心的话题。(友情提醒:开发者网络Windows开发专栏中还有大量技巧)它包括整个系统当前创建的句柄,进程以及线程的数目。还有物理存储器(Physical Memory)的总量和使用情况,系统高速缓存(System Cache)的大小,存储器保留与提交(Commit Charge)状况,当然还有核心分页/非分页池(Kernel Memory)的使用情况。几乎包括了Windows系统下存储器管理的大部分信息。
虽然现在硬盘的价格已经很低了,不过我还是在用6.4G的小东东,所以常常遇到“Low Disk”!我们常常要看看硬盘的使用情况,不过每次都要进入我的电脑,太麻烦了。而我们现在可以一次了解所有磁盘的容量和当前使用情况,同时还有它们的格式类型(如FAT,NTFS,CDFS等)和磁盘标签。
说到环境块,或许不是那么熟悉吧,它包含一些环境变量,而每个环境变量对应一个/多个字符串,您可以在控制面板的SYSTEM/Advanced(系统/高级)里对它们进行设置,包括添加新的环境变量,删除和编辑系统环境变量。
事件记录对我们分析系统的使用情况有很大的帮助。事件记录分为三种:应用程序,系统和安全。而对应的每种事件又可以分为几种类型,它们分别是常规信息,警告和错误。其中包括记录序号(Record Number),事件类型(Type),标识符(Event ID),来源(Source),产生时间(Time Generated),用户名(User)和相关描述信息(Description)。有时间大家可以多看看事件信息,当然每个网络管理员对它们应该是很熟悉的,不过还包括其他的事件日志信息。
Windows系统下的ipconfig /all这个命令我是常常用,因为我们使用的是DHCP,没事看看自己的IP地址变了没有。其中包括详细的网络适配器的信息,包括适配器名称,描述,硬件地址和类型,IP地址及相应的子网掩码,网关与DHCP服务器地址等。(友情提醒:开发者网络Windows开发专栏中还有大量技巧)不过您是否对网络流量也感兴趣呢?我们当然可以获得主机接受/发送了多少(非)广播数据报,出现了多少错误,一共接受/发送了多少信息,这些对每个网友都是有用的信息哟。
网络共享往往是大家注意的地方,您究竟共享了多少信息,它们的文件路径是什么,还有它们的共享类型信息。我们在不需要某些共享资料时,当然不要忘了将其删除,以免泄露自己的机密信息。
Windows的NT是一个多用户的系统,允许多种类型用户的存在。我们希望获得用户账号的使用期限(Password Expired),记住要不定时的修改用户的密码哟,以及用户标识符(User ID),组标识符(Group ID),还有用户账号的类型(Type),不同的类型有不同的权限,我们当然希望有最High的权力哟!看看系统对某个账号的磁盘空间使用情况是否有限制(Max Storage),账号登录的次数(Number Of Logon)和登录时间信息(Logon Hours)等,对我们分析用户的使用情况也有帮助的。
系统的Win32服务和设备驱动信息也是很重要的,我们希望探测每个服务/设备启动程序的具体路径,状态,类型,启动方式等等信息。我们还希望对服务进行控制,比如停止,启动和删除操作。大家可以参阅《浅析Windows2000/XP服务与后门技术》获得更多关于Win32服务的信息。
关机也不是那么的单调的,您可以注销自己的系统,如果您要离开当然就需要锁定了。最近大家都不喜欢关机,太麻烦了,所以都习惯使用冬眠,系统将会为我们保留当前信息,不过还有支持电源管理的关机和休眠。Windows2000的用户注意了,我们同样可以使用XP系统下的带有到记时与消息提示的关机和重启功能了。
系统的版本信息是比较固定的,主要包括操作系统的指纹,注册组织/用户,主机名和系统相关目录等信息。
说了这么多,我们也该谈谈如何实现了。
1.窗口信息
MS为我们提供了打开特定桌面和枚举桌面窗口的函数。
hDesk=OpenDesktop(lpszDesktop,0,FALSE,DESKTOP_ENUMERATE);
//打开我们默认的Default桌面;
EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowProc,0);
//枚举打开桌面上的所有窗口,由回调函数实现。
BOOL __stdcall EnumWindowProc(HWND, LPARAM);
//在回调函数中,我们可以获得窗口的标题和相关进程,线程信息;
GetWindowText(hWnd,szWindowText,dwMaxCount);
GetWindowThreadProcessId(hWnd,&dwPID);
2.设备驱动器信息(服务和设备驱动器差不多,在此不做重复)
设备驱动信息有服务控制管理器(SCM)来管理的,我要打开服务控制管理器,并枚举所有的设备驱动器。
OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
//以所有权限打开服务控制管理器;
EnumServicesStatus(schManager,dwDeviceType,dwDeviceState,
EnumStatus,dwBufSize,&dwBytesNeeded,
&dwDevicesReturned,&dwResumeHandle))
//枚举所有设备的当前状态;
CloseServiceHandle(schManager);
//记住,在结束访问后要关闭服务句柄;
OpenService(schManager,szDeviceName,SERVICE_ALL_ACCESS);
//打开特定的设备驱动器;
QueryServiceConfig(schDevice,lpDeviceConfig,
1024*8,&dwBytesNeeded);
//查询驱动器的服务配置信息;
QueryServiceStatus(schDevice,&DeviceStatus);
//查询设备驱动器的当前状态;(友情提醒:开发者网络Windows开发专栏中还有大量技巧)
QueryServiceConfig2(schDevice,SERVICE_CONFIG_DESCRIPTION,
(LPBYTE)lpDeviceDescription,8*1024,&dwBytesNeeded)
//查询设备的描述信息;
StartService(schDevice,0,NULL);
//启动设备;
ControlService(schDevice,SERVICE_CONTROL_STOP,&DeviceStatus);
//停止设备;
DeleteService(schDevice);
//删除设备;
3.磁盘信息
我们希望获得系统所有磁盘的信息,包括软盘,硬盘,光盘等等;
GetLogicalDriveStrings(dwBufferLength,lpBuffer);
//获得逻辑设备的信息;
GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer,
dwVolumeNameSize,&dwVolumeSerialNumber,
&dwMaximumComponentLength,&dwFileSystemFlags,
lpFileSystemNameBuffer,dwFileSystemNameSize);
//获得磁盘卷信息,包括卷名称和格式类型;(友情提醒:开发者网络Windows开发专栏中还有大量技巧)
GetDiskFreeSpaceEx(lpRootPathName,&FreeBytesAvailable,
&TotalNumberOfBytes,&TotalNumberOfFreeBytes);
//探测磁盘的空间使用情况;
4.环境变量
我们可以从注册表中获得环境块的信息:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment,当然要使用注册表的函数。
RegOpenKeyEx(HKEY_LOCAL_MACHINE,RegKey,0,KEY_QUERY_VALUE,&hKey);
//打开注册表的键;
RegEnumValue(hKey,dwIndex,EnvironVariable,
&dwVariableLength,NULL,NULL,NULL,NULL);
//查询我们需要的信息值;
GetEnvironmentVariable(EnvironVariable,EnvironString,1024);
//获得环境变量的字符串信息;
5.事件记录信息
OpenEventLog(NULL,szLog);
//打开时间日志记录;
GetOldestEventLogRecord(hEvent,&dwThisRecord);
//获得最新的日志信息,以便继续查找;
ReadEventLog(hEvent,EVENTLOG_FORWARDS_READ │ EVENTLOG_SEQUENTIAL_READ,
0,pEventLogRecord,1024*32,&dwRead,&dwNeeded)
//读去日志信息;
LookupAccountSid(NULL,pSid,szName,&dwName,szDomain,&dwDomain,&SNU);
//获取账户的SID,以便获得账户的用户名称;
GetNumberOfEventLogRecords(hEvent,&dwTotal);
//获得事件日志的总数;
CloseEventLog(hEvent);
//不要忘记关闭事件句柄;
6.网络共享
我们使用第二等级的网络共享搜索;
NetShareEnum(NULL,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&entriesread,&totalentries,&resume);
//列举所有的共享目录及相关信息;
NetApiBufferFree(pBuf);
//释放缓冲区;(友情提醒:开发者网络Windows开发专栏中还有大量技巧)
NetShareDel(NULL,(char *)lpShareNameW,0);
//删除网络共享目录;
7.网络适配器信息
我们要探测NIC的信息和网络流量;
GetAdaptersInfo(&AdapterInfo,&OutBufLen);
//获取适配器信息;
8.系统性能
获取系统的存储器使用情况;
GetPerformanceInfo(&PerfInfo,sizeof(PERFORMACE_INFORMATION))
//获取系统性能信息;
9.进程/线程/模块信息
在此我们使用工具帮助函数(ToolHelp32)和系统
OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY │ TOKEN_ADJUST_PRIVILEGES,&hToken);
//打开进程的令牌,提升权限;
AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
//将进程的权限提升到支持调试(Debug);
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//创建进程的快照;
Process32First(hProcessSnap,&ProcessEntry32);
Process32First(hProcessSnap,&ProcessEntry32);
//枚举所有进程;
OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,ProcessEntry32.th32ProcessID);
//打开特定进程,以查询进程相关信息;
GetProcessTimes(hProcess,&CreateTime,&ExitTime,&KernelTime,&UserTime);
//获取进程的时间信息;
GetProcessMemoryInfo(hProcess,&PMCounter,sizeof(PMCounter));
//获取进程的存储区信息;
GetPriorityClass(hProcess);
//获取进程的优先权;
GetProcessIoCounters(hProcess,&IoCounters);
//获取进程的IO使用情况;
CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
//创建模块快照;(友情提醒:开发者网络Windows开发专栏中还有大量技巧)
Module32First(hModuleSnap, &ModuleEntry32);
Module32Next(hModuleSnap, &ModuleEntry32);
//枚举进程模块信息;
CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
//创建线程快照;
Thread32First(hThreadSnap, &ThreadEntry32);
Thread32Next(hThreadSnap, &ThreadEntry32);
//枚举线程信息;
OpenThread(THREAD_ALL_ACCESS,FALSE,ThreadEntry32.th32ThreadID);
//打开线程,须自己获得此函数地址;
TerminateProcess(hProcess,0);
//终止进程;
SuspendThread(hThread);
//悬挂线程;
ResumeThread(hThread);
//激活线程;
10.关机
AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
//调整进程令牌,使其支持关机;
ExitWindowsEx(EWX_LOGOFF,0);
//注销系统;
LockWorkStation();
//锁定系统;
InitiateSystemShutdown(NULL,szMessage,dwTimeout,FALSE,bSig);
//支持到记时和消息显示的关机/重启;
SetSystemPowerState(bSig,FALSE);
//系统休眠/冬眠;
11.用户信息
NetUserEnum(NULL,dwLevel,FILTER_NORMAL_ACCOUNT,(LPBYTE*)&pBuf,
dwPrefMaxLen,&dwEntriesRead,&dwTotalEntries,&dwResumeHandle);
//枚举系统用户信息;
NetUserDel(NULL,lpUserNameW);
//删除指定用户;
12.系统版本信息
GetVersionEx((LPOSVERSIONINFO)&osviex);
//获取操作系统的版本信息;
我们也可以通过注册表(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion)获取相关信息:
GetTickCount();
//获取开机时间;
GetComputerName(szInfo,&dwInfo);
//获取计算机名称;
GetUserName(szInfo,&dwInfo);
//获取计算机用户名;
GetWindowsDirectory(szInfo,MAX_PATH+1);
//获取Windows目录;
GetSystemDirectory(szInfo,MAX_PATH+1);
//获取系统目录;
小结:
虽然我们现在已经实现了任务管理器的各项功能,甚至比Windows自带的功能还要强大,不过却没有什么兴奋的感觉。因为看看我们的代码,您就会发现那些都是直接调用的Win32API函数,但是我们清楚系统底层究竟是怎么实现的吗?不管我们是否只是为了实现一个功能,还是对操作系统感兴趣,我们都应该更多的对系统底层进行研究,而不仅仅是只会使用高层函数的程序员。虽然微软为我们隐藏了很多的内部细节,但正是这种底层的秘密激发了我们对其进行深入研究的兴趣和动力。

如何彻底解决手机MAC地址自动变更的问题?

手机MAC地址自动变更问题的解决方法
当你使用搭载MT6577芯片的手机时,可能会遇到WIFI连接时的NVRAM信号项警告,这源于手机硬件底层的NVRAM缺乏固定MAC地址,导致地址随机变化。这对依赖MAC地址过滤的用户来说是个问题,因为每次连接都会自动变更,无法进行精准筛选。
针对这个问题,有以下一种彻底解决手机MAC地址变化的步骤:
首先,确保你的电脑是Windows XP系统,因为Windows 7可能无法顺利进行。你需要从网盘下载名为SN_Write_tool_exe_v2.1212.0的软件及数据包,然后进行安装。安装完成后,运行SN_STATION程序,选择相应的数据库文件(如BPLGUInfoCustomAppSrcP_MT6577_S00_MAUI_11AMD_W12_22_SP_V5和APDB_MT6577_S01_ALPS.ICS2.6577.SP_)。
具体操作步骤如下:
1. 关闭手机,移除电池,等待3秒后重新装上。
2. 在SN_STATION软件中输入你想要的新MAC地址,不需要分隔符,如008065bacb12。
3. 输入完整地址后,用USB线连接手机。当出现驱动安装提示时,选择手动安装,指向解压目录下的驱动。
4. 遇到安装失败提示时,拔掉数据线和电池,等待3秒,重新输入MAC地址并确认。
5. 重启手机,当出现meta mode提示时,软件会显示写入成功。再次确认MAC地址,完成后拔掉USB。
6. 检查WIFI设置,确认MAC地址是否已变为新设置的地址。同样,IMEI也可以使用此方法修改,只需在Function Select中选择Write IMEI项。
通过以上步骤,理论上可以解决手机MAC地址变化问题。记得根据实际操作进行调整,希望这个方法对你有所帮助。

请问用哪款软件能检测出声卡的型号?

1、EVEREST Home 2.00.327 Beta(本人置顶推荐的检测软件)
说明:EVEREST(原名AIDA32)一个测试软硬件系统信息的工具,它可以详细的显示出PC每一个方面的信息。支持上千种(3400+)主板,支持上百种(360+)显卡,支持对并口/串口/USB这些PNP设备的检测,支持对各式各样的处理器的侦测。新版增加查看远程系统信息和管理,结果导出为HTML、XML功能。
官方主页:
http://www.lavalys.com
下载(3.02 MB):
http://ftp.pconline.com.cn/pub/download/200505/everesthome_build_0327.zip
2、DisplayX 1.0(一款显示器测试工具,尤其适合于LCD测试。)
说明:一个小巧、强悍的LCD/CRT测试软件,包括色彩、灰度、对比度、几何形状、呼吸效应(主要针对CRT)、聚焦(主要针对CRT)、交错(测试显示器抗干扰)、延时(主要针对LCD) 等等。
官方主页:
http://www.ioage.com/cn/displayx/index.htm
下载(18 KB):
http://ftp.pconline.com.cn/pub/download/200502/DisplayX.zip
3、Nokia Monitor Test 1.0.0.1 汉化版(经典的一款显示器测试工具)
说明:不少朋友买了显示器就直接接上去使用了,从未做过任何调试,也不知道自己的显示器是好是坏,现在我们可以用NOKIA Monitor Test这个程序来测试并调整你的显示器。这是一款Nokia公司出品的显示器测试软件,界面新颖、独特功能齐全。
官方主页:
http://www.nokia.com
下载(374 KB):
http://www.cccen.com/bbs/usr/30/30_1816.zip
4、CPU-Z(常用来检测CPU和内存)
说明:是一个监视 CPU 信息的软件,这些信息包括:CPU 名称、厂商;内核进程;内部和外部始终;局部时钟监测等。
官方主页:
http://www.cpuid.com/cpuz.php
下载1.28.4(238 KB):
http://file.mydrivers.com/tools/cpu/cpu-z-128.zip
下载1.28.2汉化版(238 KB):
http://ftp.pconline.com.cn/pub/download/200504/ha-CPUZ1282-sy.rar
5、WCPUID 3.3 Build 1092 汉化版
说明:除了检测 CPU 的普通 ID 信息、内/外部频率、倍频数等基本信息外,还可以检测出 CPU 是否支持 MMX、KNI 以及3Dnow!指令。
下载(178 KB):
http://ftp.pconline.com.cn/pub/download/200411/ha-wcpuid33b1092_sy.rar
6、AMD处理器识别工具 Central Brain Identifier 7.5.0.2 Build 0424 R2
说明:Central Braind Identifier 是一个免费的AMD处理器测试辨别工具包,程序采用直观的界面,为你提供所有的AMD处理器相关资讯,支持所有版本的AMD处理器!
下载(277 KB):
http://cbid.amdclub.ru/files/cbid75b.zip
7、Hot CPU Tester Pro 4.22
说明:CPU好不好,一试就知道。Hot CPU Tester是系统稳定度的测试工具,找出超频或是有缺点的CPU,对于喜爱超频的使用者来说,尤其可以使用这套软件看看超频后的系统是否稳定。
下载(1.62 MB):
http://ftp.pconline.com.cn/pub/download/200409/hotcpu422.exe
Hot CPU Tester 4.0.0.578 汉化版
下载(1.57 MB):
http://ehomenet.onlinedown.net/down/HA-REG_HotCPUTesterPro400578-wy.rar
Name: Donna Enderle
S/N: HCTPRO4001-517Q-19Y5-10R8-W096-EKLQ
8、superπ 1.2 汉化版(测试CPU)
说明:Super PI是利用CPU的浮点运算能力来计算出π(圆周率),所以目前普遍被超频玩家用做测试系统稳定性和测试CPU计算完后特定位数圆周率所需的时间。
下载 V1.2 汉化版(115 KB):
http://ftp.pconline.com.cn/pub/download/superpi.exe
下载 Super π Mod! V1.1 汉化版(121 KB):
http://xjrx-http.skycn.com:8181/down/ha_superpimod.zip
9、Prime95 2.38 汉化版(测试CPU)
说明:prime95是寻找梅森最大质数分布运算的客户端软件,也是一个专用测试系统稳定的软件,在所有的拷机软件中,Prime95是公认的最残酷的一款。
官方主页:
http://www.mersenne.org/freesoft.htm
中国分布式计算总站:
http://www.equn.com/
使用方法:
http://equn.com/info/pp01.htm
下载(693 KB):
http://ftp.pconline.com.cn/pub/download/200412/ha-prime95.rar
10、3DMark系列(测试显卡)
说明:自1998年发布第一款3DMARK图形测试软件至今,3DMARK已经逐渐成长为一款最为普及的3D图形卡性能基准测试软件。由于3DMark05提供了对微软DirectX 9.0C的支持,所以完全支持Shader Model 2a、2b、3.同时加入的更加详细显示控制面板,可以使用户对测试进行更为详细的画面控制。3DMark05还使用了全新的更为类似游戏的3D引擎,使测试更接近于正常的游戏运行。它包含了三个全新的测试场景,分别为:Return to Proxycon、Firefly Forest、Canyon Flight,通过这三个场景的测试便可以得出分数。另外,3DMark05还包含了CPU Test、Fill Rate Test、Single Texturing、Multi Texturing、Pixel Shader Test、Vertex Shader Test和创新的Batch Size Tests。运行3DMark05入门级的平台需要一块中端的DX9显示卡和2.0Ghz的处理器,而主流平台则需要一块第二代的DX9显示卡和3.0GHz以上处理器。最后需要注意的是,由于3DMARK05完全基于DX9架构,使用DX8显卡的朋友这次就无缘欣赏3DMARK05激动人心的新画面了。
官方主页:
http://www.futuremark.com/
下载页面:3DMark05
http://www.ttdown.com/SoftView/SoftView_4572.html
3DMark03
http://www.ttdown.com/SoftView/SoftView_18437.html
3DMark01SE
http://www.ttdown.com/SoftView/SoftView_17098.html
11、AquaMark3 3.00 英文正式版(测试显卡)
说明:AquaMark3是世界上第一款同时提供真实DirectX9游戏引擎和免费在线数据库AquaMark Result Comparator ARC的商用测试软件。它基于Massive Development的多平台krass?引擎。该引擎被AquaMark2.3、AquaNox、AquaNox2: Revelation以及未来的战略游戏Spellforce等众多游戏所采用。
AquaMark3被认为可以取代3DMark2003,成为新一代3D显示卡测试标准。Jowood公司表示AquaMark3和3DMark03相比,更加贴近目前主流游戏的3D技术水准,AquaMark3当中采用的任何3D技术都已经在目前的游戏当中出现过,因此AquaMark3更能反应3D图形芯片在现实游戏当中的实际表现性能。
官方主页:
http://www.aquamark3.com
下载(62.3 MB):
http://ftp.pconline.com.cn/pub/download/200309/AquaMark3.exe
12、SPECViewper 8.0.1(测试3D专业显卡)
说明:SPECViewper是专业级、符合工业标准的 OpenGL 图形显示卡效能测试分析软件,其测试项目有六项:3dsmax、DRV、DX、Light、ProE、Ugs,包括软件执行效能仿真(3dsmax、ProE)、以及动画公园场景仿真(Light)..等等。
官方主页:
http://www.spec.org
下载(412MB):
http://file.mydrivers.com/tools/tweak/SPECViewperf801.exe
13、MemTest 3.1 汉化版(一款内存检测工具。)
说明:是个比较少见的内存检测工具,它不但可以彻底的检测出内存的稳定度,还可同时测试记忆的储存与检索资料的能力,让你可以确实掌控到目前你机器上正在使用的内存到底可不可信赖。(建议完成MemTest 2000%)
官方主页:
http://www.hcidesign.com
下载(13 KB):
http://ftp.pconline.com.cn/pub/download/200501/ha_memtestv3.1.rar
14、DocMemory V1.45a(内存检测)
说明:一个可以电脑内存诊断程序,而且容易操作可以找出所有可能的内存问题。制作出一张可以开机的磁片。只要用这张磁片重新开机之后,就可以开始进行测试了。有各种先进的内存测试机制。
官方主页:
http://www.simmtester.com/page/products/doc/download.asp
下载(200 KB):
http://www.simmtester.com/software_updates/docmemory/DocMem1_45a.exe
15、Intel芯片组识别工具 Intel Chipset Identification Utility 2.91 汉化版
说明:英特尔芯片组识别工具,用于识别主板上的 Intel南、北桥芯片的型号。
下载(396 KB):
http://ks.onlinedown.net:82/down/IntelChipsetIdentificationUtilityV2.9180-Year.rar
16、PCMark 04 1.3.0(测试整机)
说明:这是由鼎鼎大名的Futuremark推出的另一款硬件测试工具,软件的风格和3DMark03如出一辙。整合的在线结果浏览器可以将你的测试结果与世界上最大的性能数据库进行对比。PCmark 04集易用性和专业性为一身,甚至适合刚刚上手的PC用户使用。PCMark04免费版只能运行系统测试组,显示出综合成绩。注册版用户可运行中央处理器测试组、内存测试组、图形芯片测试组、硬盘测试组,并且可以显示出单独的测试成绩。
官方主页:
http://www.futuremark.com/
下载(35.3 MB):
http://ftpgz3.pconline.com.cn/pub/driver/200501/PCMark04_v130_installer.exe
17、SiSoftware Sandra Professional 2005.SR1(测试整机)
说明:这是一套功能强大的系统分析评比工具,拥有超过 30 种以上的分析与测试模组,主要包括有CPU、Drives、CD-ROM/DVD、Memory、SCSI、APM/ACPI、鼠标、键盘、网络、主板、打印机等,还有 CPU、Drives、CD-ROM/DVD、Memory 的 Benchmark 工具,它还可将分析结果报告列表存盘。
官方主页:
http://www.sisoftware.net
下载(7.82 MB):
http://ftp.pconline.com.cn/pub/download/200501/san2005.SR1-1050-W64-SSO.exe
18、一分钟测试 1.56 Build 2875
说明:《一分钟测试》的设计目标是快速、直观、准确的评价用户计算机的效能。其设计目的在于克服现存评测软件测试时间过长,测试项目太多、测试结果过分理论化,测试成绩波动大,适用平台范围狭窄等不足,且致力于不再让用户去记忆那些奇怪的得分。
下载(659 KB):ftp://nj.onlinedown.net/zwt.exe
19、SYSmark2004 Patch2(测试办公及上网性能)
说明:SYSMark2004是基于真实应用测试和比较PC性能的先进性能测试软件。其中包括Internet Content Creation与Office Productivity两种类型测试,反映了系统在Internet内容创建和办公应用的软件应用的真实性能。
官方主页:
http://www.bapco.com
下载(3.31MB):
http://www.bapco.com
/updates/SYSmark2004Patch2.exe
20、PassMark BatteryMon 2.0 Build 1003(电池检测)
说明:BatteryMon 是一款监视PC电池使用状况的软件,电池的各项参数都是由直观的图表即时表示的。支持便携式电脑和UPS。
官方主页:
http://www.passmark.com/download/index.htm
下载(909 KB):
http://ftp.pconline.com.cn/pub/download/200501/batmon.exe
21、MBM5+OCCT(测试电源的负载能力及稳定性)
使用说明:
http://www.ezit.com.cn/pub/article/c1516_a133552_p1.html
MBM5说明:提供关关于主机板温度、使用电压、风扇温度、 CPU温度的监视工具,温度可以摄氏或华氏显示。
官方主页:
http://mbm.livewiredev.com
下载 MBM5 370(1.22 MB):
http://host.emucn.net/summer/temp/MBM5370.exe
下载语言包 MBM5 370 Language(404 KB):
http://host.emucn.net/summer/temp/MBM5370Language.exe
OCCT说明:通过MBM5所测出的数据,然后自动模拟电脑满负载的情况,让电脑连续30分钟满负载运行,最后结出相应的电压波动图。
官方主页:
http://www.ocbase.com
下载 OCCT v0.91(3.26 MB):ftp://ftp2.ocbase.com/ocbase3/OpenBeta/OCCTv0.91.exe
22、漫步者煲箱工具 Edifier Speaker Tool 1.01
说明:功能完善的煲箱软件,使用它具可以更快的让音箱进入最佳状态。
下载(442 KB):
http://www.edifier.com/scn/support/tools/Edifier.Speaker.Tools.v1.01.scn.zip
23、硬盘工具软件 HD Tune 2.10 修正
说明:HD Tune 是一款小巧易用的硬盘工具软件,其主要功能有硬盘传输速率检测,健康状态检测,温度检测及磁盘表面扫描等。另外,还能检测出硬盘的固件版本、序列号、容量、缓存大小以及当前的Ultra DMA模式等。
下载(144 KB):
http://zj.onlinedown.net:82/down/ha-hdtune210fix-sy.rar
24、键盘检测软件 PassMark KeyboardTest 2.2 Build 1009
说明:一个小巧的检测键盘的软件,有了它你可以用最快的时间来检验你键盘上的键位是否好用。
下载(686 KB):
http://ftp.pconline.com.cn/pub/download/200503/keytest.exe
25、64K的3D动画(暂时无法链接)
说明:64K的大小竟然演示了近30分钟的不重复3D影片,其3D渲染和声效却令人震撼,其技术令人震惊:这个动画的真正容量超过15G ,也就是说它压缩了25万倍。
下载页面:
http://vipbio.blogchina.com/blog/article_180765.1169720.html
26、Intel英特尔Centrino mobile(移动迅驰技术)检测程序1.3简体中文版
说明:Intel发布的这款名为Centrino Mobile Technology Test Utility的工具,可以测试你的笔记本电脑是否使用了迅驰无线技术。
下载(699 KB):
http://file2.mydrivers.com/board/intel_cm13chs.msi
27、AMD CPUInfo处理器检测工具最新1.1版
说明:AMD CPUInfo全新发布的一款处理器信息检测工具,它不仅支持包括Opteron在内的Athlon、Duron、Athlon 64、Sempron全系列AMD处理器,也对Athlon 64处理器平台WinXP-64/2003-64提供了全面的支持。
下载(8.24 MB):
http://file2.mydrivers.com/board/AMD_CPUInfo1.1.exe
28、Monitors Matter CheckScreen V1.2(检测显示器的)
说明:一款专业的液晶显示器测试软件,它包括多项测试,可以很好的检测液晶显示器的色彩,响应时间 ,文字显示效果,有无坏点,视频杂讯的程度和调节复杂度等液晶显示器的各项参数。
下载(836 KB):
http://gd-http.skycn.net:8081/down/checkscreen1_2.zip
29、Windows优化大师 6.57 Build 5.408
说明:这个就不用介绍了。
下载(3.00 MB):
http://ftp.pconline.com.cn/pub/download/200504/Wom.exe

深入理解Webpack的HMR机制(详解)

前言在我刚学习vue的时候,接触vue-cli的时候,在开发是被其提供的热加载功能深深的吸引住了。很好奇它是如何将我们所修改的代码通过不刷新方式,来更新web应用,与此同时还能保持应用的一些状态,这在我们平时日常开发之中是非常有用。后来再知道提供浙一功能的是Webpack的一个插件模块hotModuleReplace所提供的能力,本文就带大家一起来探究一下它是如何实现的。
抛出疑问
对于我们不熟悉或者压根没有接触的东西,通过抛出疑问,自己解决这些疑问可以很好帮我们去提升自己的能力,这是很好成长的机会。
通过webpack打包之后的文件存放在哪里?在没有writeToDisk:true这个配置项时。
打包器在工作时是如何和client进行交互的?
新生成的模块是如何作用于浏览器应用的。
一开始的时候我们抛出的问题的颗粒度比较粗,没有关系,随着我们一步步的探索,我们又会遇到一些细节的问题,把这细节问题梳理清楚了,从而对整个问题就有了更深的理解了。
HMR流程图解
上图描述了一个完整HMR流程,我们来看看它是如何运转的。
在webpack的监听模式下,在我们所编写的文件保存之后,会触发其重新编译,完成之后的bundle保存在内存之中。在编译打包时,webpack的ProgressPlugin这个插件将编译进度通过websocket推送到浏览器端。
在webpack-dev-server与webpack之间主要是由webpack-dev-middleware来进行交互的,这里它主要做了两件事:一是,通过webpack-dev-middleware调用webpack生成的compiler的相关api,告诉其将打包之后的文件是写入内存之后,还是写到硬盘上,依据writeToDisk配置项。二是,webpack-dev-middleware调用返回的是一个express标准的中间件,向app上注册路由,拦截HTTP收到的请求,根据请求路径响应对应的文件内容;
这一步,浏览器主要是通过sockjs这个库与服务器端的websocket服务建立长连接通信,将webpack编译打包的各个阶段推送浏览器端,依此会有不同的操作,最为核心的就是服务端推送新hash时,浏览器端会依据这个hash来进行后续的热更新逻辑。
当服务端推送的消息type为ok时,webpack-dev-server/client会执行reloadApp方法,主要是为了触发webpackHotUpdate事件,在webpack/hot/dev-server依据相关的配置和传递的信息决定是否要刷新页面还是要热更新,这两者联系的纽带是webpack/hot/emitter,依赖的是node的events模块,在浏览器也能生效,说明其是和平台无关的。
在webpack/hot/dev-server中会通过调用module.hot.check方法映射到HotModuleReplacement.runtime中的hotCheck方法,这些方法是通过HotModuleReplacementPlugin注入到bendle之中。
hotCheck然后会调用JsonpMainTemplate.runtime中的hotDownloadManifest和hotDownloadUpdateChunk方法。
hotDownloadManifest携带上推送的hash发起ajax请求,获取最新的文件列表。
hotDownloadUpdateChunk依据文件列表发起jsonp请求相应的最新的代码块,继续后续代码更新的逻辑。
代码更新时,会进行新旧模块的对比,决定是否要更新。如果要更新,将梳理清楚模块之间的依赖,然后更新模块以及相关的依赖;如果更新失败了,就会通过刷新的方式来进行兜底操作。
运行Demo
下面我们通过一个简单的例子来说明。来说明一些其中的一些细节问题,以大家最为熟悉的vue为例。
我们来初始化一个基本vue项目,相关目录以及核心配置如下:
Demo├─main.js├─package.json├─public│└─index.html├─test.vue├─webpack.config.js
webpack.config.js的配置如下:
{devtool:'source-map',mode:'development',entry:path.resolve(__dirname,'./main.js'),output:{path:path.resolve(__dirname,'dist'),filename:'bundle.js'},devServer:process.env.NODE_ENV=='production'?{}:{contentBase:path.join(__dirname,'dist'),hot:true,writeToDisk:true,},module:{rules:[{test:/\.vue$/,use:['vue-loader']},]},plugins:[newVueLoaderPlugin(),newHtmlWebpackPlugin({template:'./public/index.html'})]}
package.json的配置如下:
"scripts":{"dev":"rm-rf./dist&&NODE_ENV=developmentwebpack-dev-server--configwebpack.config.js--open--inline--progress"}
test.vue中的文件大家看心情来就好,main.js就是正常的vue启动入口,这里我就不多赘述了。
当我们修改的test.vue时,
第一步:webpack将打包之后的文件放入内存之中
webpack-dev-middleware通过调用webpack的compiler的api将打包之后的文件放到内存之中。
核心代码如下:
//webpack-dev-middleware/index.jsif(!options.lazy){context.watching=compiler.watch(options.watchOptions,(err)=>{//...})}
在配置了writeToDisk这个配置项时,打包之后的文件会写入到相应的文件夹中。但是在没有这个配置的时候,那么文件有存放在哪里呢?这里我们提到webpack-dev-middleware中的一个依赖memory-fs,看这个名字我们大概就能猜到他是干什么的了。在webpack的compiler.outputFileSystem会被挂在上memory-fs的实例。
核心代码如下:
//webpack-dev-middleware/lib/fs.jsconstisMemoryFs=!isConfiguredFs&&!compiler.compilers&&compiler.outputFileSysteminstanceofMemoryFileSystem;if(isConfiguredFs){const{fs}=context.options;compiler.outputFileSystem=fs;fileSystem=fs;}elseif(isMemoryFs){fileSystem=compiler.outputFileSystem;}else{fileSystem=newMemoryFileSystem();compiler.outputFileSystem=fileSystem;}
如果当前compiler.outputFileSystem不是MemoryFileSystem,那就用MemoryFileSystem替换,这样打包的文件就存放在MemoryFileSystem所构建的文件系统之中,加快了访问读取的速度了。
第二步:devServer在文件编译通知浏览器端
在webpack的compiler会添加ProgressPlugin插件,统计编译打包的进度,然后通过sockjs与服务端websocket通信,将打包的各个状态推送到客户端。此时,还需要知道打包完成的状态,在compiler.hooks中监听了done事件,然后通过调用_sendStats将打包之后的stats.hash推送浏览器端。
核心代码如下:
//webpack-dev-server/lib/Server.jsnewwebpack.ProgressPlugin((percent,msg,addInfo)=>{//...使用ProgressPlugin插件this.sockWrite(this.sockets,'progress-update',{percent,msg});//...}).apply(this.compiler);setupHooks(){//...constaddHooks=(compiler)=>{const{compile,invalid,done}=compiler.hooks;//...//添加done事件监听done.tap('webpack-dev-server',(stats)=>{this._sendStats(this.sockets,this.getStats(stats));this._stats=stats;});};if(this.compiler.compilers){this.compiler.compilers.forEach(addHooks);}else{addHooks(this.compiler);}}_sendStats(sockets,stats,force){//...//推送新的hash到浏览器端this.sockWrite(sockets,'hash',stats.hash);//...}第三步:webpack-dev-server/client接受和处理服务端推送的信息
在一开始梳理这逻辑的时候,我有点好奇webpack-dev-server/client这部分的处理代码是如何打到bundle之中的?其实在webpack-dev-server启动的时候,回去更新webpack的compiler,然后通过addEntries这个插件将这部分的代码注入到客户端之中。
核心代码如下:
//webpack-dev-server/lib/Server.jsupdateCompiler(this.compiler,this.options)//webpack-dev-server/lib/utils/updateCompiler.jsaddEntries(webpackConfig,options);compilers.forEach((compiler)=>{//...constprovidePlugin=newwebpack.ProvidePlugin({__webpack_dev_server_client__:getSocketClientPath(options),});providePlugin.apply(compiler);});
webpack-dev-server/client在处理websocket消息会依据不同的type来处理消息。当收到type为hash时记录下传递过来的hash值,当前消息的type为ok时,会调用reloadApp。如下图所示:
在reloadApp这个函数中,主要是通过webpack/hot/emitter触发webpackHotUpdate事件,并将最新的hash作为参数传递过去,如果没有配置hot参数,则会在宏任务中来进行页面刷新的操作。
核心代码如下:
//webpack-dev-server/client-src/default/index.jsconstonSocketMessage={hash(hash){status.currentHash=hash;},ok(){reloadApp(options,status);}}functionreloadApp({hotReload,hot,liveReload},{isUnloading,currentHash}){if(hot){consthotEmitter=require('webpack/hot/emitter');hotEmitter.emit('webpackHotUpdate',currentHash);}elseif(liveReload){//...self.setInterval(()=>{rootWindow.location.reload()})}}第四步:webpack接受到最新的hash验证以及更新模块
在上一步当中我们派发了webpackHotUpdate事件,要看在哪里消费了这个事件。在webpack/hot/dev-server中消费的回调函数中主要是调用了module.hot.check方法,
module.hot这个对象是通过HotModuleReplacementPlugin插件将HotModuleReplacement.runtime之中的代码注入。
核心代码如下:
//webpack/hot/dev-server.jshotEmitter.on("webpackHotUpdate",function(currentHash){//...module.hot.check(true).then(()=>{//...})});//webpack/lib/HotModuleReplacementPlugin.jsconstTemplate=require("./Template")consthotInitCode=Template.getFunctionContent(require("./HotModuleReplacement.runtime"))mainTemplate.hooks.moduleObj.tap("HotModuleReplacementPlugin",(source,chunk,hash,varModuleId)=>{returnTemplate.asString([`${source},`,`hot:hotCreateModule(${varModuleId}),`,//将hmr.runtime中的api注入到module之中"parents:(hotCurrentParentsTemp=hotCurrentParents,hotCurrentParents=[],hotCurrentParentsTemp),","children:[]"]);});//webpack/lib/HotModuleReplacement.runtime.jsfunctionhotCreateModule(moduleId){varhot={check:hotCheck,//otherapi};returnhot;}
hotCheck方法会调用JsonpMainTemplate.runtime中的两个方法hotDownloadManifest和hotDownloadUpdateChunk,前者通过上一步传入的hash发起ajax请求服务端获取文件更新列表,如图所示;后者依据文件列表发起jsonp请求相应的最新的代码块,继续后续代码更新的逻辑。
hotDownloadManifest方法获取更新文件列表
hotDownloadUpdateChunk获取到更新的新模块代码。
:::tip在这里我一直有一个疑问,并且我自己想了一段时间也没有想通用的问题,就是为什么要通过上述的这种方式来更新。从技术来说,当服务端推送消息type为ok时,可以吧更新之后的代码块也一并推送过来,但是为什么没有这么做呢?看了其他的解释是,模块解耦,dev-server/client只负责消息的传递,HotModuleReplacement来负责代码模块的的更新,这样复合单一设计的原则,而且webpack在不使用dev-server的情况下,可以配合webpack-hot-middleware来实现热更新功能,webpack-hot-middleware使用的协议并不是websocket而是SSE协议,这种协议在flutter-devtools也有使用到,可以很好的把模块的功能进行解耦。:::
第五步:HotModuleReplacement.runtime更新模块
在上述jsonp请求中我们看到其调用了webpackHotUpdate这个方法,通过打包出来的bundle.js可以看到它又调用了JsonpMainTemplate.runtime中的webpackHotUpdateCallback,这其中主要是调用了HotModuleReplacement.runtime的hotAddUpdateChunk,后面一系列的调用就不一一详述了,我们来看一下最为核心的方法hotApply。由于这个方法实现的代码较多,我们可以追踪hotStatus的状态变化来梳理更新的逻辑。
"idle"=>"check",这个阶段module.hot.check方法。
"check"=>"prepare",这个阶段通过上述的hotDownloadManifest获取到了最新的文件列表。
"prepare"=>"ready",这个阶段,将新的模块存贮到了hotUpdate之中。
"ready"=>"dispose",这个阶段经历了两个循环,在第一个循环中,先通过getAffectedStuff方法找到当前这个新模块所有相关的模块outdatedModules和依赖outdatedDependencies,result返回值如下,如果没有找到的话,将result.type表示为disposed。正常返回result.type为accepted。
letresult={"type":"accepted","moduleId":"./lib/vue-loader/index.js?!./test.vue?vue&type=script&lang=js&","outdatedModules":["./lib/vue-loader/index.js?!./test.vue?vue&type=script&lang=js&","./test.vue?vue&type=script&lang=js&","./test.vue"],"outdatedDependencies":{}}
在第二个循环中,找出outdatedModules中,并且已经被使用的模块中hot._selfAccepted为true的模块,这些模块通过都自己调用的这个方法,对于vue组件来说,这部分的代码是在vue-loader中注入的,核心代码如下:
{devtool:'source-map',mode:'development',entry:path.resolve(__dirname,'./main.js'),output:{path:path.resolve(__dirname,'dist'),filename:'bundle.js'},devServer:process.env.NODE_ENV=='production'?{}:{contentBase:path.join(__dirname,'dist'),hot:true,writeToDisk:true,},module:{rules:[{test:/\.vue$/,use:['vue-loader']},]},plugins:[newVueLoaderPlugin(),newHtmlWebpackPlugin({template:'./public/index.html'})]}0
"dispose"=>"apply",在这个阶段,遍历outdatedModules,从installedModules已经安装的模块中删除过期模块以及被该模块引用的子模块,还要删除删除依赖,核心代码如下:
{devtool:'source-map',mode:'development',entry:path.resolve(__dirname,'./main.js'),output:{path:path.resolve(__dirname,'dist'),filename:'bundle.js'},devServer:process.env.NODE_ENV=='production'?{}:{contentBase:path.join(__dirname,'dist'),hot:true,writeToDisk:true,},module:{rules:[{test:/\.vue$/,use:['vue-loader']},]},plugins:[newVueLoaderPlugin(),newHtmlWebpackPlugin({template:'./public/index.html'})]}1
"apply"=>"fail"or"idle",在这个阶段主要是更新模块,先将可被更新的模块appliedUpdate挂载到全局的modules上,对于outdatedSelfAcceptedModules中的模块,会调用$require$(moduleId),这里的$require$就是打包出来的__webpack_require__函数,主要是用来加载模块的。第六步:对vu

jquery表格排序插件?

JQ前台分页对于你这种情况,最好选一个表格插件,JQ能用的第三方表格插件特别多,你想要的这些功能默认都已经支持,上手简单,且功能强大。
GridManager.js:
GridManager.js可快速的对table标签进行实例化,实例化后将实现以下功能:
宽度调整:表格的列宽度可进行拖拽式调整
位置更换:表格的列位置进行拖拽式调整
配置列:可通过配置对列进行显示隐藏转换
表头吸顶:在表存在可视区域的情况下,表头将一直存在于顶部
排序:表格单项排序或组合排序
分页:表格ajax分页,包含选择每页显示总条数和跳转至指定页功能
用户偏好记忆:记住用户行为,含用户调整的列宽、列顺序、列可视状态及每页显示条数
序号:自动生成序号列
全选:自动生成全选列
导出:当前页数据下载,和仅针对已选中的表格下载
右键菜单:常用功能在菜单中可进行快捷操作
过滤:通过对列进行过滤达到快速搜索效果
Datatables是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。
分页,即时搜索和排序
几乎支持任何数据源:DOM,javascript,Ajax和服务器处理
支持不同主题DataTables,jQueryUI,Bootstrap,Foundation
各式各样的扩展:Editor,TableTools,FixedColumns……
丰富多样的option和强大的API
支持国际化
BootstrapTable显示数据表格格式,提供了丰富的支持,单选框、复选框、排序、分页等。
更多插件可自行百度jquerytable插件,类似的插件很多。
jquery表格FooTable插件怎么关闭列排序功能啊
这个可以参考如下内容:
JQuery.dataTables表格插件添加跳转到指定页
一、解决方案
1.添加自定义工具栏,嵌入文本框
[javascript]viewplaincopy
"dom":'l"toolbar"frtip',//自定义工具栏
[javascript]viewplaincopy
//设置工具栏内容
//l-lengthchanginginputcontrol
//f-filteringinput
//t-Thetable!
//i-Tableinformationsummary
//p-paginationcontrol
//r-processingdisplayelement
[javascript]viewplaincopy
$("div.toolbar").html('bstyle="color:red"跳转第/binputid="searchNumber"/bstyle="color:red;"页/b');
2.监听文本框的change事件,执行插件的调转页面方法
[javascript]viewplaincopy
//调转到指定页面索引,注意大小写
varoTable=$('#example1').dataTable();
oTable.fnPageChange(page);
3.插件绘制成功后,绑定文本框的值
[javascript]viewplaincopy
//绘制的时候触发,绑定文本框的值
table.on('draw.dt',function(e,settings,data){
varinfo=table.page.info();
//此处的page为0开始计算
console.info('Showingpage:'+info.page+'of'+info.pages);
$('#searchNumber').val(info.page+1);
});
二、完整示例代码
[html]viewplaincopy
tableid="example1"class="tabletable-hovertable-striped"
thead
tr
th编号/th
th姓名/th
th性别/th
th生日/th
th班级/th
/tr
/thead
/table
[javascript]viewplaincopy
$(function(){
//注意方法名为DataTable
vartable=$('#example1').DataTable({
"dom":'l"toolbar"frtip',//自定义工具栏
"pagingType":"full_numbers",
lengthMenu:[3,5,10],
processing:true,//是否使用进度条
serverSide:true,//是否启用数据库加载
ajax:{
url:'/tableone/getlist',
type:'post',
data:function(d){
d.name='张三';
/*
*自定义aja参数
*特别说明,此处可以重写控件的默认参数,比如分页参数
*/
//d.start=0;
//console.info(d);
//varpage=$('#searchNumber').val();
//page=parseInt(page)||1;
//d.start=(page-1)*d.length;
}
},
//指定列绑定的字段
columns:[
{data:'sno'},
{data:'sname'},
{data:'ssex'},
{data:'sbirthday'},
{data:'class'}
],
order:[
[3,'desc']
]
});
$("div.toolbar").html('bstyle="color:red"跳转第/binputid="searchNumber"/bstyle="color:red;"页/b');
//绑定分页事件----在切换分页的时候触发
//table.on('page.dt',function(){
//varinfo=table.page.info();
//console.info('Showingpage:'+info.page+'of'+info.pages);
//});
//绘制的时候触发,绑定文本框的值
table.on('draw.dt',function(e,settings,data){
varinfo=table.page.info();
//此处的page为0开始计算
console.info('Showingpage:'+info.page+'of'+info.pages);
$('#searchNumber').val(info.page+1);
});
//监听文本框更改
$('#searchNumber').change(function(){
varpage=$(this).val();
page=parseInt(page)||1;
page=page-1;
//调转到指定页面索引,注意大小写
varoTable=$('#example1').dataTable();
oTable.fnPageChange(page);
});
});
如何快速入门jQueryFlexigrid表格插件Flexigrid是一个类似于ExtGird,但基于jQuery开发的Grid。它具有的功能包括:可以调整列宽,合并列标题,分页,排序,显示/隐藏表格等。Flexigrid显示的数据能够通过Ajax获取或者从一个普通的表格转换。本文重点介绍如何入门使用
jquery插件无刷新分页paginnation中如何加上按条件排序数据?
1.使用插件为jquery.pagination.js。
首先引用jquery.pagination.js(分页js),跟pagination.css(分页样式css)。
2.页面js代码为
复制代码代码如下:
scripttype="text/javascript"
varpageIndex=0;//页面索引初始值
varpageSize=15;//每页显示条数初始化,修改显示条数,修改这里即可
$(function(){
InitTable(0);//Load事件,初始化表格数据,页面索引为0(第一页)
//分页,PageCount是总条目数,这是必选参数,其它参数都是可选
$("#Pagination").pagination(%=pcount%,{
callback:PageCallback,//PageCallback()为翻页调用次函数。
prev_text:"?上一页",
next_text:"下一页?",
items_per_page:pageSize,
num_edge_entries:2,//两侧首尾分页条目数
num_display_entries:6,//连续分页主体部分分页条目数
current_page:pageIndex,//当前页索引
});
//翻页调用
functionPageCallback(index,jq){
InitTable(index);
}
//请求数据
functionInitTable(pageIndex){
$.ajax({
type:"POST",
dataType:"text",
url:'',//提交到一般处理程序请求数据
data:"pageIndex="+(pageIndex)+"pageSize="+pageSize,//提交两个参数:pageIndex(页面索引),pageSize(显示条数)
success:function(data){
$("#Resulttr:gt(0)").remove();//移除Id为Result的表格里的行,从第二行开始(这里根据页面布局不同页变)
$("#Result").append(data);//将返回的数据追加到表格
}
});
}
});
/script
3.页面body里面的代码为
复制代码代码如下:
tablewidth="100%"border="0"cellspacing="0"cellpadding="0"
tr
tdwidth="60"align="right"商品名:/td
tdwidth="200"align="left"inputtype="text"id="txtKeywords"class="keyword"//td
tdwidth="200"align="left"inputid="search"type="button"value="查找"class="submit"//td
td/td
/tr
/table
tableid="Result"cellspacing="0"cellpadding="0"
tr
th商品编号/th
th商品名称/th
/tr
/table
divid="Pagination"class="rightflickr"/div
4.页面后台代码为
复制代码代码如下:
protectedintpcount=0;//总条数
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
BLL.TbGoodsbll=newBLL.TbGoods();
pcount=bll.GetRecordCount("Status='"+(int)Enum.RecordStatus.Normal+"'");//获取页面总条数,即要现实的数据总条数,还不明白的话,就是selectcount(*)fromTable,就是这里的个数。
}
}
5.一般处理程序fffff.ashx代码为
复制代码代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Text;
usingSystem.Data;
namespaceEShop.Web.Admin.tool.Reserver
{
///summary
///ListBuyBatchManage的摘要说明
////summary
publicclassListBuyBatchManage:IHttpHandler
{
publicvoidProcessRequest(HttpContextcontext)
{
context.Response.ContentType="text/plain";
Stringstr=string.Empty;
if(context.Request["pageIndex"]!=nullcontext.Request["pageIndex"].ToString().Length0)
{
intpageIndex;//具体的页面数
int.TryParse(context.Request["pageIndex"],outpageIndex);
if(context.Request["pageSize"]!=nullcontext.Request["pageSize"].ToString().Length0)
{
//页面显示条数
intsize=Convert.ToInt32(context.Request["pageSize"]);
stringdata=BindSource(size,pageIndex);
context.Response.Write(data);
context.Response.End();
}
}
}
#region无刷新分页
publicstringBindSource(intpagesize,intpage)
{
BLL.TbGoodsbll=newBLL.TbGoods();
DataSetds=bll.GetListByPage("Status='"+(int)Enum.RecordStatus.Normal+"'","",pagesize*page+1,pagesize*(page+1));//获取数据源的ds会吧。
StringBuildersb=newStringBuilder();
if(ds!=null)
{
foreach(DataRowrowinds.Tables[0].Rows)
{
sb.Append("trtd");
sb.Append(row["GoodsUid"]);
sb.Append("/tdtd");
sb.Append(row["GoodsName"]);
sb.Append("/td/tr");
}
}
returnsb.ToString();
}
#endregion
publicboolIsReusable
{
get
{
returnfalse;
}
}
}
}
用jquery实现表格列排序?
$(document).ready(function()
{
//插件的形式
jQuery.fn.alterRowColors=function()
{
$('tbodytr:odd',this).removeClass('even').addClass('odd');
$('tbodytr:even',this).removeClass('odd').addClass('even');
returnthis;
}
//1.此时的函数是作为jQuery.fn的一个新属性定义的,不是孤立的函数,这样就把该函数注册成了一个插件,
//2.使用关键字this,在一个插件内部,this表示的是调用该插件的jQuery对象,
//3.最后在函数的末尾返回this,返回这个值可以使这个新方法能够继续连缀其他的方法。
var$sortOrder=0;//排序类型1表示升序,0表示降序
var$table=$('table#shop');
$table.alterRowColors();
$('th',$table).each(function(column)
{
//处理三种有可能存在的排序字段,比较方法
varfindSortKey;
if($(this).is('.sort-title')||$(this).is('.sort-author'))
{
findSortKey=function($cell)
{
return$cell.find('.sort-title').text().toUpperCase()+''+$cell.text().toUpperCase();
}
}
elseif($(this).is('.sort-date'))
{
findSortKey=function($cell)
{
returnDate.parse('1'+$cell.text());
}
}
elseif($(this).is('.sort-price'))
{
findSortKey=function($cell)
{
varkey=parseFloat($cell.text().replace(/^[^\d.]*/,''))
returnisNaN(key)?0:key;
}
}
//排序
if(findSortKey)
{
$(this).addClass('clickable').hover(function()
{
$(this).addClass('hover');
var$title=$sortOrder==0?'升序':'降序';
$(this).attr('title','按'+$(this).html()+$title+'排列');
},function()
{
$(this).removeClass('hover');
}).click(function()
{
$sortOrder=$sortOrder==0?1:0;
varrows=$table.find('tbodytr').get();
$.each(rows,function(index,row)
{
row.sortKey=findSortKey($(row).children('td').eq(column));
});
//排序方法
rows.sort(function(a,b)
{
if($sortOrder==1)
{
//升序
if(a.sortKeyb.sortKey)return-1;
if(a.sortKeyb.sortKey)return1;
return0;
}
else
{
//降序
if(a.sortKeyb.sortKey)return1;
if(a.sortKeyb.sortKey)return-1;
return0;
}
});
//排序后的对象添加给$table
$.each(rows,function(index,row)
{
$table.children('tbody').append(row);
row.sortKey=null;
});
//显著标明是通过某一列排序的
$table.find('td').removeClass('sorted')
.filter(':nth-child('+(column

标签:信息技术 软件 编程语言 JavaScript 声卡

大明白知识网 Copyright © 2020-2022 www.wangpan131.com. Some Rights Reserved. 京ICP备11019930号-18