直接对网卡编程以实现网络数据的拦截与监控是件很复杂的事情。本文介绍使用“IP助手库函数”(iphlpapi.dll)轻松获取网络流量图的方法,并给出了具体实例程序。
|
从图中可以看到,用“IP助手库函数”可获取当前所有的网络连接情况,其中包括使用网卡的局域网连接,以及使用ISDN或调制解调器的拨号网络连接。可获取的信息包括:连接速度、界面类型、操作状态、当前总共收到和发送的字节数,等等。
|
其中“总共收到和发送的字节数”等信息完全是累计的。也就是说,这些信息不受网络连接断开的影响(如拨号网络),能完整记录各网络全天的吞吐总量。
|
定时扫描网络的最新吞吐量,并与上一时段的吞吐量做比较,即可制作网络流量图。上图所示的是拨号网络约六分钟的下载流量图,其中数据每秒刷新一次(X方向),网格单位是KB/每秒(Y方向)。
|
用微软的“IP助手库函数”(iphlpapi.dll)可获取大量有关网络连接的有用信息。其中有关吞吐量的函数包括GetIfTable等,其定义为:
|
Private Declare Function GetIfTable Lib "iphlpapi" (ByRef pIfTable As Any, _ByRef pdwSize As Long, ByVal bOrder As Long) As Long
|
该函数的第一个参数指向一个缓冲区,函数执行后该缓冲区内被填入各网络连接的最新数据。缓冲区的结构是:
|
网络连接总数+网络连接1结构数据+网络连接2结构数据+...
|
其中“网络连接总数”占4个字节;每个“网络连接数据”的结构为:
|
wszName(0 To 511) As Byte
|
dwPhysAddrLen As Long '物理地址部分有效长度
|
bPhysAddr(0 To 7) As Byte '物理地址
|
dwAdminStatus As Long '管理状态
|
dwOperStatus As Long '操作状态
|
dwLastChange As Long '操作状态最近更新时间
|
dwInOctets As Long '总共收到(字节)
|
dwInUcastPkts As Long '总共收到(unicast包)
|
dwInNUcastPkts As Long '总共收到(non-unicast包)
|
dwInDiscards As Long '丢弃包总数(收到)
|
dwInErrors As Long '出错包总数(收到)
|
dwInUnknownProtos As Long '其它包总数(收到)
|
dwOutOctets As Long '总共发送(字节)
|
dwOutUcastPkts As Long '总共发送(unicast包)
|
dwOutNUcastPkts As Long '总共发送(non-unicast包)
|
dwOutDiscards As Long '丢弃包总数(发送)
|
dwOutErrors As Long '出错包总数(发送)
|
dwOutQLen As Long '发送队列长度
|
dwDescrLen As Long '界面描述部分有效长度
|
bDescr(0 To 255) As Byte '界面描述
|
需要指出的是,上述GetIfTable函数只能在Windows 98/2000/NT4以及部分Win95上工作。
|
Dim IfTable As MIB_IFROW ' 定义一个上述结构的变量
|
Dim buf_size As Long ' 缓冲区实际大小
|
Dim rows As Long ' 当前网络连接总数
|
Dim Pic_X, Pic_Y, Old_In As Long ' 用于在绘制流量图中保存上一时段的有关值
|
Private Const ERROR_NOT_SUPPORTED = 50&
|
Private Const ERROR_SUCCESS = 0&
|
Private Declare Function GetIfTable Lib "iphlpapi" (ByRef pIfTable As Any, _
|
ByRef pdwSize As Long, ByVal bOrder As Long) As Long
|
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef _
|
pDest As Any, ByRef pSource As Any, ByVal Length As Long)
|
i = GetIfTable(ByVal 0&, buf_size, 0)
|
If i = ERROR_NOT_SUPPORTED Then
|
MsgBox "函数GetIfTable只能在Win98/NT4/2000上工作。"
|
ReDim buf(0 To buf_size - 1) As Byte ' 根据返回值,动态申请缓冲区
|
i = GetIfTable(buf(0), buf_size, True) '“True”的含义是“排序”
|
If i <> ERROR_SUCCESS Then End
|
Timer1.Interval = 1000 ' 刷新间隔定为一秒
|
Timer1.Enabled = True ' 启动记时器
|
Picture1.AutoRedraw = True ' 启动自动重画功能以防止画面丢失
|
Picture1.ScaleMode = 3 ' 设定画笔单位为象素(Pixel)
|
Pic_X = Picture1.ScaleWidth
|
Private Function GetType(Type1 As Long) As String ' “界面类型”定义函数
|
Case 1: GetType = "Other"
|
Case 6: GetType = "Ethernet"
|
Case 9: GetType = "Tokenring"
|
Case 15: GetType = "FDDI"
|
Case 24: GetType = "Loopback"
|
Case 28: GetType = "Slip"
|
Private Function GetState(State1 As Long) As String ' “操作状态”定义函数
|
Case 0: GetState = "Not operational"
|
Case 1: GetState = "Operational"
|
Case 2: GetState = "Disconnected"
|
Case 3: GetState = "Connecting"
|
Case 4: GetState = "Connected"
|
Case 5: GetState = "Unreachable"
|
Private Sub Timer1_Timer()
|
ReDim buf(0 To buf_size - 1) As Byte
|
i = GetIfTable(buf(0), buf_size, True)
|
CopyMemory rows, buf(0), 4 ' 缓冲区的前四个字节是“网络连接总数”
|
CopyMemory IfTable, buf(4 + (j - 1) * Len(IfTable)), Len(IfTable)
|
有效编号(j - 1).Caption = Str(j)
|
界面类型(j - 1).Caption = GetType(IfTable.dwType)
|
连接速度(j - 1).Caption = IfTable.dwSpeed
|
总共收到(j - 1).Caption = Str(IfTable.dwInOctets)
|
If IfTable.dwSpeed = 9600 Then ' 绘制拨号网络的下载流量图
|
If Pic_X > Picture1.ScaleWidth Then
|
Picture1.Line (0, Picture1.ScaleHeight - i * 10 - 1)- _
|
(Picture1.ScaleWidth, Picture1.ScaleHeight - i * 10 - 1), &H808080
|
Old_In = IfTable.dwInOctets
|
Pic_Y = Picture1.ScaleHeight - 1
|
i = Picture1.ScaleHeight - (IfTable.dwInOctets - Old_In) / 102.4 - 1
|
Picture1.Line (Pic_X - 1, Pic_Y)-(Pic_X, i), &HFF& ' 绘制流量
|
Old_In = IfTable.dwInOctets
|
总共发送(j - 1).Caption = Str(IfTable.dwOutOctets)
|
操作状态(j - 1).Caption = GetState(IfTable.dwOperStatus)
|
总共错收(j - 1).Caption = Str(IfTable.dwInErrors)
|
总共错发(j - 1).Caption = Str(IfTable.dwOutErrors)
|
其它共收(j - 1).Caption = Str(IfTable.dwInUnknownProtos)
|
IP Helper API
iP Helper 是一套用于管理本地网络设置的API(应用程序编程接口)它的功能十分强大,通过使用这一套API,你可以方便的改变计算机的网络设置或者提取有关的信息。而且它还提供了一种消息机制,能够在本地计算机的网络设置发生改变时通知你的应用程序。也就是说以前设置IP,掩码等等另人难以入眠的种种烦琐的工作现在都可以轻松搞定了。而且实际上,它不仅仅能够提取本机的网络设置信息,还能够获得网络上其它计算机的IP使用情况和MAC地址。这正是后面另一篇文章的例子程序中要使用的功能。
哪儿可以搞到IP Helper API? Windows 98以上的所有操作系统在系统目录的system32下都带有iphlpapi.dll这个库文件,而且对于NT 4.0在加装了Service Pack 2以后也就有了这个库文件。这只能说明我们的程序可以在这些系统上运行而不需要额外的库文件,但是对于C程序员来说还必须有相应的头文件等等东西。这个东东网上不太多,在华中理工和清华9#的FTP上有它的头文件,文件很小,只有几K(头文件而已,大不到哪儿去)。当然,你也可以问微软要,下载SDK或者是定购SDK光盘(这是我梦想的事情)。最后是对MSDN的一个勘误:MSDN所声称的静态链接库iphlpapi.lib是不存在的(至少我没有找到),还是老老实实的使用动态库吧。----------------------------这些库可以在安装vc.net后带有!
从最简单的开始 最简单的当然是看看我们计算机上的网络设置是什么而不要动手修改。附表中列出了一个简单的网络设置查看程序,在这个程序中我分类使用了主要的API函数,为了交代问题而不让你陷入到MFC的汪洋大海中去,我把它做成了控制台界面的,而且做了详尽的注释,你可以把其中的代码剪切粘贴下来在任何地方使用。让我来解释一下这些代码:
提取网卡信息
hInst=LoadLibrary("iphlpapi.dll"); if(!hInst) cout<<"iphlpapi.dll not supported in this platform!\n";
这三行代码的作用是加载iphlpapi库文件,在极个别的情况下,你使用了win95以下的操作系统或者不小心删除了iphlpapi.dll,第三行的语句才会被打印出来,这也是程序失败的唯一原因。
希望你还记得如何使用.dll。长久以来我们一直都在幸福的使用着VC的静态链接库,在没有静态链接库的情况下我们还有傻瓜化的控件。下面的几行代码显示了调用DLL中函数的过程:
pGAInfo=(PGAINFO)GetProcAddress(hInst,"GetAdaptersInfo"); ULONG ulSize=0; pGAInfo(pInfo,&ulSize); pInfo=(PIP_ADAPTER_INFO)new(char[ulSize]); pGAInfo(pInfo,&ulSize);
第一行代码是获得函数GetAdaptersInfo的入口地址,以便我们在后面通过指针调用函数。这个函数的功能是提取网卡的信息,并接收两个参数,第一个参数是用来保存网卡信息的内存缓冲的首地址,而第二个参数是这个缓冲的大小。但上面的代码看起来有些奇怪对么?由于我们事先不知道本地机器上有多少张网卡,所以也就没法知道应该分配多大的缓存。好在GetAdaptersInfo函数在缓冲的大小不够时会在第二个参数也就是ulSize中填入应该分配的缓冲的大小。这样,我们就可以调用两次GetAdaptersInfo,第一次是获取缓冲区的大小,然后分配这个缓冲以后再次调用它以获得实际的网卡信息。
令人不解的是,GetAdaptersInfo通过pInfo返回的信息竟然是以静态链表的方式组织的,下面就是访问链表的代码:
while(pInfo) { 。。。。。。。。。。。。。。。。。。。。//访问网卡数据 //将当前指针移向下一个结点 pInfo=pInfo->Next; }
为了说明问题,我再一次省略了其中的代码。下面看看GetAdaptersInfo都返回了些什么样的信息,下面是对pInfo所指向的数据结构的解释:
typedef struct _IP_ADAPTER_INFO { struct _IP_ADAPTER_INFO* Next; //链表指针域,我们通过这个来遍历静态键表 DWORD ComboIndex;//保留未用 char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; //网卡名 char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; //对网卡的描述,实际上好象是//驱动程序的名字 UINT AddressLength; //物理地址的长度,通过这个我们才能正确的显示下面数组中的物理地 //址 BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; //物理地址,每个字节存放一个十六进制的数 //值,我们配合上一个数据域在printf中用/x格式把每个字节输出。 DWORD Index;//网卡索引号 UINT Type;//网卡类型 UINT DhcpEnabled;//是否启用了DHCP动态IP分配? PIP_ADDR_STRING CurrentIpAddress;//当前使用的IP地址 IP_ADDR_STRING IpAddressList; //绑定到此网卡的IP地址链表,重要项目 IP_ADDR_STRING GatewayList; //网关地址链表,重要项目 IP_ADDR_STRING DhcpServer; //DHCP服务器地址,只有在DhcpEnabled==TRUE的情况下才有 //效 BOOL HaveWins;//是否启用了WINS? IP_ADDR_STRING PrimaryWinsServer; //主WINS地址 IP_ADDR_STRING SecondaryWinsServer; //辅WINS地址 time_t LeaseObtained; //当前DHCP租借获取的时间 time_t LeaseExpires; //当前DHCP租借失效时间。这两个数据结构只有在启用了DHCP时才 //有用。 } IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
我觉得这些就是非常底层的东西,因为一般我们网络编程都是直接调用socket,操作系统调用协议栈完成剩下的工作,而ip helper api 提供了我们直接操作底层的机会!
我想发送一下mac包,想试一下直接发送 srcmac=my mac ;dstmac=my mac的包,看一下是什么效果!
网上得知:直接发送mac大概有两中方法:
libnet
wincap
而其实libnet 最后还是调用了wincap wincap使用了ip helper api
我使用winpcap下的函数和例子:
但遇到了问题----------------------所以说理想和现实还是很有距离的
正好比说:恋爱中男女是浪漫而理想的,结婚后夫妇是现实而繁琐的!
首先是 网卡名称: linux下一般是 eth0 搞定
但Windows是?
\Device\NPF_{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx}
可以注册表中找到,也可以调用ip helper api找到
怎么把自己的mac地址写入到buffer中!
mac一般是 十六进制的
方法有: 将每个字节的十六进制换为 十进制 char a=1;
其实只要直接写也可以吧?:char a=0x11;
我就试着发了两种包:
1.src和dst mac地址一样,可以用ethereal捕获到发出的包,但没有返回的包!
-------------------------------这可以说明 回环地址 即使发出去了,也接不到!(至少我们的局域网是这样)
2.别人的mac dst是自己的,可以用ethereal捕获到发出的包,但没有返回!
而且ethereal崩溃
-------------------------------可以发,但是会导致问题的!
|
不是由BORLAND提供的组件叫第三方组件:
安装方法:
就目前常见的各种形式的组件的安装方法介绍一下。
1 只有一个DCU文件的组件。DCU文件是编译好的单元文件,这样的组件是作者不想把源码公布。一般来说,作者必须说明此组件适合Delphi的哪种版本,如果版本不对,在安装时就会出现错误。也正是因为没有源码,给使用者带来了不便,那就是一旦Delphi版本升级,此组件就不能再使用了,当然有的作者给出了几种版本的DCU文件,用户根据需要选择使用。这样的组件的安装方法是:在Component菜单中,选择install component,在对话框
"into existing package"页中,单击“Unit file name”后的“Browse”按扭,在打开的文件对话框中,将“文件类型”设定为*.dcu,找到要安装的DCU文件,按OK按钮返回"into existing package"页后再按OK按钮就可以安装了。注意,此时Delphi会提示dclusr40.dpk将被重建,是否继续,OK就可以了。这里是将组件安装到dclusr40.dpk包中,此包从文件名上可以看出是用户自定义组件包,先安装到这个包中吧,下面再讲有关注意事项。安装完毕会有已经将组件注册完的提示信息以及安装到哪个组件页中的信息等,到组件面板上看看,一般会出现一个新的组件页,其中有刚安装的组件。
2、 只有PAS文件或既有PAS又有DCU文件的组件。这种组件因为有PAS文件,也就是说作者提供了源码,这就好办多了。安装的方法和上面是一样的,在文件类型中可以设定为DCU也可以设定为PAS,建议设定为PAS,这样可用你的Delphi重新编译一下,看是否会出现问题。Delphi升级后只能选择PAS文件安装,这样才能重新编译,使得组件能适应新Delphi版本。这样的组件是很值得使用的,根据心铃的经验,没有源码的组件最好不要使用,一是存在Delphi版本升级后无法使用的问题,再者当程序出现问题后用户无法调试组件来判断是否是组件中存在BUG。
3、有dpk文件的组件包。带有dpk文件的组件包一般是有多个组件构成的,也就是说安装后会有多个组件供使用,如果只有一个组件作者一般不会制成DPK文件,使用上面的方式发布就可以了。对于这样的组件包,一般来说会有详细的安装说明文件,如上面提到的RXLIB,由于组件复杂且安装时有先后顺序,作者不提供安装说明用户根本无法正确安装。如果没有安装说明文件,那么用下面的方法安装:在File菜单下,选择”OPEN…”打开dpk文件(文件类型列表框中选*.dpk),在出现的Package窗口中,工具栏上有Install按钮,按此按钮即可进行安装。如果Install按钮处于无效状态,那么先按Compile按钮编译,一般来说编译之后Install按钮就会处于有效状态,此时再按Install按钮就可以了。
4、 带有Bpl文件的组件包。一般来说这也是由多种组件构成的组件包,它其实是一个动态连接库文件(DLL)。对于这种组件包的安装方法是:在component菜单下选择“install packages”,然后单击Add按钮,在打开的文件对话框中找到相应的bpl文件打开返回后,再单击Ok按钮就可以了。
5、ActiveX控件的安装。要安装这类控件,需要先用regsvr32.exe注册,然后选择Component菜单中Import ActiveX Control项。在Import ActiveX Control打开的窗口中,只有已经注册的ActiveX控件才出现在列表中,选中一个然后按Install按钮就可以安装了。如果事先没有用regsvr32.exe注册也可以按ADD按钮找到OCX文件即时注册,注册后再进行安装。
几点说明:
1 在拿到组件后先看是否有说明文件,一般来说在说明文件中有如何安装的指导,有些还会有组件的属性、事件、方法的使用说明,这些在使用时是非常重要的。
2 在上面的组件(包)安装操作之前,最好将 *.bpl拷贝到你的System目录中,将 *.pas、*.dcu、*.dcr、*.dp?拷贝到Delphi的Lib目录中再进行。
3 前面我们提到安装DCU组件时,选用的是已经存在的dclusr40.dpk,当然也可以选择安装到一个新的包中,如果选择新包,需要先取一个名字比如DEMO,事实上安装完毕后用户可以找到的是Demo.bpl,而找不到DEMO.DPK。假如你已经将一个组件安装到dclusr40.dpk中了,还想再安装一个组件,如果再安装到dclusr40.dpk中,安装后你得到提示,原来安装的那个组件已经被取消注册,你将无法使用了。这样不就成了只能安装一个组件了吗?除非你再安装到一个新的包中才可以两个组件同时使用。当然每安装一个组件生成一个新的BPL文件也未偿不可,但BPL文件就增加许多。能否在dclusr40.dpk中多安装几个组件呢?当然是可以的。方法如下:用File菜单下的OPEN打开dclusr40.dpk文件,单击ADD按钮,在打开的对话框中选择ADD UNIT页面,按Unit file name后的“Browse”按钮打开组件单元文件,OK即可,用此种方法这样可添加多个组件的单元文件,添加完毕,按一下编译按钮,然后再按Install按钮即可,如果单元文件是编译好的(DCU)可以直接按安装按钮。
4 组件的删除。光会安装可不行,还要会删除呀。很简单,在component菜单下,选择install packages,在列表中找到安装所在的Bpl,按Remove按钮,ok!再把Bpl文件删掉就彻底了,如果不删除BPL文件,下次可以按安装BPL组件的方法再安装使用
CSS全称Cascading Style Sheet。层叠式样式表。
一、CSS的四种实现方式:
1.内嵌式:
2.外链式:
3.导入式
4.属性式:
二.CSS的定义:
选择对象{属性1:值1;属性2:值2;属性3:值3;属性n:值n……}
如:
td{font-size:12px;color:#FFFF00}
.myname{font-size:12px;color:#FFFF00}
a:hover{font-size:12px;color:#FFFF00;text-decoration: underline;}
三.四种选择对象
1.HTML selector (TagName)
2.class selector (.NAME)
3.ID selector (#IDname)
4.特殊对象 (a:hover a:link a:visited a:active)
1.HTML selector
HTML selector就是HTML的置标符,如:DIV、TD、H1。HTML selector的作用范围是应用了该样式的所有页面中的所有该置标符。
例:
td
{
color: #FF0000;
}
-->
注意:代码的作用是使表格单元格内文字自动变红色。
2.class selector
定义class selector需要往其名称其加一个点“.”。如“.classname”。class selector的作用范围是所有包含“class="classname"”的置标符。
例:
.fontRed
{
color: #FF0000;
}
-->
注意:在第二个中没有“class="fontRed"”,所以文字没有变红色。
3.ID selector
定义ID selector需要往其名称其加一个点“#”。如“#IDname”。ID selector的作用范围是所有包含“ID="classname"”的置标符。
例:
#fontRed
{
color: #FF0000;
}
-->
注意:在第二个中没有“ID="fontRed"”,所以文字没有变红色。
4.特殊对象
特殊对象包括四种,是针对链接对象设置的:
a:hover 鼠标移上时的超链接
a:link 常规,非访问超链接
a:visited 访问过的超链接
a:active 鼠标点击时的超链接
特殊对象的作用范围是所有置标符(这句话有待商榷,因为下面很快就有一种方法可以把“所有”两个字推翻)。
例:
a:hover
{
color: #0000FF;
text-decoration: underline;
}
-->
注意下面,很有用!!!
a.classname:hover
a#IDname:hover
这两种写法,是分别配合.classname与#IDname使用的。它的作用范围变成了所有包含“class="classname"”或“ID="IDname"”的置标符。这种写法,可以帮助你在同一页面中实现多种a:hover效果,可以看一下艺网的主页上导航栏文字与普通文章标题在鼠标时的区别。
四.应用:
1.置标符 自动应用
2.特制类 class="NAME"
3.ID ID="IDname"
4.特殊对象 自动应用
五.CSS属性
CSS的属性有很多,像上文中用到最多的color,表示文字的颜色。background-color表示背景色。这个是最主要的,但是因为没有什么难度,参考一下相关手册就可以了。
CSS 标签属性/属性参考
这里列出了目前支持的样式表(CSS)标签属性。
CSS 标签属性/属性
行为属性 behavior
字体和文本属性 direction
direction
font
font-family
font-size
font-style
font-variant
font-weight
ime-mode
layout-grid
layout-grid-char
layout-grid-line
layout-grid-mode
layout-grid-type
letter-spacing
line-break
line-height
min-height
ruby-align
ruby-overhang
ruby-position
text-align
text-autospace
text-decoration
text-indent
text-justify
text-kashida-space
text-overflow
text-transform
text-underline-position
unicode-bidi
vertical-align
white-space
word-break
word-wrap
writing-mode
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>二?dropdown?出菜?--A CROSS BROWSER DROP DOWN CASCADING VALIDATING MENU</title>
<style type="text/css">
/* common styling */
/* set up the overall width of the menu div, the font and the margins */
.menu {
font-family: arial, sans-serif;
width:750px;
margin:0;
margin:50px 0;
}
/* remove the bullets and set the margin and padding to zero for the unordered list */
.menu ul {
padding:0;
margin:0;
list-style-type: none;
}
/* float the list so that the items are in a line and their position relative so that the drop down list will appear in the right place underneath each list item */
.menu ul li {
float:left;
position:relative;
}
/* style the links to be 104px wide by 30px high with a top and right border 1px solid white. Set the background color and the font size. */
.menu ul li a, .menu ul li a:visited {
display:block;
text-align:center;
text-decoration:none;
width:104px;
height:30px;
color:#000;
border:1px solid #fff;
border-width:1px 1px 0 0;
background:#c9c9a7;
line-height:30px;
font-size:11px;
}
/* make the dropdown ul invisible */
.menu ul li ul {
display: none;
}
/* specific to non IE browsers */
/* set the background and foreground color of the main menu li on hover */
.menu ul li:hover a {
color:#fff;
background:#b3ab79;
}
/* make the sub menu ul visible and position it beneath the main menu list item */
.menu ul li:hover ul {
display:block;
position:absolute;
top:31px;
left:0;
width:105px;
}
/* style the background and foreground color of the submenu links */
.menu ul li:hover ul li a {
display:block;
background:#faeec7;
color:#000;
}
/* style the background and forground colors of the links on hover */
.menu ul li:hover ul li a:hover {
background:#dfc184;
color:#000;
}
</style>
<!--[if lte IE 6]>
<style type="text/css">
/* styling specific to Internet Explorer IE5.5 and IE6. Yet to see if IE7 handles li:hover */
/* Get rid of any default table style */
table {
border-collapse:collapse;
margin:0;
padding:0;
}
/* ignore the link used by 'other browsers' */
.menu ul li a.hide, .menu ul li a:visited.hide {
display:none;
}
/* set the background and foreground color of the main menu link on hover */
.menu ul li a:hover {
color:#fff;
background:#b3ab79;
}
/* make the sub menu ul visible and position it beneath the main menu list item */
.menu ul li a:hover ul {
display:block;
position:absolute;
top:32px;
left:0;
width:105px;
}
/* style the background and foreground color of the submenu links */
.menu ul li a:hover ul li a {
background:#faeec7;
color:#000;
}
/* style the background and forground colors of the links on hover */
.menu ul li a:hover ul li a:hover {
background:#dfc184;
color:#000;
}
</style>
<![endif]-->
</head>
<body>
<div class="menu">
<ul>
<li><a class="hide" href="../menu/index.html">DEMOS</a>
<!--[if lte IE 6]>
<a href="../menu/index.html">DEMOS
<table><tr><td>
<![endif]-->
<ul>
<li><a href="../menu/zero_dollars.html" title="The zero dollar ads page">zero dollars</a></li>
<li><a href="../menu/embed.html" title="Wrapping text around images">wrapping text</a></li>
<li><a href="../menu/form.html" title="Styling forms">styled form</a></li>
<li><a href="../menu/nodots.html" title="Removing active/focus borders">active focus</a></li>
<li><a href="../menu/shadow_boxing.html" title="Multi-position drop shadow">shadow boxing</a></li>
<li><a href="../menu/old_master.html" title="Image Map for detailed information">image map</a></li>
<li><a href="../menu/bodies.html" title="fun with background images">fun backgrounds</a></li>
<li><a href="../menu/fade_scroll.html" title="fade-out scrolling">fade scrolling</a></li>
<li><a href="../menu/em_images.html" title="em size images compared">em sized images</a></li>
</ul>
<!--[if lte IE 6]>
</td></tr></table>
</a>
<![endif]-->
</li>
<li><a class="hide" href="index.html">MENUS</a>
<!--[if lte IE 6]>
<a href="index.html">MENUS
<table><tr><td>
<![endif]-->
<ul>
<li><a href="spies.html" title="a coded list of spies">spies menu</a></li>
<li><a href="vertical.html" title="a horizontal vertical menu">vertical menu</a></li>
<li><a href="expand.html" title="an enlarging unordered list">enlarging list</a></li>
<li><a href="enlarge.html" title="an unordered list with link images">link images</a></li>
<li><a href="cross.html" title="non-rectangular links">non-rectangular</a></li>
<li><a href="jigsaw.html" title="jigsaw links">jigsaw links</a></li>
<li><a href="circles.html" title="circular links">circular links</a></li>
</ul>
<!--[if lte IE 6]>
</td></tr></table>
</a>
<![endif]-->
</li>
<li><a class="hide" href="../layouts/index.html">LAYOUTS</a>
<!--[if lte IE 6]>
<a href="../layouts/index.html">LAYOUTS
<table><tr><td>
<![endif]-->
<ul>
<li><a href="../layouts/bodyfix.html" title="Cross browser fixed layout">Fixed 1</a></li>
<li><a href="../layouts/body2.html" title="Cross browser fixed layout">Fixed 2</a></li>
<li><a href="../layouts/body4.html" title="Cross browser fixed layout">Fixed 3</a></li>
<li><a href="../layouts/body5.html" title="Cross browser fixed layout">Fixed 4</a></li>
<li><a href="../layouts/minimum.html" title="A simple minimum width layout">minimum width</a></li>
</ul>
<!--[if lte IE 6]>
</td></tr></table>
</a>
<![endif]-->
</li>
<li><a class="hide" href="../boxes/index.html">BOXES</a>
<!--[if lte IE 6]>
<a href="../boxes/index.html">BOXES
<table><tr><td>
<![endif]-->
<ul>
<li><a href="spies.html" title="a coded list of spies">spies menu</a></li>
<li><a href="vertical.html" title="a horizontal vertical menu">vertical menu</a></li>
<li><a href="expand.html" title="an enlarging unordered list">enlarging list</a></li>
<li><a href="enlarge.html" title="an unordered list with link images">link images</a></li>
<li><a href="cross.html" title="non-rectangular links">non-rectangular</a></li>
<li><a href="jigsaw.html" title="jigsaw links">jigsaw links</a></li>
<li><a href="circles.html" title="circular links">circular links</a></li>
</ul>
<!--[if lte IE 6]>
</td></tr></table>
</a>
<![endif]-->
</li>
<li><a class="hide" href="../mozilla/index.html">MOZILLA</a>
<!--[if lte IE 6]>
<a href="../mozilla/index.html">MOZILLA
<table><tr><td>
<![endif]-->
<ul>
<li><a href="../mozilla/dropdown.html" title="A drop down menu">drop down menu</a></li>
<li><a href="../mozilla/cascade.html" title="A cascading menu">cascading menu</a></li>
<li><a href="../mozilla/content.html" title="Using content:">content:</a></li>
<li><a href="../mozilla/moxbox.html" title=":hover applied to a div">mozzie box</a></li>
<li><a href="../mozilla/rainbow.html" title="I can build a rainbow">rainbow box</a></li>
<li><a href="../mozilla/snooker.html" title="Snooker cue">snooker cue</a></li>
<li><a href="../mozilla/target.html" title="Target Practise">target practise</a></li>
<li><a href="../mozilla/splittext.html" title="Two tone headings">two tone headings</a></li>
<li><a href="../mozilla/shadow_text.html" title="Shadow text">shadow text</a></li>
</ul>
<!--[if lte IE 6]>
</td></tr></table>
</a>
<![endif]-->
</li>
<li><a class="hide" href="../ie/index.html">EXPLORER</a>
<!--[if lte IE 6]>
<a href="../ie/index.html">EXPLORER
<table><tr><td>
<![endif]-->
<ul>
<li><a href="../ie/exampleone.html" title="Example one">example one</a></li>
<li><a href="../ie/weft.html" title="Weft fonts">weft fonts</a></li>
<li><a href="../ie/exampletwo.html" title="Vertical align">vertical align</a></li>
</ul>
<!--[if lte IE 6]>
</td></tr></table>
</a>
<![endif]-->
</li>
<li><a class="hide" href="../opacity/index.html">OPACITY</a>
<!--[if lte IE 6]>
<a href="../opacity/index.html">OPACITY
<table><tr><td>
<![endif]-->
<ul>
<li><a href="../opacity/colours.html" title="colour wheel">opaque colours</a></li>
<li><a href="../opacity/picturemenu.html" title="a menu using opacity">opaque menu</a></li>
<li><a href="../opacity/png.html" title="partial opacity">partial opacity</a></li>
<li><a href="../opacity/png2.html" title="partial opacity II">partial opacity II</a></li>
</ul>
<!--[if lte IE 6]>
</td></tr></table>
</a>
<![endif]-->
</li>
</ul>
<!-- clear the floats if required -->
<div class="clear"> </div>
</div>
</body>
</html>
深入分析ADO.NET中的DataSet对象
[日期:2006-1-6] |
来源: 作者: |
[字体:大 中 小] |
ADO.NET是.Net FrameWork SDK中用以操作数据库的类库的总称。而DataSet类则是ADO.NET中最核心的成员之一,也是各种开发基于.Net平台程序语言开发数据库应用程序最常接触的类。之所以DataSet类在ADO.NET中具有特殊的地位,是因为DataSet在ADO.NET实现从数据库抽取数据中起到关键作用,在从数据库完成数据抽取后,DataSet就是数据的存放地,它是各种数据源中的数据在计算机内存中映射成的缓存,所以有时说DataSet可以看成是一个数据容器。同时它在客户端实现读取、更新数据库等过程中起到了中间部件的作用(DataReader只能检索数据库中的数据)。
各种.Net平台开发语言开发数据库应用程序,一般并不直接对数据库操作(直接在程序中调用存储过程等除外),而是先完成数据连接和通过数据适配器填充DataSet对象,然后客户端再通过读取DataSet来获得需要的数据,同样更新数据库中数据,也是首先更新DataSet,然后再通过DataSet来更新数据库中对应的数据的。可见了解、掌握ADO.NET,首先必须了解、掌握DataSet。DataSet主要有三个特性:
1. 独立性。DataSet独立于各种数据源。微软公司在推出DataSet时就考虑到各种数据源的多样性、复杂性。在.Net中,无论什么类型数据源,它都会提供一致的关系编程模型,而这就是DataSet。
2. 离线(断开)和连接。DataSet既可以以离线方式,也可以以实时连接来操作数据库中的数据。这一点有点像ADO中的RecordSet。
3. DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。
一.DataSet对象的结构模型及和RecordSet的比较 虽说ADO.NET是 ADO在.Net平台下得后继版本,但二者的区别是很大的。突出表现在ADO中的RecordSet对象和ADO.NET中的DataSet对象。RecordSet其实也是非常灵活的一个对象,微软公司推出它也是煞费苦心,如:RecordSet可以离线操作数据库,性能优良,效率较高等等这些都让当时的程序员为之一振。RecordSet虽然已经很复杂,但DataSet却比RecordSet复杂的多,我们知道每一DataSet往往是一个或多个DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关DataTable对象中数据的关系信息组成。而RecordSet只能存放单张数据表,虽然这张数据表可以由几张数据表JOIN生成。所以有些时候说,RecordSet更类似于DataSet中的DataTable。DataSet对象的结构模型如图01所示:
图01:DataSet对象的结构模型图
|
通过图01可见在DataSet对象结构还是非常复杂的,在DataSet对象的下一层中是DataTableCollection对象、DataRelationCollection对象和ExtendedProperties对象。上文已经说过,每一个DataSet对象是由若干个DataTable对象组成。DataTableCollection就是管理DataSet中的所有DataTable对象。表示DataSet中两个DataTable对象之间的父/子关系是DataRelation对象。它使一个DataTable 中的行与另一个DataTable中的行相关联。这种关联类似于关系数据库中数据表之间的主键列和外键列之间的关联。DataRelationCollection对象就是管理DataSet中所有DataTable之间的DataRelation关系的。在DataSet中DataSet、DataTable和DataColumn都具有ExtendedProperties属性。ExtendedProperties其实是一个属性集(PropertyCollection),用以存放各种自定义数据,如生成数据集的SELECT语句等。
二.使用DataSet: DataSet其实就是数据集,上文已经说过DataSet是把数据库中的数据映射到内存缓存中的所构成的数据容器,对于任何数据源,它都提供一致的关系编程模型。在DataSet中既定义了数据表的约束关系以及数据表之间的关系,还可以对数据表中的数据进行排序等。DataSet使用方法一般有三种:
1. 把数据库中的数据通过DataAdapter对象填充DataSet。
2. 通过DataAdapter对象操作DataSet实现更新数据库。
3. 把XML数据流或文本加载到DataSet。
下面就来详细探讨以上DataSet使用方法的具体实现,使用语言是C#。
1. 把数据库中的数据通过DataAdapter对象填充DataSet:
掌握DataSet使用方法必须掌握ADO.NET另外一个核心常用成员--数据提供者(Data Provider)。数据提供者(也称为托管提供者Managed Provider)是一个类集合,在.Net FrameWork SDK 1.0中数据提供者分为二种:The SQL Server .NET Data Provider和The OLE DB .NET Data Provider。而到了.Net FrameWork SDK 1.1时,ADO.NET中又增加了The ODBC .NET Data Provider和 The Oracle .NET Data Provider二个数据提供者。The SQL Server .NET Data Provider的操作数据库对象只限于Sql Server 7.0及以上版本,Oracle .NET Data Provider的操作数据库对象只限于Oracle 8.1.7及以上版本。而The OLE DB .NET Data Provider和The ODBC .NET Data Provider可操作的数据库类型就相对多了许多,只要它们在本地分别提供Ole Db提供程序和ODBC提供程序。
在这些数据提供者中都有一个DataAdapter类,如:OLE DB .NET Framework 数据提供者中是 OleDbDataAdapter类,The SQL Server .NET Framework 数据提供者中是SqlDataAdapter类,The ODBC .NET Framework 数据提供者中是OdbcDataAdapter类。通过这些DataAdapter就能够实现从数据库中检索数据并填充 DataSet 中的表。
DataAdapter填充DataSet的过程分为二步:首先通过DataAdapter的SelectCommand属性从数据库中检索出需要的数据。SelectCommand其实是一个Command对象。然后再通过DataAdapter的Fill方法把检索来的数据填充 DataSet。代码清单01就是以Microsoft SQL Server 中的Northwind数据库为对象,C#使用The SQL Server .NET Data Provider中的SqlDataAdapter填充DataSet的具体实现方法:
代码清单01:
SqlConnection sqlConnection1 = new SqlConnection ( "Data Source=localhost ;Integrated Security=SSPI ;Initial Catalog=Northwind" ) ; //创建数据连接 SqlCommand selectCMD = new SqlCommand ( "SELECT CustomerID , CompanyName FROM Customers" , sqlConnection1 ) ; //创建并初始化SqlCommand对象 SqlDataAdapter sqlDataAdapter1 = new SqlDataAdapter ( ) ; custDA.SelectCommand = selectCMD ; sqlConnection.Open ( ) ; //创建SqlDataAdapter对象,并根据SelectCommand属性检索数据 DataSet dsDataSet1 = new DataSet ( ) ; sqlDataAdapter1.Fill ( dsDataSet1 , "Customers" ) ; //使用SqlDataAdapter的Fill方法填充DataSet sqlConnection.Close ( ) ; //关闭数据连接 |
对于其他数据提供者的DataAdapter,具体的实现检索数据库中的数据并填充DataSet的实现方法类似于以上方法。
2. 通过DataAdapter对象操作DataSet实现更新数据库:
DataAdapter是通过其Update方法实现以DataSet中数据来更新数据库的。当DataSet实例中包含数据发生更改后,此时调用Update方法,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE),并以此命令来更新数据库中的数据。如果DataSet中的DataTable是映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。使用DataAdapter对象操作DataSet实现更新数据库具体的实现方法,只需把下面的代码清单02添加到代码清单01之后,二者合并即可实现删除Customers数据表中第一行数据:
代码清单02:
SqlCommandBuilder sqlCommandBuilder1 = new SqlCommandBuilder ( sqlDataAdapter1 ) ; //以sqlDataAdapter1为参数来初始化SqlCommandBuilder实例 dsDataSet1.Tables["Customers"].Rows[0].Delete ( ) ; //删除DataSet中删除数据表Customers中第一行数据 sqlDataAdapter1.Update ( dsDataSet1 ,"Customers" ) ; //调用Update方法,以DataSet中的数据更新从数据库 dsDataSet1.Tables["Customers"].AcceptChanges ( ) ; |
由于不了解DataSet结构和与数据库关系,很多初学者往往只是更新了DataSet中的数据,就认为数据库中的数据也随之更新,所以当打开数据库浏览时发现并没有更新数据,都会比较疑惑,通过上面的介绍,疑惑应当能够消除了。
3. XML和DataSet:
DataSet中的数据可以从XML数据流或文档创建。并且.Net Framework可以控制加载XML数据流或文档中那些数据以及如何创建DataSet的关系结构。加载XML数据流和文档到DataSet中是可使用DataSet对象的ReadXml方法(注意:ReadXml来加载非常大的文件,则性能会有所下降)。ReadXml 方法将从文件、流或 XmlReader 中进行读取,并将 XML 的源以及可选的 XmlReadMode 参数用作参数。该ReadXml方法读取 XML 流或文档的内容并将数据加载到 DataSet 中。根据所指定的XmlReadMode和关系架构是否已存在,它还将创建DataSet的关系架构。
三.DataSet和数据绑定(DataBinding)
数据绑定是数据绑定是绑定技术中使用最频繁,也是最为重要的技术,也可以说是各种.Net开发语言开发数据库应用程序最需要掌握的基本的知识之一。数据绑定之所以很重要,是因为在.Net FrameWork SDK中并没有提供数据库开发的相关组件,即如:DbTextBox、DbLabel等用于数据库开发的常用组件在.Net FrameWork SDK中都没有。而数据绑定技术则能够把TextBox组件"改造"成DbTextBox组件,把Label组件"改造"成DbLabel组件等等。所有这些都与DataSet有直接关系。
数据绑定分成二类:简单型数据绑定和复杂型数据绑定。适用于简单型数据绑定组件一般有Lable、TextBox等,适用于复杂性数据绑定的组件一般有DataGrid、ListBox、ComboBox等。其实简单型数据绑定和复杂性数据绑定并没有明确的区分,只是在组件进行数据绑定时,一些结构复杂一点的组件在数据绑定时操作步骤相近,而另外一些结构简单一点的组件在数据绑定时也比较类似。于是也就产生了二个类别。以下就结合TextBox组件和DataGrid组件分别探讨DataSet在实现简单型数据绑定和复杂性数据绑定作用和具体实现方法。
1. 简单型数据绑定:
简单型数据绑定一般使用这些组件中的DataBindings属性的Add方法把DataSet中某一个DataTable中的某一行和组件的某个属性绑定起来,从而达到显示数据的效果。TextBox组件的数据绑定具体实现方法是在代码清单01后,再添加代码清单03中的代码,代码清单03中的代码是把DataSet中的Customers 数据表中的"CustomerID"的数据和TextBox的Text属性绑定起来,这样DbTextBox就产生了。其他适用于简单型数据绑定组件数据绑定的方法类似与此操作:
代码清单03:
textBox1.DataBindings.Add ( "Text" , dsDataSet1, " Customers. CustomerID " ) ; |
2. 复杂性数据绑定:
复杂性数据绑定一般是设定组件的DataSource属性和DisplayMember属性来完成数据绑定的。DataSource属性值一般设定为要绑定的DataSet,DisplayMember属性值一般设定为要绑定的数据表或数据表中的某一列。DataGrid组件的数据绑定的一般实现方法是在代码清单01后,再添加代码清单04中的代码,代码清单04的功能是把DataSet中的Customers 数据表和DataGrid绑定起来。其他适用于复杂性数据绑定的组件实现数据绑定的方法类似此操作:
代码清单04:
dataGrid1.DataSource = dsDataSet1 ; dataGrid1.DataMember = " Customers " ; |
四.总结 DataSet类是ADO.NET中一个非常重要的核心成员,它是数据库中的数据在本地计算机中映射成的缓存。对DataSet的任何操作,都是在计算机缓存中完成的。理解这一点是掌握DataSet的第一步。DataSet虽然结构复杂。但只要区分DataSet对象中各个组成部件及其相互关系,掌握也不算太困难。本文覆盖了DataSet的特性、结构、以及具体的使用方法等等,相信这些对您掌握这个ADO.NET中核心成员是有所帮助。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>AgetimeMenu Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
.agetime_bar{
position:absolute;top:0px;left:0px;height:22px;width:100%;border:1px outset;background-color:RGB(212,208,200);z-index:98;
}
.agetime_barItem{
width:60px;height:20px;border:1px solid RGB(212,208,200);text-align:left;padding-left:10px;
background:RGB(212,208,200);color:#000000;font-size:9pt;
}
.agetime_barItemDown{
width:60px;height:20px;border:1px inset RGB(212,208,200);text-align:left;padding-left:10px;
background:#F0F0F0;color:#000000;font-size:9pt;
}
.agetime_barItemHover{
width:60px;height:20px;border:1 outset;text-align:left;padding-left:10px;
background:#F0F0F0;color:#000000;font-size:9pt;
}
.agetime_pad{
cursor:default;font-size:9pt;width:100%;
}
.agetime_padItem{
width:100%;height:18px;border:1px solid RGB(212,208,200);text-align:left;padding-left:10px;
background:RGB(212,208,200);color:#000000;font-size:9pt;
}
.agetime_padItemFalse{
padding-left:10px;font-size:9pt; color:#808080;
}
.agetime_padItemFalseHover{
padding-left:10px;font-size:9pt; color:#808080;background-color:#333366;
}
.agetime_padItemHover{
width:100%;height:18px;text-align:left;padding-left:10px;
background-color:#333366;color:#FFFFFF;font-size:9pt;
}
.agetime_padItemDown{
width:100%;height:18px;text-align:left;padding-left:10px;border:1px inset;
background-color:#9999CC;color:#FFFFFF;font-size:9pt;
}
.agetime_hr{
border:1px inset;
}
.agetime_board{
background-color:RGB(212,208,200);border:2px outset;
}
</style>
</head>
<body>
<script language="javascript">
var menu = agetimeMenu("agetime",
[
[
["OPEN",null,null,true,"OPEN FILE"], //顯示文字,方法,命令,狀態,狀態顯示文字
["打開",null,null,false,"打開文件"],
["--"],
["你好","js","alert('Hello')",true,"一聲問候"],
["新窗口","ABC","about:blank",true,"彈出ABC窗口"],
["空白",null,"about:blank",true,"在當前窗口顯示空白頁"]
],
[
["編輯",null,null,false,"打開文件"],
["撤消",null,null,true,"打開文件"],
["重做",null,null,true,"打開文件"]
],
[
["文件","js","alert('無子菜單')",true,"打開文件"]
]
]
);
function agetimeMenu(id,array){
var menu=this;
menu.pad=null; //裝載各個子菜單
menu.barItems=[]; //菜單條的各位按鈕
menu.pads=[]; //每個子菜單為一個table存放于menu.pad上;
menu.selectedIndex=-1; //菜單條選中按鈕的索引值
menu.board=null; //子菜單面板
//建立菜單條
this.crtMenuBar=function(){
var len=array.length;
menu.bar = document.body.appendChild(document.createElement('div'));
menu.bar.className=id+"_bar";
for(var i=0;i<len;i++){
menu.barItems[i]=menu.addMenuBarItem(array[i][0],i);
menu.addMenuPad(array[i],i);
}
}
//子菜單
this.addMenuPad=function(ary,index){
var len=ary.length;
var pad=menu.crtElement("table",menu.pad);
pad.cellSpacing=1; pad.cellPadding=0;
pad.className=id+"_pad";
pad.style.display="none";
for(var i=1;i<len;i++){
var Row=pad.insertRow(i-1);
menu.addMenuPadItem(ary[i],Row);
}
menu.pads[index]=pad;
}
//各子菜單按鈕
this.addMenuPadItem=function(ary,Row){
var Cell=Row.insertCell(0);
if(ary[0]!="--"){
Cell.innerText=ary[0];
if(ary[3]){ //有效狀態;
Cell.className=id+"_padItem";
Cell.onmouseover=function(){
Cell.className=id+"_padItemHover";
window.status=ary[4];
}
Cell.onmouseout=function(){
Cell.className=id+"_padItem";
window.status="";
}
Cell.onmousedown=function(){ Cell.className=id+"_padItemDown"; }
Cell.onmouseup=function(){
Cell.className=id+"_padItemHover";
menu.hideMenu();
menu.execute(ary);
}
}
else{ //按鈕無效;
Cell.className=id+"_padItemFalse";
Cell.onmouseover=function(){
Cell.className=id+"_padItemFalseHover";
window.status=ary[4];
}
Cell.onmouseout=function(){
Cell.className=id+"_padItemFalse";
window.status="";
}
}
}
else{
var hr=menu.crtElement("hr",Cell);
hr.className=id+"_hr";
}
Cell.onclick=function(){
event.cancelBubble=true;
}
}
//菜單條的按鈕
this.addMenuBarItem=function(ary,index){
var item=menu.crtElement("button",menu.bar);
item.value=ary[0];
item.disabled=!ary[3];
item.className=id+"_barItem";
item.onmouseover=function(){
if(menu.selectedIndex==-1){
item.className=id+"_barItemHover";
}
else{
menu.barItems[selectedIndex].className=id+"_barItem";
item.className=id+"_barItemDown";
menu.showMenu(index);
}
window.status=ary[4];
}
item.onmouseout=function(){
if(menu.selectedIndex==-1) item.className=id+"_barItem";
window.status="";
}
item.onclick=function(){
event.cancelBubble=true;
if(menu.selectedIndex==-1){
item.className=id+"_barItemDown";
menu.showMenu(index);
}
else{
menu.hideMenu();
item.className=id+"_barItemHover";
}
menu.execute(ary);
item.blur();
}
return item;
}
//顯示子菜單
this.showMenu=function(index){
if(menu.selectedIndex!=-1) menu.pads[selectedIndex].style.display="none";
menu.board.style.pixelLeft=menu.barItems[index].offsetLeft+2;
//menu.board.style.pixelHeight="";
if(menu.pads[index].rows.length>0) menu.board.style.display="";
else menu.board.style.display="none";
menu.pads[index].style.display="";
menu.selectedIndex=index;
}
//隱藏子菜單
this.hideMenu=function(){
if(menu.selectedIndex==-1) return;
menu.barItems[menu.selectedIndex].className=id+"_barItem";
menu.pads[selectedIndex].style.display="none";
menu.selectedIndex=-1;
menu.board.style.display="none";
}
//執行菜單命令;
this.execute=function(ary){
if(ary[2]==null) return;
if(ary[1]=="js") { eval(ary[2]); menu.hideMenu(); }
else if(ary[1]==null || ary[1].toLowerCase=="_self") location.href=ary[2];
else{ var x=window.open(ary[2],ary[1]); x.focus(); }
}
//建立子菜單的顯示面板
this.crtMenuBoard=function(){
document.write(
"<div id='"+id+"_board' style='position:absolute;width:160px;height:10px;left:0px;top:20px;background-color:#666666;z-index:99;display:none;'>"+
"<div style='position:absolute;width:100%;height:100%;left:0px;top:0px;'>"+
"<iframe id='"+id+"_frame' name='"+id+"_frame' width='100%' height='100%' frameborder='0' scrolling='no'></iframe>"+
"</div>"+
"<div id='"+id+"_pad' style='position:absolute;width:100%;height:100%;left:0px;top:0px;'></div>"+
"</div>"
);
menu.board=document.getElementById(id+"_board");
menu.pad=document.getElementById(id+"_pad");
menu.pad.className=id+"_board";
menu.pad.onselectstart=function(){ return false;}
}
//增加對像的一個子元素
this.crtElement=function(el,p){
return p.appendChild(document.createElement(el));
}
//安裝菜單;
this.setup=function(){
menu.crtMenuBoard();
menu.crtMenuBar();
document.attachEvent("onclick",menu.hideMenu);
}
menu.setup();
}
</script>
</body>
</html>
网页代码常用小技巧!
1. oncontextmenu=window.event.returnvalue=false 将彻底屏蔽鼠标右键
〈table border oncontextmenu=return(false)〉〈td〉no〈/table〉 可用于Table
2. 〈body onselectstart=return false〉 取消选取、防止复制
3. onpaste=return false 不准粘贴
4. oncopy=return false; oncut=return false; 防止复制
5. 〈link rel=Shortcut Icon href=favicon.ico〉 IE地址栏前换成自己的图标
6. 〈link rel=Bookmark href=favicon.ico〉 可以在收藏夹中显示出你的图标
7. 〈input style=ime-mode:-Disabled〉 关闭输入法
8. 永远都会带着框架
〈script language=javascript〉〈!--
if (window == top)top.location.href = frames.htm; //frames.htm为框架网页
// --〉〈/script〉
9. 防止被人frame
〈SCRIPT LANGUAGE=javascript〉〈!--
if (top.location != self.location)top.location=self.location;
// --〉〈/SCRIPT〉
10. 网页将不能被另存为
〈noscript〉〈iframe src=*.html〉〈/iframe〉〈/noscript〉
11. 〈input type=button value=查看网页源代码
onclick=window.location = `view-source:`+ http://www.51js.com/`;〉
12.删除时确认
〈a href=`javascript:if(confirm(确实要删除吗?))location=boos.asp?&areyou=删除&page=1`〉删
除〈/a〉
13. 取得控件的绝对位置
//javascript
〈script language=javascript〉
function getIE(E){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert(top=+t+/nleft=+l);
}
〈/script〉
//VBScript
〈script language=VBScript〉〈!--
function getIE()
dim t,l,a,b
set a=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
while a.tagName〈〉BODY
set a = a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox top=&t&chr(13)&left=&l,64,得到控件的位置
end function
--〉〈/script〉
14. 光标是停在文本框文字的最后
〈script language=javascript〉
function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart(`character`,e.value.length);
r.collapse(true);
r.select();
}
〈/script〉
〈input type=text name=text1 value=123 onfocus=cc()〉
15. 判断上一页的来源
javascript:
document.referrer
16. 最小化、最大化、关闭窗口
〈object id=hh1 classid=clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11〉
〈param name=Command value=Minimize〉〈/object〉
〈object id=hh2 classid=clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11〉
〈param name=Command value=Maximize〉〈/object〉
〈OBJECT id=hh3 classid=clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11〉
〈PARAM NAME=Command value=Close〉〈/OBJECT〉
〈input type=button value=最小化 onclick=hh1.Click()〉
〈input type=button value=最大化 onclick=hh2.Click()〉
〈input type=button value=关闭 onclick=hh3.Click()〉
本例适用于IE
17.屏蔽功能键Shift,Alt,Ctrl
〈script〉
function look(){
if(event.shiftKey)
alert(禁止按Shift键!); //可以换成ALT CTRL
}
document.onkeydown=look;
〈/script〉
18. 网页不会被缓存
〈META HTTP-EQUIV=pragma CONTENT=no-cache〉
〈META HTTP-EQUIV=Cache-Control CONTENT=no-cache, must-revalidate〉
〈META HTTP-EQUIV=expires CONTENT=Wed, 26 Feb 1997 08:21:57 GMT〉
或者〈META HTTP-EQUIV=expires CONTENT=0〉
19.怎样让表单没有凹凸感?
〈input type=text style=border:1 solid #000000〉
或
〈input type=text style=border-left:none; border-right:none; border-top:none; border-bottom:
1 solid #000000〉〈/textarea〉
20.〈div〉〈span〉&〈layer〉的区别?
〈div〉(division)用来定义大段的页面元素,会产生转行
〈span〉用来定义同一行内的元素,跟〈div〉的唯一区别是不产生转行
〈layer〉是ns的标记,ie不支持,相当于〈div〉
21.让弹出窗口总是在最上面:
〈body onblur=this.focus();〉
22.不要滚动条?
让竖条没有:
〈body style=`overflow:-Scroll;overflow-y:hidden`〉
〈/body〉
让横条没有:
〈body style=`overflow:-Scroll;overflow-x:hidden`〉
〈/body〉
两个都去掉?更简单了
〈body scroll=no〉
〈/body〉
23.怎样去掉图片链接点击后,图片周围的虚线?
〈a href=# onFocus=this.blur()〉〈img src=logo.jpg border=0〉〈/a〉
24.电子邮件处理提交表单
〈form name=form1 method=post action=mailto:****@***.com enctype=text/plain〉
〈input type=submit〉
〈/form〉
25.在打开的子窗口刷新父窗口的代码里如何写?
window.opener.location.reload()
26.如何设定打开页面的大小
〈body onload=top.resizeTo(300,200);〉
打开页面的位置〈body onload=top.moveBy(300,200);〉
27.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动
〈style〉
body
{background-image:url(logo.gif); background-repeat:no-repeat;
background-position:center;background-attachment: fixed}
〈/style〉
28. 检查一段字符串是否全由数字组成
〈script language=javascript〉〈!--
function checkNum(str){return str.match(//D/)==null}
alert(checkNum(1232142141))
alert(checkNum(123214214a1))
// --〉〈/script〉
29. 获得一个窗口的大小
document.body.clientWidth; document.body.clientHeight
30. 怎么判断是否是字符
if (/[^/x00-/xff]/g.test(s)) alert(含有汉字);
else alert(全是字符);
31.TEXTAREA自适应文字行数的多少
〈textarea rows=1 name=s1 cols=27 onpropertychange=this.style.posHeight=this.scrollHeight〉
〈/textarea〉
32. 日期减去天数等于第二个日期
〈script language=javascript〉
function cc(dd,dadd)
{
//可以加上错误处理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(A)
alert(a.getFullYear() + 年 + (a.getMonth() + 1) + 月 + a.getDate() + 日)
}
cc(12/23/2002,2)
〈/script〉
33. 选择了哪一个Radio
〈HTML〉〈script language=vbscript〉
function checkme()
for each ob in radio1
if ob.checked then window.alert ob.value
next
end function
〈/script〉〈BODY〉
〈INPUT name=radio1 type=radio value=style checked〉style
〈INPUT name=radio1 type=radio value=barcode〉Barcode
〈INPUT type=button value=check onclick=checkme()〉
〈/BODY〉〈/HTML〉
34.脚本永不出错
〈SCRIPT LANGUAGE=javascript〉
〈!-- Hide
function killErrors() {
return true;
}
window.onerror = killErrors;
// --〉
〈/SCRIPT〉
35.ENTER键可以让光标移到下一个输入框
〈input onkeydown=if(event.keyCode==13)event.keyCode=9〉
36. 检测某个网站的链接速度:
把如下代码加入〈body〉区域中:
〈script language=javascript〉
tim=1
setInterval(tim++,100)
b=1
var autourl=new Array()
autourl[1]=http://www.njcatv.net/;
autourl[2]=javacool.3322.net
autourl[3]=http://www.sina.com.cn/;
autourl[4]=http://www.nuaa.edu.cn/;
autourl[5]=http://www.cctv.com/;
function butt(){
document.write(〈form name=autof〉)
for(var i=1;i〈autourl.length;i++)
document.write(〈input type=text name=txt+i+ size=10 value=测试中……〉 =》〈input type=text
name=url+i+ size=40〉 =》〈input type=button value=GO
onclick=window.open(this.form.url+i+.value)〉〈br〉)
document.write(〈input type=submit value=刷新〉〈/form〉)
}
butt()
function auto(url){
document.forms[0][url+b].value=url
if(tim〉200)
{document.forms[0][txt+b].value=链接超时}
else
{document.forms[0][txt+b].value=时间+tim/10+秒}
b++
}
function run(){for(var i=1;i〈autourl.length;i++)document.write(〈img
src=http://+autourl+/+Math.random()+ width=1 height=1
onerror=auto(http://;+autourl+`)〉)}
run()〈/script〉
37. 各种样式的光标
auto :标准光标
default :标准箭头
hand :手形光标
wait :等待光标
text :I形光标
vertical-text :水平I形光标
no-drop :不可拖动光标
not-allowed :无效光标
help :?帮助光标
all-scroll :三角方向标
move :移动标
crosshair :十字标
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize
38.页面进入和退出的特效
进入页面〈meta http-equiv=Page-Enter content=revealTrans(duration=x, transition=y)〉
推出页面〈meta http-equiv=Page-Exit content=revealTrans(duration=x, transition=y)〉
这个是页面被载入和调出时的一些特效。Duration表示特效的持续时间,以秒为单位。Transition表示使
用哪种特效,取值为1-23:
0 矩形缩小
1 矩形扩大
2 圆形缩小
3 圆形扩大
4 下到上刷新
5 上到下刷新
6 左到右刷新
7 右到左刷新
8 竖百叶窗
9 横百叶窗
10 错位横百叶窗
11 错位竖百叶窗
12 点扩散
13 左右到中间刷新
14 中间到左右刷新
15 中间到上下
16 上下到中间
17 右下到左上
18 右上到左下
19 左上到右下
20 左下到右上
21 横条
22 竖条
23 以上22种随机选择一种
39.在规定时间内跳转
〈META http-equiv=V=REFRESH content=5;URL=http://www.51js.com〉
40.网页是否被检索
〈meta name=ROBOTS content=属性值〉
其中属性值有以下一些:
属性值为all: 文件将被检索,且页上链接可被查询;
属性值为none: 文件不被检索,而且不查询页上的链接;
属性值为index: 文件将被检索;
属性值为follow: 查询页上的链接;
属性值为noindex: 文件不检索,但可被查询链接;
属性值为nofollow: 文件不被检索,但可查询页上的链接。
41.变换网页的鼠标光标
〈BODY style=CURSOR: url(http://203.73.125.205/~liangmi2/farmfrog01.cur`)〉
42.怎样实现在任务栏显示小图标的效果? (要使用绝对地址)
有些站点,访问时会在地址栏地址前显出小图标,添加到收藏夹后也在收藏栏中显示图标,
这样很好的与其它站点有了区别。
要达到这个效果,先需做出这个图标文件,图像为16*16像素,不要超过16色。文件格式为ico,然后上传至你的网站。
然后,在需要的页面中,加上以下html语句到文件的〈head〉和〈/head〉之间(假设以上ico文件的地址http://happyisland.126.com/icon.ico)。
〈link REL=SHORTCUT ICONhref=http:〖砺剑〗打了个大揖 笑呵呵地说道:大家好,恭喜发财 ! .island.126.com/icon.ico;〉
如果访问者的浏览器是IE5.0,就不需加任何代码,只要将图标文件上传到网站的根目录下即可。
1,META标签里的代码是什么意思?
〈META〉是放于〈HEAD〉与〈/HEAD〉之间的标记.以下是我总结它在网页中最常见的几种。
〈meta name=Keywords content=图片, 新闻, 音乐, 软件〉
该网页的关键字,作用于搜索引擎的登录,事实上它在现在的网站中并没什么用。
〈meta http-equiv=Content-Type content=text/html; charset=gb2312〉
〈meta http-equiv=Content-Type content=text/html; charset=iso-8859-1〉
设定这是 HTML 文件及其编码语系,简体中文网页使用charset=gb2312,繁体中文使用charset=big5,或者不设编码也可,纯英文网页建议使用 iso-8859-1。
〈meta name=GENERATOR content=Microsoft FrontPage 5.0〉
这只表示该网页由什么编辑器写的。
〈meta http-equiv=refresh content=10; url=http://www.hkiwc.com〉
这行较为实用,能于预定秒数内自动转到指定网址。原代码中 10 表示 10秒。
2,怎么改变滚动条的颜色,只有ie5.5版本以上才能支持。
这是使用CSS语言,在次说明一下,它和我的浏览器版本有一定的关系。
scrollbar-arrow-color:上下按钮上三角箭头的颜色。
scrollbar-base-color:滚动条的基本颜色。
scrollbar-dark-shadow-color:立体滚动条强阴影的颜色
scrollbar-face-color:立体滚动条凸出部分的颜色
scrollbar-highlight-color:滚动条空白部分的颜色
scrollbar-shadow-color立体滚动条阴影的颜色。
scrollbar-track-color:#99CC33;
scrollbar-3dlight-color:#A8CBF1;
代码如下:
〈style〉
〈!--
BODY {
scrollbar-face-color:#99CC33;//(立体滚动条凸出部分的颜色)
scrollbar-highlight-color:#A8CBF1;//(滚动条空白部分的颜色)
scrollbar-shadow-color:#A8CBF1;//(立体滚动条阴影的颜色)
scrollbar-arrow-color:#FF9966;//(上下按钮上三角箭头的颜色)
scrollbar-base-color:#A8CBF1; //(滚动条的基本颜色)
scrollbar-darkshadow-color:#A8CBF1; //(立体滚动条强阴影的颜色)
scrollbar-track-color:#99CC33;
scrollbar-3dlight-color:#A8CBF1;
}
--〉
〈/style〉
在这我补充几点:
1.让浏览器窗口永远都不出现滚动条。
〈body style=overflow-x:hidden;overflow-y:hidden〉或〈body style=overflow:hidden〉 或〈body scroll=no〉
2,没有水平滚动条
〈body style=overflow-x:hidden〉
3,没有垂直滚动条
〈body style=overflow-y:hidden〉
3,如何给图片抖动怎做的.
〈SCRIPT language=javascript1.2〉
〈!--
var rector=2
var stopit=0
var a=1
var count=0
function init(which){
stopit=0
shake=which
shake.style.left=0
shake.style.top=0
}
function rattleimage(){
if ((!document.all&&!document.getElementById)||stopit==1||count==100)
return
count++
if (a==1){
shake.style.top=parseInt(shake.style.top)+rector
}
else if (a==2){
shake.style.left=parseInt(shake.style.left)+rector
}
else if (a==3){
shake.style.top=parseInt(shake.style.top)-rector
}
else{
shake.style.left=parseInt(shake.style.left)-rector
}
if (a〈4)
a++
else
a=1
setTimeout(rattleimage(),50)
}
function stoprattle(which){
stopit=1
count=0
which.style.left=0
which.style.top=0
}
//--〉
〈/SCRIPT〉
〈style〉.shakeimage {POSITION: relative}
〈/style〉
〈img src=图片的路径 onmouseout=stoprattle(this) onmouseover=init(this);rattleimage() class=shakeimage〉
4,在DW如何给水平线加颜色。
在DW中没有此项设置,你只能在HTML中加入代码:〈hr color=red noshade〉按F12的预览在能看到。由于在NC中不支持〈hr〉的COLOR属性,所以在DW中没有此项设置。
5,如何在网页中实现flash的全屏播放?
只要在调用swf文件的HTML中将WIDTH和HEIGHT的参数设为100%即可,当然也可以在Flash导出HTML文件的设置中进行设置,方法是:打开File菜单;选Publish Settings弹出导出设置对话框;在HTML标签下的Dimensions选项,下拉后选中Percent(百分比),并在WIDTH 和HEIGHT框中填100.就行了。
6,为什么我在DW中插入的Flash动画缺看不找!
如果你没有正确地安装Dreamweaver和Flash,那么在你预览的时候,Dreamweaver会提示你缺少播放的插件,请你按装InstallAXFlash.exe 并从新启动计算机。现在IE6已经捆绑这个程序。
7,在Flash中,如果屏蔽鼠标右键?FS命令都是什么意思?
fscommand (fullscreen, true/false);(全屏设置,TRUE开,FALSE关)
fscommand (showmenu, true/false);(右键菜单设置,TRUE显示,FALSE不显示)
fscommand (allowscale, true/false);(缩放设置,TRUE自由缩放,FALSE调整画面不影响影片本身的尺寸)
fscommand (trapallkeys, true/false);(快捷键设置,TRUE快捷键开,FALSE快捷键关)
fscommand (exec);(EXE程序调用)
fscommand (quit);(退出关闭窗口)
8,Flash中什么是隐形按钮。
利用button中的hit帧来制作只有感应区域而完全透明的按钮。
9,如何给Flash动画做链接。
Dreamweaver是不能给Flash制作链接的,只能在Flash中用geturl()加链接,然后再插入Dreamweaver中。
10,DW中的层的技巧。
层是可以嵌套的,我个人给大家一个技巧,在层面板中按住CTRL再拖放层到你想去成为其子层的地方就行了,我认为这是最简单直观的方法了。
11,如何改变鼠标的形状?
在Dreamweaver4中CSS样式面板:
按CTR+SHIFT+E--出现样式表对话框,点击NEW,出现编辑对话框,在左边最后一项extensions-cursor 选择你要改的指针形式就可以了,然后把你要想改变的地方运用样式表,如果整页都有在〈body bgcolor=#003063 text=#ffffff id=all〉中加入就行了。
〈span style=cursor:X`〉样例〈/span〉
这里选择(文本)作为对象,还可以自己改为其他的,如link等。
x可以等于=hand(手形)、crosshair(十字)、text(文本光标)、wait(顾名思义啦)、default(默认效果)、help(问号)、e-size(向右箭头)、ne-resize(向右上的箭头)、nw-resize(向左上的箭头)、w-resize(向左的箭头)、sw-resize(左下箭头)、s-resize(向下箭头)、se-resize(向右下箭头)、auto(系统自动给出效果)。
12,用CSS做邮票,看看吧!
〈input type=button value=我象不象邮票? style=height:80px;border:2px dashed #cccccc〉
13,经常上网的朋友可能会到过这样一些网站,一进入首页立刻会弹出一个窗口,怎么做呢!
这javascript代码即可实现,摘录蓝色论坛。
【1、最基本的弹出窗口代码】
其实代码非常简单:
〈SCRIPT LANGUAGE=javascript〉
〈!--
window.open (`page.html`)
--〉
〈/SCRIPT〉
因为着是一段javascripts代码,所以它们应该放?lt;SCRIPT LANGUAGE=javascript〉标签和〈/script〉之间。〈!-- 和 --〉是对一些版本低的浏览器起作用,在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。
window.open (`page.html`) 用于控制弹出新的窗口page.html,如果page.html不与主窗口在同一路径下,前面应写明路径,绝对路径(http://)和相对路径(../)均可。用单引号和双引号都可以,只是不要混用。
这一段代码可以加入HTML的任意位置,〈head〉和〈/head〉之间可以,〈body bgcolor=#003063 text=#ffffff id=all〉间〈/body〉也可以,越前越早执行,尤其是页面代码长,又想使页面早点弹出就尽量往前放。
【2、经过设置后的弹出窗口】
下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。
我们来定制这个弹出的窗口的外观,尺寸大小,弹出的位置以适应该页面的具体情况。
〈SCRIPT LANGUAGE=javascript〉
〈!--
window.open (`page.html`, `newwindow`, `height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no`)
//写成一行
--〉
〈/SCRIPT〉
参数解释:
〈SCRIPT LANGUAGE=javascript〉 js脚本开始;
window.open 弹出新窗口的命令;
`page.html` 弹出窗口的文件名;
`newwindow` 弹出窗口的名字(不是文件名),非必须,可用空``代替;
height=100 窗口高度;
width=400 窗口宽度;
top=0 窗口距离屏幕上方的象素值;
left=0 窗口距离屏幕左侧的象素值;
toolbar=no 是否显示工具栏,yes为显示;
menubar,scrollbars 表示菜单栏和滚动栏。
resizable=no 是否允许改变窗口大小,yes为允许;
location=no 是否显示地址栏,yes为允许;
status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许;
〈/SCRIPT〉 js脚本结束
【3、用函数控制弹出窗口】
下面是一个完整的代码。
〈html〉
〈head〉
〈script LANGUAGE=javascript〉
〈!--
function openwin() { window.open (page.html, newwindow, height=100, width=400, toolbar=
no, menubar=no, scrollbars=no, resizable=no, location=no, status=no)
//写成一行
}
//--〉
〈/script〉
〈/head〉
〈body onload=openwin()〉
…任意的页面内容…
〈/body〉
〈/html〉
这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。
怎么调用呢?
方法一:〈body onload=openwin()〉 浏览器读页面时弹出窗口;
方法二:〈body onunload=openwin()〉 浏览器离开页面时弹出窗口;
方法三:用一个连接调用:
〈a href=# onclick=openwin()〉打开一个窗口〈/a〉
注意:使用的“#”是虚连接。
方法四:用一个按钮调用:
〈input type=button onclick=openwin() value=打开窗口〉
14,没有用表格写的,让大家随便看看,没什么。
〈html〉
〈head〉
〈title〉江南荷花扇面〈/title〉
〈meta http-equiv=Content-Type content=text/html; charset=gb2312〉
〈style type=text/css〉
〈!--
.font1 { font-size: 12px; color: #999999; text-decoration: none}
a { font-size: 12px; color: #999999; text-decoration: none}
a:hover { font-size: 12px; color: #000000; text-decoration: none}
--〉
〈/style〉
〈/head〉
〈body bgcolor=#FFFFFF text=#000000〉
〈div class=font1 style=writing-mode=tb-rl;height:200px width=300〉
〈p〉盛夏 尚 涛
〈p〉〈a href=index.htm〉一夜露痕黄粉香 袁运甫 〈/a〉
〈p〉瑶池昨夜新凉 王金岭
〈p〉一朵白莲随意开 吴冠南
〈p〉新雨迎秋欲满塘 齐辛民
〈p〉十里荷香 齐辛民
〈p〉濯清莲而不妖 卢世曙
〈/div〉
〈/body〉
〈/html〉
15,IE6已支持自定义cursor!
语法格式 cursor:url(图标) //cur或是ani文件.
cur就是WINDOWS中的光标(cursor)文件,光标文件与图标(ICON)文件除了文件头有一个位置的值不同外,实际是一样的。
ani是WINDOWS中的动画光标(图标)文件。
〈style type=text/css〉
〈!--
.unnamed1 { cursor:url(arrow2c.cur)}
--〉
〈/style〉
16,用marquee做的滚动字幕.这也我刚看到论坛的朋友在问。
语法:
align=# | top | middle| bottom //对齐方式)
BEHAVIOR=ALTERNATE | SCROLL | SLIDE //移动的方式
BGCOLOR=color//底色区域颜色
DIRECTION=DOWN | LEFT | RIGHT | UP //移动的方向
Loop=n //循环次数(默认是循环不止)
Scrolldelay=milliseconds//延时
height=# width=# //区域面积
hspace=# vspace=# //空白区域
scrollamount=# //移动的速度
〈marquee align=top behavior=ALTERNATE BGCOLOR=#000000 height=60 width=433 scrollamount=5〉〈/marquee〉
17,在FLASH5中也存在一些字体,打散后变成一团的事是为什么?有解决的办法吗。
这是大家很常见的问题!可能是对字库支持的不好!我个是做成透明的gif图片格式,然后倒入。
18,flash的网页里“加入收藏夹”功能怎么实现?
在as中加getUrl(java script:window.external.addFavorite(http://skydesigner.51.net`,`我的工作室`))
19,在Flash中,文本的动态属性和输入属性的区别。
input text在运行时可被用户或程序改变其值。
ynamic text仅允许被程序修改。
20,怎样在IE中调用Dreamweaver进行编辑.
相信很多在使用WinME或Window2000的朋友,会遇见是个问题。很简单,把我们笔记本程序打开,保存为一个 *.reg 文件。双击它将信息添加到注册表即可。
REGEDIT4
[HKEY_CLASSES_ROOT\.htm\OpenWithList\Dreamweaver]
[HKEY_CLASSES_ROOT\.htm\OpenWithList\Dreamweaver\shell]
[HKEY_CLASSES_ROOT\.htm\OpenWithList\Dreamweaver\shell\edit]
[HKEY_CLASSES_ROOT\.htm\OpenWithList\Dreamweaver\shell\edit\command]
@=\c:\\Program Files\\Macromedia\\Dreamweaver 4\\dreamweaver.exe\ \%1\
21,设置表格虚线。
方法一:作一个1X2的图。半黑半白,再利用表格作成线。
方法二:在css里面设,要IE5。5才支持这种效果。
style=BORDER-LEFT: #000000 1PX DASHED; BORDER-RIGHT: #000000 1PX DASHED; BORDER-TOP: #000000 1PX DASHED; BORDER-BOTTOM: #000000 1PX DASHED
22,看看在网页中调用HHCtrl控件效果。
代码如下:
〈object id=HHC type=application/x-oleobject classid=clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11〉〈/object〉〈script〉HHC.TextPopup(哈哈,大家好,我是闪梦!,,50,5,128255,346751);〈/script〉
22,如何让一张图片有浅到深的渐变。
〈SCRIPT language=javascript1.2〉
〈!--
function high(which2){
theobject=which2
highlighting=setInterval(highlightit(theobject),50)
}
function low(which2){
clearInterval(highlighting)
which2.filters.alpha.opacity=40
}
function highlightit(cur2){
if (cur2.filters.alpha.opacity〈100)
cur2.filters.alpha.opacity+=10
else if (window.highlighting)
clearInterval(highlighting)
}
〈/script〉
〈img onmouseout=low(this) onmouseover=high(this) style=FILTER: alpha(opacity=40)src=logo.gif 〉
23,双击鼠标左键来滚动背景,单击停止。
〈SCRIPT language=javascript〉
var currentpos,timer;
function initialize()
{
timer=setInterval(scrollwindow(),16);
}
function sc(){
clearInterval(timer);
}
function scrollwindow()
{
currentpos=document.body.scrollTop;
window.scroll(0,++currentpos);
if (currentpos != document.body.scrollTop)
sc();
}
document.onmousedown=sc
document.ondblclick=initialize
〈/SCRIPT〉
24,如何在同一页面设置不同文字链接效果的样式.
代码如下:
〈HTML〉〈HEAD〉〈TITLE〉如何在同一页面设置不同文字链接效果的样式〈/TITLE〉
〈meta http-equiv=Content-Type content=text/html; charset=gb2312〉
〈style type=text/css〉
〈!--
a:hover { font-size: 9pt; color: #FF0000; text-decoration: underline}
a:link { font-size: 9pt; color: #006699; text-decoration: underline}
a:visited { font-size: 9pt; color: #006699; text-decoration: underline}
a:active { font-size: 9pt; color: #FF0000; text-decoration: none}
a.r1:hover { font-size: 9pt; color: #FF0000; text-decoration: underline overline}
a.r1:link { font-size: 9pt; color: #000000; text-decoration: underline overline}
a.r1:visited { font-size: 9pt; color: #99CC00; text-decoration: underline overline}
a.r1:active { font-size: 9pt; color: #000000; text-decoration: underline overline}
--〉
〈/style〉
〈/head〉
〈body bgcolor=#FFFFFF text=#000000〉
〈a href=#〉下划线链接 〈/a〉
〈p〉〈/p〉
〈a href=# class=r1〉双下划线链接〈/a〉
〈/BODY〉
〈/HTML〉
补充说明:
a:hover 表示鼠标划过时的样式.
a:link 表示链接的样式.
a:active 表示当前活动连接的样式.
a:visited 表示已经访问过的连接的样式.
25, 用CSS给文字加入阴影效果和文字描边效果。
.glow{FONT-SIZE: 9pt; FILTER: Glow(Color=#000000, Strength=1)}
//文字描边效果
.shadow {FONT-SIZE: 9pt; FILTER: DropShadow(OffX=1, OffY=1, DropShadow(OffX=1, OffY=1, color:#111111); COLOR: #ffffff; FONT-FAMILY: 宋体}
//加入阴影效果
补充说明:
这两种滤镜要想实现效果,必须加在如:〈td class=glow或shadow 〉〈div〉xxxxxxxxx〈/div〉〈/td〉上
,并且要留有足够的空间能够显示阴影或描边,否则会出现半截的阴影或描边现象。
26,如何给做带颜色的下拉菜单。
〈select style=FONT-SIZE: 10px; COLOR: #ffffff; FONT-FAMILY: Verdana;BACKGROUND-COLOR: #ff6600; size=1 〉
〈option selected〉:: Dreamweaver4 ::〈/option〉
〈option〉::Flash5::〈/option〉
〈option〉::Firewoks4::〈/option〉
〈/select〉
27,关于DW4的表格中的亮边框和暗边框问题。
在DW4的表格面板中并没有亮边框和暗边框的属性设置,因为NC不支持,只有你在代码中添加了。
bordercolorlight=#999999 bordercolordark=#000000
你也可以用Css定义一个class。例如:
〈style〉
.bordercolor { bordercolorlight: #999999; bordercolordark: #000000 }
〈/style〉
然后在要加效果的表格里加?lt;table class=bordercolor〉
28,自动显示主页最后更新日期.
〈script〉
document.write(最后更新日期:+document.lastModified+)
〈/script〉
29,如何让滚动条出现在左边?
我想居然在论坛中有人发表了这段代码,很有意思,它的确照顾一些左撇子,呵呵!
〈html dir=rtl〉
〈body bgcolor=#000000 text=#FFFFFF〉
〈table height=18 width=212 align=center bgcolor=#FFFFFF dir=ltr cellspacing=1 cellpadding=0〉
〈tr〉
〈td bgcolor=#FF0000 〉是不是你的滚动条在左边啊〈/td〉
〈/tr〉
〈/table〉
〈/body〉
〈/html〉
30,如何加入网址前面的小图标?
首先,您必须了解所谓的图标(Icon)是一种特殊的图形文件格式,它是以 .ico 作为扩展名。你可用在网上找一个制作图标软件,它具有特有的规格:图标的大小为 16 * 16(以像素为单位);颜色不得超过 16 色。 在该网页文件的 HEAD 部分加入下面的内容:〈LINK REL=SHORTCUT ICON HREF= http://skydesigner.51.net/图标文件名〉,并放在该网页的根目录下。
31,在800*600显示器中,如何不让网页水平出现滚动条!
设至〈body leftmargin=0 topmargin=0〉,网页中的表格宽度为778。
32,关于〈!DOTYPE〉的说明解释。
在网页中,经常会看到〈!DOCTYPE HTML PUBLIC`-//W3C//DTD HTML 4.01//EN`〉,是声明HTML文件的版本信息。
33, 用图片来关闭窗体.
〈A href=java script:window.close()〉〈IMG height=20 width=20 alt=关闭窗口 src=close.gif border=0〉〈/A〉
补充说明:如何使用了ACTIVEX!,不再警告窗口?
〈html〉
〈head〉
〈object id=closes type=application/x-oleobject
classid=clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11〉
〈param name=Command value=Close〉〈/object〉
〈/head〉
〈body bgcolor=#003063 text=#ffffff id=all〉 〈a href=# onclick=closes.Click();〉关闭窗口无提示〈/a〉
〈/body〉
〈/html〉
34,禁止鼠标右键查看网页源代码。
〈SCRIPT language=javascript〉
function click()
{if (event.button==2) {alert(`你好,欢迎光临!`) }}
document.onmousedown=click
〈/SCRIPT〉
补充说明:
鼠标完全被封锁,可以屏蔽鼠标右键和网页文字。
〈 body oncontextmenu=return false ondragstart=return false onselectstart=return false〉
35,通过按钮来查看网页源代码。
〈input type=BUTTON value=查看源代码 onClick= `window.location = view-source: + window.location.href` name=BUTTON〉
36,怎么用文字联结实现按钮的SUBMIT功能?
〈a href=# onclick=formname.submit()〉OK〈/a〉
这段文字要放在form里。formname是这里要写在form中的name,〈form name=form111〉那么就应该是form111.submit()
37,如何做一个空链接?
加#
38,利用〈IFRAME〉来给网页中插入网页。
经常我看到很多网页中又有一个网页,还以为是用了框架,其实不然,是用了〈IFRAME〉,它只适用于IE,NS可是不支持〈IFRAME〉的,但围着的字句只有在浏览器不支援 iframe 标记时才会显示,如〈noframes〉一样,可以放些提醒字句之类的话。
你注意啊!下面请和我学习它的用法。
分析代码:〈iframe src=iframe.html name=test align=MIDDLE width=300 height=100 marginwidth=1 marginheight=1 frameborder=1 scrolling=Yes〉 〈/iframe〉
src=iframe.html
用来显示〈IFRAME〉中的网页来源,必要加上相对或绝对路径。
name=test
这是连结标记的 target 参数所需要的。
align=MIDDLE
可选值为 left, right, top, middle, bottom,作用不大 。
width=300 height=100
框窗的宽及长,以 pixels 为单位。
marginwidth=1 marginheight=1
该插入的文件与框边所保留的空间。
frameborder=1
使用 1 表示显示边框, 0 则不显示。(可以是 yes 或 no)
scrolling=Yes
使用 Yes 表示容许卷动(内定), No 则不容许卷动。
39,请问<tbody>的用法?
tbody用法据说是加强对表格的控制能力的.例如:
〈table〉〈tbody〉……..〈/tbody〉〈/table〉
tbody代码如果不是你用手写的话,只有在你用IE5打开一个网页的时候, 把它另存为
一下,你的另存为的文件在表格中就会生成tbody代码。(即便你的表格根本就没有
tbody代码,IE5另存为的时候也会给你生成)。
40,Alt和Title都是提示性语言标签,请注意它们之间的区别。
在我们浏览网页时,当鼠标停留在图片对象或文字链接上时,在鼠标的右下角有时会出现一个提示信息框。对目标进行一定的注释说明。在一些场合,它的作用是很重要的。
alt 用来给图片来提示的。Title用来给链接文字或普通文字提示的。
用法如下:
〈p Title=给链接文字提示〉文字〈/p〉
〈a href=# Title=给链接文字提示〉文字〈/a〉
〈img src=图片.gif alt=给图片提示〉
补充知识:〈TITLE〉〈ALT〉里面如何多行换行?在源代码里Enter回车。
〈a href=# Title=个人简历
姓名:张培
网名:我是闪梦
性别:男的,不是女的。
爱好:网页制作,软件开发〉个人简历〈/a〉
例如:个人简历
41, 用javascript代码来实现闪烁按钮。
〈body〉
〈form method=POST action=--WEBBOT-SELF--〉
〈input type=button name=SUB value=闪烁 id=flashit style=BORDER: 1px solid ;BACKGROUND-COLOR: #FFFFFF〉
〈/form〉
〈script〉
if (document.all&&document.all.flashit)
{
var flashelement=document.all.flashit
if (flashelement.length==null)
flashelement[0]=document.all.flashit
function changecolor(which)
{
if (flashelement[which].style.color==`#800000`)
flashelement[which].style.color=#0063A4
else
flashelement[which].style.color=#800000
}
if (flashelement.length==null)
setInterval(changecolor(0),1000)
else
for (i=0;i〈flashelement.length;i++)
{
var tempvariable=`setInterval(changecolor(`+i+`),`+`1000)`
eval(tempvariable)
}
}
〈/script〉
〈/body〉
42,CSS给图片定义颜色边框。
img { border: 1px solid red}
43,在DW中如何使插入的FLASH透明。
方法一:选中swf,打开原代码窗口,在〈/object〉前输入:〈param name=wmode value=transparent〉
方法二:在Flash中的Flie→Publist Settings→HTML→Window Mode选择transparent
44,在DW编辑文本中,如何输入一个空格呢?
输入空格的问题,在DW似乎已成了一个老生常谈的问题。通过将输入法调整到全角模式就可以避免了。本以人工智能ABC为例.按Shift+Space切换到全角状态。
45,为何我的DW中图形显示不正常。
第一种:可能是因为你定义并正在使用一个site,而你的HTML文件或者图片不在这个site包含的区域之内,因此dreamweaver使用file协议来
描述图象的绝对路径,可惜IE不支持src中使用file协议,所以图象就显示不出来了。
第二种:可能是放图片的文件夹或图片名为中文,也显示不到网页中去。
46,如何在本地机器上测试flash影片的loading?
我想这可能是很多人在问的题了,其实很简单,在Test时,选选View-〉Show Streaming就可以看到了。
47,在网页中做出一根竖的线有几种办法.
第一种方法:用一个像素图的办法!
如果你用Dreamwever的Edit→Preferences…→Layout View中的Spacer Image给你创建了一个缺省名为:spacer.gif的一个像素图文件 。
代码中:
〈table border=0 cellspacing=0 cellpadding=0〉
〈tr〉
〈td bgcolor=#FF0000 height=200 〉〈img src=spacer.gif width=1 height=1〉〈/td〉
〈/tr〉
〈/table〉
第二种方法:用表格填颜色的办法!把〈td〉 〈/td〉中的 删掉 .
〈table border=0 cellspacing=0 cellpadding=0〉
〈tr〉
〈td bgcolor=#FF0000 height=200 width=1〉〈/td〉
〈/tr〉
〈/table〉
第三种方法:用水平条。
〈hr color=red width=1 size=100%〉
48, 关于鼠标拖动,改变层大小。──看看微软的做法.
〈script〉
document.execCommand(2D-position,false,true);
〈/script〉
〈DIV contentEditable=true〉
〈DIV style=WIDTH: 300px; POSITION: absolute; HEIGHT: 100px; BACKGROUND-COLOR: red〉移动层〈/DIV〉
〈/DIV〉
49 ,点击连接文字加入收藏夹。
〈a href=java script:window.external.AddFavorite(http://www.263.net`, `269家园`)〉点击加入收藏夹〈/a〉
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
v , sheet ,WPT,workbooks ,workbook,PivotCaches ,PivotCache ,PivotTables : variant ;
begin
try
v:=createOleObject('Excel.application');
v.workbooks.add;
sheet:=v.workbooks[1].worksheets[1];
sheet.Range[sheet.cells[1,1],sheet.cells[1,15]].Select;
//SetupFont(FtBiaoKai,xlLeft,xlCenter,12,false);
v.Selection.RowHeight:=48;
v.Selection.HorizontalAlignment:= 1 ;
v.Selection.Font.Size := 20;
sheet.Cells[1,7]:='表';
v.Selection.Merge;
for i := 4 to 5 do
begin
sheet.Columns[i].ColumnWidth:=16;
end ;
sheet.Range[sheet.cells[2,1],sheet.cells[2,6]].Select;
v.Selection.HorizontalAlignment:= 1 ;
v.Selection.Font.Bold:=true ;
sheet.Cells[2,1]:='lei';
sheet.Cells[2,2]:='cang';
sheet.Cells[2,3]:='WEEK';
sheet.Cells[2,4]:='Usable';
sheet.Cells[2,5]:='Actual';
//sheet.Range('A2:E5').Select ;
sheet.Range[sheet.cells[2,1],sheet.cells[5,5]].Select;
workbook := v.ActiveWorkbook;
PivotCaches := workbook.PivotCaches;
PivotCache := PivotCaches.add(1, 'Sheet1!R2C1:R5C5'); //(SourceType:=2);//
PivotTables := PivotCache.CreatePivotTable('' ,'name',1);
// PivotTables.name('AgingReport');
workbook.ActiveSheet.PivotTableWizard ;
//workbook.TableDestination := workbook.ActiveSheet.Cells(3, 1) ;
// workbook.ActiveSheet.Cells(3, 1).Select ;
v.Charts.Add ;
// v.Chart.LocationWhere := '$00000001' ;// xlLocationAsNewSheet ;
workbook.ShowPivotTableFieldList := True ;
v.ActiveChart.PivotLayout.PivotTable.PivotFields('cat).Orientation := 3;//'xlPageField' ;
v.ActiveChart.PivotLayout.PivotTable.PivotFields('cat).Position := 1 ;
v.ActiveChart.PivotLayout.PivotTable.PivotFields('f1').Orientation := 1;//'xlPageField' ;
v.ActiveChart.PivotLayout.PivotTable.PivotFields('f1').Position := 1 ;
v.ActiveChart.PivotLayout.PivotTable.PivotFields('WEEK').Orientation := 1;//'xlPageField' ;
v.ActiveChart.PivotLayout.PivotTable.PivotFields('WEEK').Position := 1 ;
// v.ActiveChart.PivotLayout.PivotTable.PivotFields(' Time').Orientation := 1;//'xlPageField' ;
// v.ActiveChart.PivotLayout.PivotTable.PivotFields(' Time').Position := 1 ;
v.ActiveChart.PivotLayout.PivotTable.AddDataField(
v.ActiveChart.PivotLayout.PivotTable.PivotFields('Usable Time'), '計數 ', -4112 ) ;
Workbook.ShowPivotTableFieldList := False ;
//v.CommandBars('PivotTable').Visible := False ;
v.ActiveChart.PivotLayout.PivotTable.PivotFields('計數 ').Function := -4157 ;
v.Visible:=True;
except
on e:exception
do messagedlg('Create Excel Can''t work!'+#13+#10+e.message,mtWarning,[mbOk],0);
end;
end;
oracle trunc()函数的用法,sql,sql教程,Oracle基础 TRUNC()函數分兩種1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值。 其具体的语法格式如下: TRUNC(date[,fmt]) 其中: date 一个日期值 fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去 下面是该函数的使用情况: TRUNC(TO_DATE(’24-Nov-1999 08:00 pm’,’dd-mon-yyyy hh:mi am’)) =’24-Nov-1999 12:00:00 am’ TRUNC(TO_DATE(’24-Nov-1999 08:37 pm’,’dd-mon-yyyy hh:mi am’,’hh’)) =’24-Nov-1999 08:00:00 am’2.TRUNC(for number) TRUNC函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去。 其具体的语法格式如下 TRUNC(number[,decimals]) 其中: number 待做截取处理的数值 decimals 指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分 下面是该函数的使用情况: TRUNC(89.985,2)=89.98 TRUNC(89.985)=89 TRUNC(89.985,-1)=80 注意:第二个参数可以为负数,表示为小数点左边指定位数后面的部分截去,即均以0记。