2008年9月24日
|
|
|
|
1、浏览器事件的捕捉
在IE下有一个全局的window.event,当事件触发后可以直接使用,但是在fireFox下没有这个东西,当调用触发事件调用一个函数时,如果这个函数没有形参,那么firefox会默认的把event(事件)传进去,但是有参数时就不行啦,所以解决的办法是,自己手动传一个event进去,这样就ok了,具体代码如下:
下面两个函数,都是响应鼠标onclick时触发的动作,第一个在ie下使用正常,但是在firefox下却有问题,改成第二个那样使用,就没有问题了,注意调用方法的区别
view plaincopy to clipboardprint? <html> <head> <title>test</title> <script language="javascript"> function testevent() { window.alert(window.event.target.id); return; } </script> </head> </body> <a href="#" onclick="testevent()" id="alink">testevent</a> </body> </html> <html> <head> <title>test</title> <script language="javascript"> function testevent() { window.alert(window.event.target.id); return; } </script> </head> </body> <a href="#" onclick="testevent()" id="alink">testevent</a> </body> </html>
view plaincopy to clipboardprint? <html> <head> <title>test1</title> <script language="javascript"> function testevent(evt) { window.alert(evt.target.id); return; } </script> </head> </body> <a href="#" onclick="testevent(event)" id="alink">testevent</a> </body> </html> <html> <head> <title>test1</title> <script language="javascript"> function testevent(evt) { window.alert(evt.target.id); return; } </script> </head> </body> <a href="#" onclick="testevent(event)" id="alink">testevent</a> </body> </html>
其实event对象在ie以及firefox还有很多不同的特性,比如clienx,pagex等,但是由于在现在流行使用的js框架prototype中解决了很多这些问题,所以如果是在基于prototype下的开发,这些问题可以考虑得少一些了,只是上面提到的这个捕获问题,prototype中并没有完善的解决,所以单独列出来,下面提及的关于js的也都只列出prototype中未解决的
2、关于透明度的设置
为了达到给层设置半透明的效果时,在IE和firefox下也有所不同,IE下,style的filter属性有Alpha值可供使用,而firefox下没有Alpha值,所以得指定style的MozOpacity,代码见下:
<STYLE> filter: Alpha(opacity=10); /*IE*/ -moz-opacity:.1; /*老版本FireFox 1.0 以前*/ opacity:0.1; /*新版本FireFox*/ </STYLE>
view plaincopy to clipboardprint? <script language="javascript"> //设置一个id为screen的div的透明度为45%,在IE下: document.getElementById(screen).style.filter=Alpha(Opacity=45);
//而在firefox下: document.getElementById(screen).style.MozOpacity=0.45; </script> <script language="javascript"> //设置一个id为screen的div的透明度为45%,在IE下: document.getElementById(screen).style.filter=Alpha(Opacity=45);
//而在firefox下: document.getElementById(screen).style.MozOpacity=0.45; </script>
3、定位层时的有趣问题
在定位层时,我们的做法是给层的style.left 和 style.top设置位置,但是今天发现了一个很有趣的问题,代码如下:
view plaincopy to clipboardprint? <script language="javascript"> //给一个id为dialog的层定位 document.getElementById(dialog).left = 100; document.getElementById(dialog).left = 100;
//问题出现了,在ie下,默认将层的左上角定位在(100px,100px)这个点上 //但是在firefox下却死活都不行,后来发现,原来ie在你没有指定单位的时候 //替你加上了单位“px”,而firefox比较“笨” //他觉得你没有指定单位,就不给你定位,好了,那么标准的写法应该是这样:
document.getElementById(dialog).left = 100px; document.getElementById(dialog).left = 100px;
//这样firefox也认了
</script> <script language="javascript"> //给一个id为dialog的层定位 document.getElementById(dialog).left = 100; document.getElementById(dialog).left = 100;
//问题出现了,在ie下,默认将层的左上角定位在(100px,100px)这个点上 //但是在firefox下却死活都不行,后来发现,原来ie在你没有指定单位的时候 //替你加上了单位“px”,而firefox比较“笨” //他觉得你没有指定单位,就不给你定位,好了,那么标准的写法应该是这样:
document.getElementById(dialog).left = 100px; document.getElementById(dialog).left = 100px;
//这样firefox也认了
</script>
4、PNG透明背景的问题 PNG图片在网站设计中是不可或缺的部分,最大的特点应该在于PNG可以无损压缩,而且还可以设置透明,对于增强网站的图片色彩效果有重要的作用。
但为什么PNG图片却没有GIF和JPG图片的使用来得广泛呢,这个祸因应归属于微软的IE浏览器(Firefox和Opera对PNG支持的比较好,而现在浏览器的主流IE6却无法很好的支持)。不过微软在最近也开始改过自新了,新出的的IE7可以很好的支持PNG,可以想象在未来的网络世界,PNG图片的重要性将会更加凸显。
但在大家还在绝大多数的使用IE6的时候,我们又怎样在IE6的世界去完美使用PNG图片呢(PNG图片的时候最重要的地方在于PNG透明背景图片的运用)。我们应该庆幸我们是幸福的!IE5.5+的AlphaImageLoader滤镜为通向png提供了一个道路,如果他载入的是PNG(Portable Network Graphics)格式,则0%-100%的透明度也被提供。但IE5.0无法支持属性,那只有完全绝望了,不过绝望的只是几个,得到是绝大数,我们应该知足,知足才会常乐。
现在我们将通过Hack和AlphaImageLoader滤镜来实现IE6下的PNG透明背景图片。
先熟悉下滤镜的语法:
view plaincopy to clipboardprint? filter : progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled=bEnabled , sizingMethod=sSize , src=sURL )
属性:
enabled : 可选项。布尔值(Boolean)。设置或检索滤镜是否激活。true | false true : 默认值。滤镜激活。 false : 滤镜被禁止。
sizingMethod : 可选项。字符串(String)。设置或检索滤镜作用的对象的图片在对象容器边界内的显示方式。 crop : 剪切图片以适应对象尺寸。 image : 默认值。增大或减小对象的尺寸边界以适应图片的尺寸。 scale : 缩放图片以适应对象的尺寸边界。
src : 必选项。字符串(String)。使用绝对或相对 url 地址指定背景图像。假如忽略此参数,滤镜将不会作用。 filter : progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled=bEnabled , sizingMethod=sSize , src=sURL )
属性:
enabled : 可选项。布尔值(Boolean)。设置或检索滤镜是否激活。true | false true : 默认值。滤镜激活。 false : 滤镜被禁止。
sizingMethod : 可选项。字符串(String)。设置或检索滤镜作用的对象的图片在对象容器边界内的显示方式。 crop : 剪切图片以适应对象尺寸。 image : 默认值。增大或减小对象的尺寸边界以适应图片的尺寸。 scale : 缩放图片以适应对象的尺寸边界。
src : 必选项。字符串(String)。使用绝对或相对 url 地址指定背景图像。假如忽略此参数,滤镜将不会作用。
Firefox、Opera等完全支持PNG透明图片的浏览器也支持子选择器(>),而IE不识别(包括IE7),所有我们可以通过这来定义Firefox、Opera等浏览器中PNG图片的样式。如下
view plaincopy to clipboardprint? <script language="javascript> //给一个id为infoBox的层设置一个透明背景,背景图片是down.png,代码如下 //进行了浏览器判断
if (navigator.appName!="Microsoft Internet Explorer") { $(infoBox).style.background="0 url(down.png) no-repeat"; } else { $(infoBox).style.background="0 none no-repeat"; $(infoBox).style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=scale,src=down.png)"; }
</script> <script language="javascript> //给一个id为infoBox的层设置一个透明背景,背景图片是down.png,代码如下 //进行了浏览器判断
if (navigator.appName!="Microsoft Internet Explorer") { $(infoBox).style.background="0 url(down.png) no-repeat"; } else { $(infoBox).style.background="0 none no-repeat"; $(infoBox).style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=scale,src=down.png)"; }
</script>
不过需要注意的一个地方:
使用AlphaImageLoader 后该区域的超链接和按钮会失效,解决的方法:
对链接或按钮直接设置相对位置,让它们浮动于滤镜区域的上面。 |
2008年7月8日
整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增强灵活性.
一些基本的设计模式
Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。(使用得非常频繁。)
Adapter:将一个类的接口转换成客户希望的另外一个接口。A d a p t e r模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类方式更为灵活。
Facade:为子系统中的一组接口提供一个一致的界面, F a c a d e模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
Flyweight:运用共享技术有效地支持大量细粒度的对象。
Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Proxy:为其他对象提供一个代理以控制对这个对象的访问。
Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
Strategy:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
设计模式的鼻祖(四个作者, 简称"四人帮")列举了23个模式, 但真正在开发中常用的模式有哪些呢? 今天我去给实习生做了一个讲座, 其中讨论到的一个问题就是这个.
我对一个搜索引擎的代码进行分析,结果如下:
最常用:Factory Method, Strategy, Singleton, Iterator
偶尔用:Abstract Factory, Builder, Adapter, Bridge, Composite, Interpreter, Command, Mediator, Observer, State
几乎不用: Prototype, Decorator, Flyweight, Facade, Proxy, Template Method, Chain of Responsibility, Memento, Visitor
工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。
单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。
适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。
桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。
装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。
门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。
代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。
责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接
命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。
解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。
迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。
调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。
备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
观察者模式:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。
策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。
访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类
2008年6月20日
目前最新的Silverlight版本为2.0 Beta版本,由于Silverlight的开发需要很多工具的支持!所以在此进行详细介绍,让更多的朋友更快的入门。
一、试用 Visual Studio 2008
官方下载地址:http://msdn2.microsoft.com/zh-cn/vstudio/products/aa700831.aspx
简要说明:用于程序的开发,包括程序的逻辑代码。程序的架构设计和WEB的的开发。
二、Expression Blend 2.5
官方下载地址:http://download.microsoft.com/download/8/5/8/858627dc-9aa3-4f86-bb3d-729204927da3/Blend.en.msi
简要说明:用于XAML的可视化设计,包括动画的设计和控件设计!包括在Expression Studio中。
三、Expression Design
官方下载地址:http://www.microsoft.com/expression/products/overview.aspx?key=design
简要说明:用于Silverlight元素的设计和位图失量图片的设计,可以直接到处为XAML。
四、Expression Media
官方下载地址:http://www.microsoft.com/expression/products/overview.aspx?key=media
简要说明:用于视频、音频的处理!
五、Microsoft Silverlight SDK
官方下载地址:http://download.microsoft.com/download/b/4/a/b4a5b488-751b-430c-8ee3-4cc2e0959c54/silverlight_sdk.exe
简要说明:这个升级安装包包含很多项:
1、Silverlight 2 Beta 1
2、Silverlight 2 SDK Beta 1
3、KB949325 for Visual Studio 2008
4、Silverlight Tools Beta 1 for Visual Studio 2008
增加了功能有:
1、Silverlight2.0的模板,用于Silverlight项目的创建!
2、支持可视化XAML的控件创建编辑!
3、Silverlight应用程序的调试!
4、Web Services引用支持!
5、与Expression Blend工具连接交互使用!
安装注意事项:在安装新的Silverlight2.0版本时请注意卸载旧的Silverlight版本,以便产生版本冲突问题!
六、Silverlight Player 本地快速查看功具
官方下载地址:http://www.wpfhome.com/im/
简要说明:支持XAML、XAP文件的快速打开!支持缩放等功能!Silverlight JavaScript脚本调试功能,Adobe Flash Vedio(FLV)文件的播放支持。增加了WPFHOME。COM资讯台和在线更新功能。
2008年6月12日
概述
jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不
及的,它兼容 CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。 jQuery 是一个快速的,简洁的 javaScript 库,使用户能更方便地处理 HTML documents、events、实现动画效果,并且方便地为网站提供 AJAX 交互。 jQuery 还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。 jQuery 能够使用户的 html 页保持代码和 html 内容分离,也就是说,不用再在 html 里面插入一堆js来调用命令了,只需定义 id 即可。今天在Kollermedia.at上发现了一篇JQuery插件列表的文章,特推荐如下。
文件上传(File upload)
Ajax File Upload.
jQUploader.
Multiple File Upload plugin.
jQuery File Style.
Styling an input type file.
Progress Bar Plugin.
表单验证(Form Validation)
jQuery Validation.
Auto Help.
Simple jQuery form validation.
jQuery XAV - form validations.
jQuery AlphaNumeric.
Masked Input.
TypeWatch Plugin.
Text limiter for form fields.
Ajax Username Check with jQuery.
表单-选取框(Form - Select Box stuff)
jQuery Combobox.
jQuery controlled dependent (or Cascadign) Select List.
Multiple Selects.
Select box manipulation.
Select Combo Plugin.
jQuery - LinkedSelect
Auto-populate multiple select boxes.
Choose Plugin (Select Replacement).
表单基本、输入框、选择框等(Form Basics, Input Fields, Checkboxes etc.)
jQuery Form Plugin.
jQuery-Form.
jLook Nice Forms.
jNice.
Ping Plugin.
Toggle Form Text.
ToggleVal.
jQuery Field Plugin.
jQuery Form’n Field plugin.
jQuery Checkbox manipulation.
jTagging.
jQuery labelcheck.
Overlabel.
3 state radio buttons.
ShiftCheckbox jQuery Plugin.
Watermark Input.
jQuery Checkbox (checkboxes with imags).
jQuery SpinButton Control.
jQuery Ajax Form Builder.
jQuery Focus Fields.
jQuery Time Entry.
时间、日期和颜色选取(Time, Date and Color Picker)
jQuery UI Datepicker.
jQuery date picker plugin.
jQuery Time Picker.
Time Picker.
ClickPick.
TimePicker.
Farbtastic jQuery Color Picker Plugin.
Color Picker by intelliance.fr.
投票插件(Rating Plugins)
jQuery Star Rating Plugin.
jQuery Star Rater.
Content rater with asp.net, ajax and jQuery.
Half-Star Rating Plugin.
搜索插件(Search Plugins)
jQuery Suggest.
jQuery Autocomplete.
jQuery Autocomplete Mod.
jQuery Autocomplete by AjaxDaddy.
jQuery Autocomplete Plugin with HTML formatting.
jQuery Autocompleter.
AutoCompleter (Tutorial with PHP&MySQL).
quick Search jQuery Plugin.
编辑器(Inline Edit & Editors)
jTagEditor.
WYMeditor.
jQuery jFrame.
Jeditable - edit in place plugin for jQuery.
jQuery editable.
jQuery Disable Text Select Plugin.
Edit in Place with Ajax using jQuery.
jQuery Plugin - Another In-Place Editor.
TableEditor.
tEditable - in place table editing for jQuery.
多媒体、视频、Flash等(Audio, Video, Flash, SVG, etc)
jMedia - accessible multi-media embedding.
JBEdit - Ajax online Video Editor.
jQuery MP3 Plugin.
jQuery Media Plugin.
jQuery Flash Plugin.
Embed QuickTime.
SVG Integration.
图片(Photos/Images/Galleries)
ThickBox.
jQuery lightBox plugin.
jQuery Image Strip.
jQuery slideViewer.
jQuery jqGalScroll 2.0.
jQuery - jqGalViewII.
jQuery - jqGalViewIII.
jQuery Photo Slider.
jQuery Thumbs - easily create thumbnails.
jQuery jQIR Image Replacement.
jCarousel Lite.
jQPanView.
jCarousel.
Interface Imagebox.
Image Gallery using jQuery, Interface & Reflactions.
simple jQuery Gallery.
jQuery Gallery Module.
EO Gallery.
jQuery ScrollShow.
jQuery Cycle Plugin.
jQuery Flickr.
jQuery Lazy Load Images Plugin.
Zoomi - Zoomable Thumbnails.
jQuery Crop - crop any image on the fly.
Image Reflection.
Google地图(Google Map)
jQuery Plugin googlemaps.
jMaps jQuery Maps Framework.
jQmaps.
jQuery & Google Maps.
jQuery Maps Interface forr Google and Yahoo maps.
jQuery J Maps - by Tane Piper.
游戏(Games)
Tetris with jQuery.
jQuery Chess.
Mad Libs Word Game.
jQuery Puzzle.
jQuery Solar System (not a game but awesome jQuery Stuff).
表格等(Tables, Grids etc.)
UI/Tablesorter.
jQuery ingrid.
jQuery Grid Plugin.
Table Filter - awesome!.
TableEditor.
jQuery Tree Tables.
Expandable “Detail” Table Rows.
Sortable Table ColdFusion Costum Tag with jQuery UI.
jQuery Bubble.
TableSorter.
Scrollable HTML Table.
jQuery column Manager Plugin.
jQuery tableHover Plugin.
jQuery columnHover Plugin.
jQuery Grid.
TableSorter plugin for jQuery.
tEditable - in place table editing for jQuery.
jQuery charToTable Plugin.
jQuery Grid Column Sizing.
jQuery Grid Row Sizing.
统计图(Charts, Presentation etc.)
jQuery Wizard Plugin .
jQuery Chart Plugin.
Bar Chart.
边框、圆角、背景(Border, Corners, Background)
jQuery Corner.
jQuery Curvy Corner.
Nifty jQuery Corner.
Transparent Corners.
jQuery Corner Gallery.
Gradient Plugin.
文字和超链接(Text and Links)
jQuery Spoiler plugin.
Text Highlighting.
Disable Text Select Plugin.
jQuery Newsticker.
Auto line-height Plugin.
Textgrad - a text gradient plugin.
LinkLook - a link thumbnail preview.
pager jQuery Plugin.
shortKeys jQuery Plugin.
jQuery Biggerlink.
jQuery Ajax Link Checker.
鼠标提示(Tooltips)
jQuery Plugin - Tooltip.
jTip - The jQuery Tool Tip.
clueTip.
BetterTip.
Flash Tooltips using jQuery.
ToolTip.
菜单和导航(Menus, Navigations)
jQuery Tabs Plugin - awesome! . [demo nested tabs.]
another jQuery nested Tab Set example (based on jQuery Tabs Plugin).
jQuery idTabs.
jdMenu - Hierarchical Menu Plugin for jQuery.
jQuery SuckerFish Style.
jQuery Plugin Treeview.
treeView Basic.
FastFind Menu.
Sliding Menu.
Lava Lamp jQuery Menu.
jQuery iconDock.
jVariations Control Panel.
ContextMenu plugin.
clickMenu.
CSS Dock Menu.
jQuery Pop-up Menu Tutorial.
Sliding Menu.
http://stilbuero.de/jquery/tabs_3/
幻灯、翻转等(Accordions, Slide and Toggle stuff)
jQuery Plugin Accordion.
jQuery Accordion Plugin Horizontal Way.
haccordion - a simple horizontal accordion plugin for jQuery.
Horizontal Accordion by portalzine.de.
HoverAccordion.
Accordion Example from fmarcia.info.
jQuery Accordion Example.
jQuery Demo - Expandable Sidebar Menu.
Sliding Panels for jQuery.
jQuery ToggleElements.
Coda Slider.
jCarousel.
Accesible News Slider Plugin.
Showing and Hiding code Examples.
jQuery Easing Plugin.
jQuery Portlets.
AutoScroll.
Innerfade.
拖放插件(Drag and Drop)
UI/Draggables.
EasyDrag jQuery Plugin.
jQuery Portlets.
jqDnR - drag, drop resize.
Drag Demos.
XML XSL JSON Feeds
XSLT Plugin.
jQuery Ajax call and result XML parsing.
xmlObjectifier - Converts XML DOM to JSON.
jQuery XSL Transform.
jQuery Taconite - multiple Dom updates.
RSS/ATOM Feed Parser Plugin.
jQuery Google Feed Plugin.
浏览器(Browserstuff)
Wresize - IE Resize event Fix Plugin.
jQuery ifixpng.
jQuery pngFix.
Link Scrubber - removes the dotted line onfocus from links.
jQuery Perciformes - the entire suckerfish familly under one roof.
Background Iframe.
QinIE - for proper display of Q tags in IE.
jQuery Accessibility Plugin.
jQuery MouseWheel Plugin.
对话框、确认窗口(Alert, Prompt, Confirm Windows)
jQuery Impromptu.
jQuery Confirm Plugin.
jqModal.
SimpleModal.
CSS
jQuery Style Switcher.
JSS - Javascript StyleSheets.
jQuery Rule - creation/manipulation of CSS Rules.
jPrintArea.
DOM、AJAX和其它JQuery插件(DOM, Ajax and other jQuery plugins)
FlyDOM.
jQuery Dimenion Plugin.
jQuery Loggin.
Metadata - extract metadata from classes, attributes, elements.
Super-tiny Client-Side Include Javascript jQuery Plugin.
Undo Made Easy with Ajax.
JHeartbeat - periodically poll the server.
Lazy Load Plugin.
Live Query.
jQuery Timers.
jQuery Share it - display social bookmarking icons.
jQuery serverCookieJar.
jQuery autoSave.
jQuery Puffer.
jQuery iFrame Plugin.
Cookie Plugin for jQuery.
jQuery Spy - awesome plugin.
Effect Delay Trick.
jQuick - a quick tag creator for jQuery.
Metaobjects.
elementReady.
英文:http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/
2007年10月22日
将以前开发的项目中的lucene从1.4.3升级到2.1,发现编译就不通过,于是对照新的API将程序做了修改,目前本人遇到的API更改有
1. IndexReader类
delete(int id)方法改名为deleteDocuemnt(int id), delete(Term t) 方法改名为deleteDocuments(Term t);
getFieldNames()方法现在必须传入参数了,类型是IndexReader.FieldOption,例如
Collection c=reader.getFieldNames(IndexReader.FieldOption.ALL);
2. Field类
构造函数Field(String name,String value,boolean store,boolean index,....)不复存在,变成了更加
Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector)
相应的Field.Keyword静态方法也没有了,必须采用构造函数直接生成实例;
3. BooleanQuery
add方法也改了,原有的是add(Query q, boolean required, boolean prohibited)现在也更加面向对象了:
add(Query q, BooleanClause.Occur occur);
4.BooleanClause
其query属性不是public的了,需要使用getQuery()方法获取;
4. IndexWriter
mergeFactor属性不再是public的了,有了个setMergeFactor()方法;
5. DateField
deprecated了,使用DateTools;
6.QueryParser
parse方法不再是static的了,也就是要先取得QueryParser 的实例再调用实例的parse()方法。这样就可以继承QueryParser 写一个自己的检索式解析器了。我写了一个来解决做模糊检索时出现TooManyClauses 异常的问题。主要是利用Filter的机制来实现。但实际运行过程中只能解决PrefixQuery的问题,即title:comput*样式的检索式没有问题(星号在最后),而在做WildcardQuery时即检索式样式是title:com*er时速度非常慢(数据量4000万),于是只好在新的解析器中只重写了getPrefixQuery()方法。
7. Luke
Luke工具读2.0的索引不太好用了,在其官方网站上还没有支持2.0的版本,于是下了源代码针对2.0的接口重新编译了一下,做了一些修改。可以从这里下载:
2.0以前的版本
Keyword: Field的值将被保存到索引文件,为Field的值建立索引,建立索引时不需要分词。
UnIndexed: Field的值将被保存到索引文件,不为Field的值建立索引,因此不能通过该Field搜索文档。
UnStored: Field的值不被保存到索引文件,将Field的值分词后建立索引
Text: Field的值分词后建立索引。如果参数为String值将被保存,为Reader值不被保存
2.0版本
用几个内部类的组合来区分Field的具体类型。
Store
COMPRESS:压缩保存。用于长文本或二进制数据 YES:保存 NO:不保存
Index
NO:不建索引 TOKENIZED:分词,建索引 UN_TOKENIZED:不分词,建索引 NO_NORMS:不分词,建索引。但是Field的值不像通常那样被保存,而是只取一个byte,这样节约存储空间
TermVector
NO:不保存term vectors YES:保存term vectors。 WITH_POSITIONS:保存term vectors。(保存值和token位置信息) WITH_OFFSETS:保存term vectors。(保存值和Token的offset)WITH_POSITIONS_OFFSETS:保存term vectors。(保存值和token位置信息和Token的offset)
2007年9月30日
如果你还未尝试过制作Silverlight应用程序,但却对它感兴趣的话,那这篇文章将会是一个不错的起点。在这篇文章中,我们会用到创建一个Silverlight应用程序所要用到的最基本的工具和技巧,包括对XAML文件的操作,事件响应,动画制作等等。
I. 准备工作
要创建一个Silverlight应用程序,必须要安装的是Silverlight运行时,也就是Silverlight的浏览器插件程序。如果只是用JavaScript进行开发,可以安装Microsoft Silverlight 1.0 Release Candidate;如果开发过程需要用到.NET的编程语言,则需要安装Microsoft Silverlight 1.1 Alpha Refresh.
Silverlight的开发设计工作,即使用最简单的记事本也可以做到,但是如果使用以下开发设计工具,将会极大的增加设计开发Silverlight应用程序的效率:
开发人员工具:
· Microsoft Visual Studio 2008 Beta2
下一代开发工具
· Microsoft Silverlight Tools Alpha Refresh for Visual Studio 2008 Beta2
基于Microsoft Visual Studio的插件程序(add-on),用于创建Silverlight应用程序。
设计人员工具:
· Expression Blend 2 August Preview
为Silverlight创建丰富的用户交互的专业设计程序
· Expression Media Encoder Preview
用来创建和增强视频效果的工具
· Expression Design
Silverlight专业的图形设计工具
更多设计人员工具请访问Expression Studio官方网站。
II. 简单的“Hello World”Silverlight应用程序步骤详解
下面的篇幅将会详细阐述创建一个简单的“Hello World”应用程序的具体步骤。
1. 在Visual Studio中新建项目
如果在Microsoft Visual Studio 2008中安装了Microsoft Silverlight Tools Alpha for Visual Studio 2008 Beta2,通过以下几步就可以轻松的创建一个Silverlight项目:
· 点击菜单栏FileàNewàProject,会弹出一个New Project对话框,根据自己对编程语言的喜好可以在Project Types中选择Visual C#或Visual Basic(此处选择的是Visual C#)。
· 如果是创建一个完整的应用程序,则在Templates中选择Silverlight Project。
· 在对话框的Name一栏中输入项目名,Location一栏中输入项目创建的位置,点击“OK”。

2. 编辑XAML文件
在Microsoft Visual Studio Orcas中创建了一个新的Silverlight项目后,一个名为Page.xaml的文件会自动在Visual Studio中打开。通过在Page.xaml文件的<Canvas>标签后输入下面这个语句,可以在浏览器页面中得到一个简单的“Hello World”字样。(彩色字符为需要输入的语句,绿色字符不用输入)
<Canvas …>
<TextBlock x:Name="MyMessage" Text="Hello World" FontSize="56"/>
</Canvas>
按Ctrl+F5则可运行这段代码。

3. 用.NET语言加入事件处理
对应每一个xmal文件,都会有一个.NET语言相对应的代码文件,由于此处用的是Visual C#,因此对应于Page.xmal,可以在Solution Explorer的目录树下,找到Page.xmal.cs文件。

在继承于Canvas的Page类中,通过以下代码可以实现鼠标左键点击“Hello World”,使文字变成“I was pushed!”。
public void Page_Loaded(object o, EventArgs e)
{
// Required to initialize variables
InitializeComponent();
MyMessage.MouseLeftButtonDown += new MouseEventHandler(MyMessage_MouseLeftButtonDown);
}
void MyMessage_MouseLeftButtonDown(object sender, MouseEventArgs arg)
{
MyMessage.Text = "I was pushed!";
}
4. 调试代码
在Visual Studio中调试Silverlight应用程序和调试其他应用一样简单。例如在“MyMessage.Text = "I was pushed!";”这一行首单击鼠标左键设置断点,然后选择菜单栏中DebutàStart Debugging,或者按F5键,即可进行调试。
当程序运行到断点处会自动暂停。此时可以查看断点处各个参数或属性的值,也可以通过Immediate Window,在调试模式下对代码做临时的修改以察看其效果。如在Immediate Window中输入以下代码,按回车键后,对已暂停的应用程序继续进行调试,则浏览器中的字体透明度会被调整为20%:
MyMessage.Opacity = .2;
5. 在Microsoft Expression Blend中编辑动画效果
通过结合使用Microsoft Expression Blend,可以对UI、动画或交互性内容进行更有效的设计开发。且Microsoft Visual Studio Orcas与Microsoft Expression Blend可以协调工作。鼠标右键单击Page.xmal,在弹出菜单中选择Open in Expression Blend, 则该项目会同时在Microsoft Expression Blend中打开。

· 设置背景颜色
在设计界面右侧Properties标签àBrushes中选择Solid Color Brush,用鼠标点选调色板,则可以更改应用程序的背景颜色;选择Gradient Brushes,则可以将背景颜色设置为渐变色。

· 添加动画效果
通过以下几步可以给“Hello World”添加旋转效果:
o 点击设计界面左侧Objects and Timeline中的箭头符号,并在弹出的对话框中点击“加号”(Create New Timeline)。

o 在弹出的Create Storyboard对话框中将时间轴的名字取为“Timeline1”,并选中Create as a Resource选项(这样我们稍候就可以用代码对该时间轴进行进一步操作),点击“OK”。

o 点击MyMessage这个TextBlock对象,并在Timeline面板中点击“加号”,即为MyMessage这个TextBlock在时间轴初始位置增加一个关键帧。
o 点击时间轴的0.5秒处,并添加关键帧。
o 将“Hello World”移动到设计界面的右下方,然后将鼠标置于字符串的左下方,使之成为一个折角双箭头。
o 拖动鼠标左键,使“Hello World”按顺时针方向旋转90度。

o 点击时间轴1秒处的位置,并添加关键帧。
o 继续逆时针旋转字符串,并使之旋转回原来的位置。
单击时间轴上方的Play按钮可以及时查看动画效果
6. 用.NET语言对动画进行操作
由于用Microsoft Visual Studio Orcas与Microsoft Expression Blend同时打开了同一个项目,当项目在Microsoft Expression Blend中进行了修改并进行了保存之后,Microsoft Visual Studio Orcas中的项目也会对应更新。将Page.xaml.cs中的代码更新如下,则实现了对动画的操作:
public void Page_Loaded(object o, EventArgs e)
{
// Required to initialize variables
InitializeComponent();
Timeline1.Completed += new EventHandler(Timeline1_Completed);
MyMessage.MouseLeftButtonDown += new MouseEventHandler(MyMessage_MouseLeftButtonDown);
}
void Timeline1_Completed(object sender, EventArgs arg)
{
MyMessage.Text = "The End!";
}
void MyMessage_MouseLeftButtonDown(object sender, MouseEventArgs arg)
{
//MyMessage.Text = "I was pushed!";
Timeline1.Begin();
}
按Ctrl+F5键则可看到其最终效果:当鼠标左键单击“Hello World”时,字符会移动旋转,并在结束后变成“The End”。
III. 参考资料
请下载Silverlight SDK以更多的文档(英文)和示例:
· Microsoft Silverlight 1.0 Software Development Kit Release Candidate
Silverlight 1.0 RC的SDK,包含了相关文档、示例,以及一个“Go Live”证书,用以商业应用程序的开发。
· Microsoft Silverlight 1.1 Software Development Kit Alpha Refresh
Silverlight 1.1 Alpha的SDK,包含了相关文档,以及示例。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1778341
2007年8月31日
<%
Function GetBrower()
useragent=Request.ServerVariables("HTTP_USER_AGENT")
useragent=Lcase(useragent)
'Browser Check
dim btype,bname,bversion,idx,Os
btype=""
if inStr(useragent,"icab") then
bname="iCab"
elseif inStr(useragent,"lynx") then
bname="Lynx"
elseif inStr(useragent,"links") then
bname="Links"
elseif inStr(useragent,"elinks") then
bname="ELinks"
elseif inStr(useragent,"jbrowser") then
bname="JBrowser"
elseif inStr(useragent,"konqueror") then
bname="Konqueror"
elseif inStr(useragent,"gecko") then
bname="Mozilla"
btype=btype &"[Gecko]"
if inStr(useragent,"aol") then
bname="AOL"
elseif inStr(useragent,"netscape") then
bname="Netscape"
elseif inStr(useragent,"firefox") then
bname="FireFox"
elseif inStr(useragent,"chimera") then
bname="Chimera"
elseif inStr(useragent,"camino") then
bname="Camino"
elseif inStr(useragent,"galeon") then
bname="Galeon"
elseif inStr(useragent,"k-meleon") then
bname="K-Meleon"
end if
elseif inStr(useragent,"bot") or inStr(useragent,"crawl") or inStr(useragent,"spider") or inStr(useragent,"mediapartners") or inStr(useragent,"slurp") then
btype=btype &"[Bot/Crawler/Spider]"
if inStr(useragent,"grub") then
bname="Grub"
elseif inStr(useragent,"googlebot") or inStr(useragent,"google") then
bname="GoogleBot"
elseif inStr(useragent,"baidu") then
bname="BaiduBot"
elseif inStr(useragent,"sogou") then
bname="SogouBot"
elseif inStr(useragent,"msnbot") then
bname="MSN Bot"
elseif inStr(useragent,"slurp") then
bname="Yahoo! Slurp"
end if
elseif inStr(useragent,"wget") then
bname="Wget"
elseif inStr(useragent,"ask jeeves") or inStr(useragent,"teoma") then
bname="Ask Jeeves/Teoma"
elseif inStr(useragent,"msie") then
btype="[IE"
bversion=Mid(useragent,inStr(useragent,"msie")+5,3)
btype=btype & bversion &"]"
bname="IE"
if inStr(useragent,"msn") then
bname="MSN"
elseif inStr(useragent,"aol") then
bname="AOL"
elseif inStr(useragent,"webtv") then
bname="WebTV"
elseif inStr(useragent,"myie2") then
bname="MyIE2"
elseif inStr(useragent,"maxthon") then
bname="Maxthon"
elseif inStr(useragent,"gosurf") then
bname="GoSurf"
elseif inStr(useragent,"netcaptor") then
bname="NetCaptor"
elseif inStr(useragent,"sleipnir") then
bname="Sleipnir"
elseif inStr(useragent,"avant browser") then
bname="AvantBrowser"
elseif inStr(useragent,"greenbrowser") then
bname="GreenBrowser"
elseif inStr(useragent,"slimbrowser") then
bname="SlimBrowser"
end if
elseif inStr(useragent,"opera") then
bname="Opera"
idx=inStr(useragent,"opera")
bversion=mid(useragent,idx+6,idx+9)
bname=bname & bversion
elseif inStr(useragent,"applewebkit") then
btype="[AppleWebKit]"
if inStr(useragent,"omniweb") then
bname="OmniWeb"
elseif inStr(useragent,"safari") then
bname="Safari"
elseif inStr(useragent,"mozilla") then
bname="Mozilla"
end if
end if
if bname="" then bname="unknow"
GetBrower=bname
end Function
dim tbrower
tbrower = GetBrower
if tbrower = "FireFox" then
Response.Redirect "/Sorry.asp"
Response.Flush
end if
%>
Function SystemCheck()
useragent=Request.ServerVariables("HTTP_USER_AGENT")
'转化为小写
useragent=Lcase(useragent)
'Browser Check
dim btype,bname,bversion,idx,Os
btype=""
if inStr(useragent,"icab") then
bname="iCab"
elseif inStr(useragent,"lynx") then
bname="Lynx"
elseif inStr(useragent,"links") then
bname="Links"
elseif inStr(useragent,"elinks") then
bname="ELinks"
elseif inStr(useragent,"jbrowser") then
bname="JBrowser"
elseif inStr(useragent,"konqueror") then
bname="Konqueror"
elseif inStr(useragent,"gecko") then
bname="Mozilla"
btype=btype &"[Gecko]"
if inStr(useragent,"aol") then
bname="AOL"
elseif inStr(useragent,"netscape") then
bname="Netscape"
elseif inStr(useragent,"firefox") then
bname="FireFox"
elseif inStr(useragent,"chimera") then
bname="Chimera"
elseif inStr(useragent,"camino") then
bname="Camino"
elseif inStr(useragent,"galeon") then
bname="Galeon"
elseif inStr(useragent,"k-meleon") then
bname="K-Meleon"
end if
elseif inStr(useragent,"bot") or inStr(useragent,"crawl") or inStr(useragent,"spider") or inStr(useragent,"mediapartners") or inStr(useragent,"slurp") then
btype=btype &"[Bot/Crawler/Spider]"
if inStr(useragent,"grub") then
bname="Grub"
elseif inStr(useragent,"googlebot") or inStr(useragent,"google") then
bname="GoogleBot"
elseif inStr(useragent,"baidu") then
bname="BaiduBot"
elseif inStr(useragent,"sogou") then
bname="SogouBot"
elseif inStr(useragent,"msnbot") then
bname="MSN Bot"
elseif inStr(useragent,"slurp") then
bname="Yahoo! Slurp"
end if
elseif inStr(useragent,"wget") then
bname="Wget"
elseif inStr(useragent,"ask jeeves") or inStr(useragent,"teoma") then
bname="Ask Jeeves/Teoma"
elseif inStr(useragent,"msie") then
btype="[IE"
bversion=Mid(useragent,inStr(useragent,"msie")+5,3)
btype=btype & bversion &"]"
bname="IE"
if inStr(useragent,"msn") then
bname="MSN"
elseif inStr(useragent,"aol") then
bname="AOL"
elseif inStr(useragent,"webtv") then
bname="WebTV"
elseif inStr(useragent,"myie2") then
bname="MyIE2"
elseif inStr(useragent,"maxthon") then
bname="Maxthon"
elseif inStr(useragent,"gosurf") then
bname="GoSurf"
elseif inStr(useragent,"netcaptor") then
bname="NetCaptor"
elseif inStr(useragent,"sleipnir") then
bname="Sleipnir"
elseif inStr(useragent,"avant browser") then
bname="AvantBrowser"
elseif inStr(useragent,"greenbrowser") then
bname="GreenBrowser"
elseif inStr(useragent,"slimbrowser") then
bname="SlimBrowser"
end if
elseif inStr(useragent,"opera") then
bname="Opera"
idx=inStr(useragent,"opera")
bversion=mid(useragent,idx+6,idx+9)
bname=bname & bversion
elseif inStr(useragent,"applewebkit") then
btype="[AppleWebKit]"
if inStr(useragent,"omniweb") then
bname="OmniWeb"
elseif inStr(useragent,"safari") then
bname="Safari"
elseif inStr(useragent,"mozilla") then
bname="Mozilla"
end if
end if
'Os Check
if inStr(useragent,"windows ce") then
Os="Windows ce"
elseif inStr(useragent,"windows 95") then
Os="Windows 95"
elseif inStr(useragent,"windows 98") then
Os="Windows 98"
elseif inStr(useragent,"windows 2000") then
Os="Windows 2000"
elseif inStr(useragent,"windows xp") then
Os="Windows XP"
elseif inStr(useragent,"windows nt 5.0") then
Os="Windows 2000"
elseif inStr(useragent,"windows nt 5.1") then
Os="Windows XP"
elseif inStr(useragent,"windows nt 5.2") then
Os="Windows 2003"
elseif inStr(useragent,"windows nt") then
Os="Windows NT"
elseif inStr(useragent,"win32") then
Os="Win32"
elseif inStr(useragent,"x11") or inStr(useragent,"unix") then
Os="unix"
elseif inStr(useragent,"sunos") or inStr(useragent,"sun os") then
Os="SUN OS"
elseif inStr(useragent,"powerpc") or inStr(useragent,"ppc") then
Os="PowerPC"
elseif inStr(useragent,"macintosh") then
Os="Mac"
elseif inStr(useragent,"mac osx") then
Os="MacOSX"
elseif inStr(useragent,"freebsd") then
Os="FreeBSD"
elseif inStr(useragent,"linux") then
Os="Linux"
elseif inStr(useragent,"palmsource") or inStr(useragent,"palmos") then
Os="PalmOS"
elseif inStr(useragent,"wap ") then
Os="WAP"
end if
if bname="" then bname="unknow"
if Os="" then Os="unknow"
SystemCheck=bname & "/" &Os
end Function
大处入眼小处着手,这是做很多事情的基本方法,自然也适用与搜索引擎优化。Google的搜索排名可以做得很复杂,但是也可以很简单,问题在于你是否真的用心并且一直坚持。
如果你想在互联网上成功,大量的免费访问量是你成功的最重要因素。Copy不厚道请看清楚,我说的是免费的访问量,不单是访问量。如果你不能获取更多的免费访问量,那么你只好忍痛掏出自己的钱包吧。
也许你在论坛灌水的本事高超,如长江般绵绵不绝。
也许你家里还有几十亿个邮件地址,你的电脑24小时不停地向世界传播你伟大的"产品信息"。
也许你会想你有很多的朋友,一个介绍十个,十个介绍一百个依次无穷无尽。
然而,我必须把每个这样想的人的泡沫残忍地击碎,依靠这些手段你永远都不可能真正地赢得成功。
那么你要问:"到底我要怎样做才能获得巨大的最好是免费的访问量呢?"
我要问你:"如果你需要非常非常多的水,你会到那里去找呢?"
去大海,去浩瀚无边的大海,而世界上最大的网上流量之海就是Google,Google每天有2亿多次的搜索问量。
搜索引擎和SEO有着共同的目标,就是帮助客户最快的找到他要找的东西。
对于大多数搜索引擎来说,网站中影响搜索结果页面(SERP)排名的两条根本因素就是:
1、网站是不是客户最想要找的东西
2、这个网站能不能最快地让浏览者找到
那么所有的SEO(而不是搜索引擎作弊)手段,根本上也就是让满网站不段满足上述两个要求的过程。
想学会搜索引擎优化,必须要了解如下一些东西:
1、了解搜索引擎如何抓取网页和如何索引网页。 你需要知道一些搜索引擎的基本工作原理,各个搜索引擎之间的区别,搜索机器人(SE robot或叫web crawler)如何进行工作,搜索引擎如何对搜索结果进行排序等等。
2、Meta标签优化。 主要包括主题(Title),网站描述(Description),和关键词(Keywords)。还有一些其它的隐藏文字比如Author(作者),Category(目录),Language(编码语种)等。
3、如何选取关键词并在网页中放置关键词。搜索就得用关键词。关键词分析和选择是SEO最重要的工作之一。首先要给网站确定主关键词(一般在5个上下),然后针对这些关键词进行优化,包括关键词密度(Density),相关度(Relavancy),突出性(Prominency)等等。
4、了解主要的搜索引擎。虽然搜索引擎有成千上万,但是对网站流量起决定作用的就那么几个。比如英文的主要有Google,Inktomi,Altavista等;中文的有百度,搜狐等。不同的搜索引擎对页面的抓取和索引、排序的规则都不一样。还要了解各搜索门户和搜索引擎之间的关系,比如Yahoo和AOL网页搜索用的是 Google的搜索技术,MSN用的是Looksmart和Open Directory的技术。
5、主要的互联网目录。 Yahoo自身不是搜索引擎,而是一个大型的网站目录,Open Directory也不是,他们和搜索引擎的主要区别是网站内容的收集方式不同。
6、按点击付费的搜索引擎。搜索引擎也需要赢利,随着互联网商务的越来越成熟,收费的搜索引擎也开始大行其道。最典型的有Overture和百度,当然也包括Google的广告项目 Google Adwords。越来越多的人通过搜索引擎的点击广告来定位商业网站,这里面也大有优化和排名的学问,你得学会用最少的广告投入获得最多的点击。
7、搜索引擎登录。网站做完了以后,别躺在那里等着客人从天而降。要让别人找到你,最简单的办法就是将网站提交(submit)到搜索引擎。虽然免费已经不再是互联网(至少是搜索引擎)的主流-如果你的是商业网站,主要的搜索引擎和目录都会要求你付费来获得收录(比如Yahoo要299美元),但是好消息是(至少到目前为止)最大的搜索引擎Google目前还是免费,而且它主宰着60%以上的搜索市场。
8、链接交换和链接广泛度(Link Popularity)。网页内容都是以超文本(Hypertext)的方式来互相链接的,网站之间也是如此。除了搜索引擎以外,人们也每天通过不同网站之间的链接来 Surfing("冲浪")。其它网站到你的网站的链接越多,你也就会获得更多的访问量。更重要的是,你的网站的外部链接数越多,会被搜索引擎认为它的重要性越大,从而给你更高的排名。所以,你得花很多精力去做和别人做交换链接。
2007年7月2日
数据库中有两个字段 姓名,分数。
有N条记录
张1 12
李2 35
王3 33
张2 34
王7 35
李4 33
怎么样才能选出所有分相同的记录??
比如一条 select 语句结果是
李2 35
王7 35
王3 33
李4 33
SELECT 姓名,分数 FROM [成绩表]
WHERE EXISTS(SELECT * FROM (select 分数 from [成绩表] group by 分数 having count(*) >=2) AS T1
where 成绩表.分数=分数) order by 分数
2007年6月3日
这几天股票连续三天大跳水,大家都在网上骂政府的黑手干预,其实还有一个大家不太知道也不太相信的原因——我的出手!住我隔壁同事老魏前几天每天都可以赚万八千,乐得合不拢嘴,每天半夜还在网上神侃,也不知道是跟他在远方的老婆吹牛还是在泡mm,吵的我经常晚上睡不着,还有一个毕业不久在我手下混的研究生,投了几万元在股市里,每天也可以增值一千左右,这混小子每天都忙于看股市行情,根本都没有心事工作,对我的安排爱理不理,真是让我非常恼火,但我也没有办法,如果踏踏实实干活,每月也才几千元,在当前的股市行情下,三五天的股票收入就可以低上一个月的工资奖金了,金钱至上的年代,人心不古呀!
然而,工作任务很繁重,不将他从股市里拉回来工作,任务会完不成挨上级训甚至经济惩罚的。这帮人,哼,让赚钱赚晕了头,不知道我会是传说中的牛市杀手。
早在04年我就发现我具有摁下牛头的特异功能,几乎是百发百中,那时股票市场也是大牛市里,那时组里有个年龄是35岁但总爱说我们女孩如何如何的女人买股票,今天说赚500,明天又赚1000,很让我心里痒痒,也偷偷的跑去开了个账号,那时对股票几乎一无所知,就随便挑了几支连续几个月都在涨的股票,我记得很清楚,有上海石化、西北化工等,谁知道我当天买,第二天大盘涨势依旧,但我买的这三支股票都下跌,我舍不得割肉,幸好总投入不是很多,一个星期共亏了近一千元,终于支撑不住了,全卖掉了,偷偷的打听到那个35岁女孩的股票,买了500股,第三天见到她时,就再没有听到她说股票又赚几百元的事情了,因为我买进的第二天,那支股票也开始下跌了,我又赔进去几百元,也为我而导致女同事的股票下跌内心很不安,于是决定开始对股票进行相关的调查研究后再买,那时候,最火的股票是士兰微,网上讨论非常热烈,股票涨势异常凶猛,我也想再次验证一下我是否是天生的牛股杀手,于是买了200股,第二天居然赚了40多元钱,我终于体验到股市赚钱的乐趣了,但40元太少了,既然我不是我所担心的真正牛股杀手,这支股票只要延续其原来的涨势3-5天,将我的全部继续3万元投进去,就可以赚千元以上,在我将钱全部投进去的第二天,士兰微开始下跌,紧接着大盘也开始下跌,我等了半月左右才全部抛掉,总计损失8000元。我这一单交易竟然是近两年大熊市的开端。这时我才领悟到,我可能就是天生的牛股甚至是牛市的杀手,万元以内的投入可以买跌一支涨势良好的牛股,万元以上的投入可以买跌牛市。我决定从此不再涉足股市,免得祸害中国千千万万的股民。
但这一次,我被迫出招,是老魏等人逼的,在股票里赚了钱,就搅得楼道里半夜还鸡犬不宁,搞得我们的工作也无法正常开展。几年不用,我的账号及密码都已经忘记了,周一拿身份证去重新修改了密码并往工行账号里注入了一万元钱,因为白天上班在机房,无法上网,当天晚上就填写了一个买入的单,但不知道是怎么回事,周二下班回来看到没有成交。周三早上上班前特意上网填了一个买入单,中午就听研究生说有几百支股票跌停,没有想到还是这么准,本想跌一点给老魏及研究生一点点惩罚也就罢了,准备周四将资金撤出来,但周四来接我们的车比往常来的早了一些,我还没打开电脑就被大伙催着上车了,等下午回来,看到股票又是几百支股票跌停。难道这么牛的牛市都经不起我的1万元资金的冲击吗?我真是有些不相信,周五干脆也不撤了,结果大盘还真是接着跌,又是几百支股票跌停。
现在算起来我买过的股票也有好几十种了,但不管涨的多么好,只要我买入,没有几支能挺过2天的。想起来我也挺卑鄙的,为了报私仇连累了那么多股民,下周一一定将其它工作放一放,将我的资金全部撤出来,股市要再跌,就不关我的事了。
ps:http://bgpmaoyl.blog.hexun.com/9805141_d.html
2007年5月31日
摘要:
本文介绍了怎么在ASP.NET 2.0中使用Membership新特性,并且介绍了怎么两种不同的Membership的Provider:ActiveDirectoryMembershipProvider和SqlMembershipProvider,前者是基于微软活动目录服务存储用户信息的,或者是基于SQL SERVER存储的。2.0中的这个新机制大大减少了站点用户认证模块的代码量。
目录:
学习目的
使用ActiveDirectoryMembershipProvider
使用SqlMembershipProvider
ActiveDirectoryMembershipProvider的一些设置参数
SqlMembershipProvider的一些设置参数
Membership 的一些API
学习目的:
学会使用Membership进行表单认证
学会设置ActiveDirectoryMembershipProvider
学会使用ActiveDirectoryMembershipProvider建立认证用户
学会设置SqlMembershipProvider
学会建立SQL SERVER Membership数据库
学会使用SqlMembershipProvider建立认证用户
使用ActiveDirectoryMembershipProvider
如果用户信息是存储在活动目录中,而你的内网程序又因为防火墙或者需要适应不同的浏览器等原因不能使用windows集成认证的话,这个时候你可以选择使用ActiveDirectoryMembershipProvider实现表单认证
基本的步骤如下
按照以下步骤来用ActiveDirectoryMembershipProvider实现asp.net程序的用户表单认证
1、配置表单认证
2、配置ActiveDirectoryMembershipProvider
3、建立用户
4、认证用户
1、配置表单认证
要实现表单认证需要设置<authentication>的mode属性为"Forms",然后按照下面的例子配置web.config文件
???
?????????? protection="All"
?????????? timeout="30"
? ?????????name="AppNameCookie"
?????????? path="/FormsAuth"
?????????? requireSSL="false"
?????????? slidingExpiration="true"
?????????? defaultUrl="default.aspx"
?????????? cookieless="UseCookies"
?????????? enableCrossAppRedirects="false"/>
?
·???????????????????? loginUrl 指向登录页面,你需要把它放在支持SSL的目录下
·???????????????????? Protection 设置成"All"表示为认证凭据同时启用数据来源验证和加密
·???????????????????? Timeout 指定了认证的生存时间
·???????????????????? name and path are set to unique values for the current application.
·???????????????????? requireSSL 设置成"false"表示关闭cookie的SSL加密
·???????????????????? slidingExpiration 如果设置成"true"的话,每次访问过期时间将会重置
·???????????????????? defaultUrl 就是设置程序的首页
·???????????????????? cookieless 设置成"UseCookies"表示使用cookie来传递认证票据
·???????????????????? enableCrossAppRedirects 设置成"false"表示程序不接受外部的请求
按照下面的例子为<authentication> 增加<authorization>块,表明只有登录过的用户才能进入程序否则会被转到前面loginUrl设置的页面
??
??
?
2、配置ActiveDirectoryMembershipProvider
按照下面的例子配置ActiveDirectoryMembershipProvider
?
?? connectionString=
??? "LDAP://domain.testing.com/CN=Users,DC=domain,DC=testing,DC=com" />
?
?...
?
?
???
????? name="MembershipADProvider"
????? type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web,
??????????? Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
??????????????? connectionStringName="ADConnectionString"
??????????????? connectionUsername="\administrator"
??????????????? connectionPassword="password"/>
??
?
?...
?
前面的代码为<providers>添加<add>子节点来为membership指定ActiveDirectoryMembershipProvider,活动目录中存储用户信息的连接字符串如下格式LDAP:// server/userdn,
·???????????????????? server 是活动目录服务器的IP或者名字
·???????????????????? userdn 是活动目录的DN,格式是/CN=Users然后是逗号加上逗号分割开的域名,比如域名是domain.testing.com,连接字符串就是LDAP://domain.testing.com/CN=Users,DC=domain,DC=testing,DC=com
?
注意:确保<membership>的defaultProvider属性设置成了你的ActiveDirectoryMembershipProvider(在这个例子中是MembershipADProvider),如果需要为机器级别改变这个属性,%windir%\Microsoft.NET\Framework\{Version}\Config\machine.config文件中改写原有的AspNetSqlMembershipProvider,AspNetSqlMembershipProvider是使用SQLMembershipProvider在\app_data目录中的SQL Server Express数据库来存放用户信息的机制
3、建立用户
可以使用下面的几种方法新建用户
·???????????????????? 打开vs.net2005的Website菜单,点击ASP.NET Configuration,然后在安全里面进行设置
·???????????????????? 建立一个ASP.NET页面,放入一个CreateUserWizard控件,这个控件使用配置过的membership provider来实现建立用户的过程
·???????????????????? 手动拖放填写用户名和密码的文本框然后使用Membership API的CreateUser方法来实现
?
注意:其实所有这些方法最终还是使用Membership.CreateUser来建立用户
默认配置的ActiveDirectoryMembershipProvider使用UPNs来进行名字印象,如下
attributeMapUsername="userPrincipalName"
因为所有用户名都需要按照下面的格式:
UserName@DomainName
如果手动使用Membership.CreateUser方法来创建用户,这么做
Membership.CreateUser("UserName@DomainName", "P@ssw0rd", "userName@emailAddress");
?
你也能设置config文件来改变映象方式:
attributeMapUsername="sAMAccountName"
如果这样设置的话,用户名就如下格式:
UserName
这样建立用户:
Membership.CreateUser("UserName", "P@ssw0rd", "userName@emailAddress")
注意:你可以设置requiresUniqueEmail为"true"来确保所有用户的mail地址不重复
4、认证用户
要认证用户,你必须要建立一个登录页面,而它也就是唯一不需要验证的页面
可以使用以下方法建立登录页面:
l???????? 用ASP.NET 2.0登录控件,这个控件几乎包含了所有涉及到的操作,它会自动连接配置过的membership provider,不需要写任何代码,登录以后控件可以保存用户信息,比如用加密过的cookie保存。
l???????? 当然你也可以手动来用文本框完成这个过程,可以利用Membership 的ValidateUser来判断登录情况,登录完成后你还需要用FormsAuthentication类来为用户的浏览器写入cookie,下面是例子:
?
if (Membership.ValidateUser(userName.Text, password.Text))
{
? if (Request.QueryString["ReturnUrl"] != null)
? {
??? FormsAuthentication.RedirectFromLoginPage(userName.Text, false);
? }
? else
? {
??? FormsAuthentication.SetAuthCookie(userName.Text, false);
? }
}
else
{
? Response.Write("Invalid UserID and Password");
}
?
注意:上面两种方式都是使用Membership.CreateUser方法
bool isValidUser = Membership.ValidateUser("UseName@DomainName", "P@ssw0rd");
?
attributeMapUsername="sAMAccountName"
?
bool isValidUser = Membership.ValidateUser("UserName", "P@ssw0rd", "userName@emailAddress")
?
使用SQLMemberShipProvider
当在外网做验证或者内网有没有配置活动目录的时候我们可以使用SQLMembershipProvider来作为验证的数据源,其实默认的设置就是使用SQLMembershipProvider的
基本步骤
按照如下的步骤来为表单验证启用SqlMembershipProvider
1、配置表单认证
2、按照membership数据库
3、建立用户
4、认证用户
1、省略。。。同ActiveDirectoryMembershipProvider
2、按照membership数据库
在使用SqlMembershipProvider以前需要安装一个membership数据库,使用一个SQL SERVER管理员权限登录到服务器,然后在Visual Studio 2005命令行模式下执行下面的语句
?
aspnet_regsql.exe -E -S localhost -A m
看下几个参数:
-E 表明此帐号使用windows集成认证
-S 表明需要安装数据库的服务器名
-A m 表明自动为membership建立相应的表和存储过程
?
注意:Aspnet_regsql 工具同样为其他ASP.NET 2.0特性安装数据库,比如说成员管理,Profile,个性化Web Parts还有Web Events等,当然都会有其他的命令,如果你不使用任何参数的话可以以想到模式运行程序,会允许你在安装的过程中指定数据库服务器和你需要安装的组件
?
3、配置SqlMembershipProvider
Machine.config其实默认就是使用SQL Server Express作为SqlMembershipProvider的,如果你的数据库不是运行在本机的,可以修改下配置
?
...
?
???
?????
?????
??????? name="SqlProvider"
??????? type="System.Web.Security.SqlMembershipProvider"
??????? connectionStringName="MySqlConnection"
??????? applicationName="MyApplication"
??????? enablePasswordRetrieval="false"
??????? enablePasswordReset="true"
??????? requiresQuestionAndAnswer="true"
??????? requiresUniqueEmail="true"
??????? passwordFormat="Hashed" />
???
?
?
更多信息看本文“SqlProviderMembershipProvider属性配置”章节
Step 4. Create Users
4、建立用户:
省略。。。同ActiveDirectoryMembershipProvider
5、认证用户:
省略。。。同ActiveDirectoryMembershipProvider
?
ActiveDirectoryMembershipProvider的属性配置
表1显示了ActiveDirectoryMembershipProvider的属性,默认值和用途
表1: ActiveDirectoryMembershipProvider的属性配置
(这部分不翻译)
|
Attribute |
Default Value |
Notes |
|
connectionStringName |
? |
Points to a connection string contained in the connection strings configuration section. This attribute is required because it points to the primary LDAP bind string that is used for create, update, get, and validate operations. |
|
connectionUserName |
? |
Defines the user name used for authentication purposes when connecting to the directory. If this attribute is specified, the companion connectionPassword attribute must also be specified. This attribute is used to configure a set of credentials that can be used to connect to the directory (instead of using the process account or impersonation credentials that are in effect at the time the provider connects to the directory). |
|
connectionPassword |
? |
Defines the password used for authentication purposes when connecting to the directory. If this attribute is specified, the companion connectionUserName attribute must also be specified. This attribute is used to configure a set of credentials that can be used to connect to the directory (instead of using the process account or impersonation credentials that are in effect at the time the provider connects to the directory). |
|
connectionProtection |
Secure |
Defines the transport layer security options that are used when opening connections to the directory. This attribute can have a string value of "Secure" or "None".
If set to "Secure", the provider attempts to select the highest level of connection security available, based on the type of directory that the provider connects to. The protection is determined as follows: SSL is first attempted because SSL is an option that works with both Active Directory and ADAM (ActiveDirectoryConnection Protection.Ssl). If SSL is not available and the provider is connecting to Active Directory or to a domain-joined ADAM instance, encrypt-sign-and-seal is used (ActiveDirectoryConnection Protection.SignAndSeal). If neither SSL nor encrypt-sign-seal is available, the provider generates a ProviderException, stating that it could not automatically select a secure connection to the configured directory. |
|
enablePasswordReset |
False |
Controls whether or not a password can be reset. For security reasons, with the ActiveDirectoryMembershipProvider, this attribute can only be set to true if all of the following have been set: requiresQuestionAndAnswer is set to true. passwordQuestion, passwordAnswer, attributeMapFailedPasswordAnswer Count, attributeMapFailedPassword AnswerTime, and attributeMapFailed PasswordAnswerLockoutTime have been mapped to attributes in the directory. Note: Even if this attribute is set to true, password resets are allowed only if the credentials used to perform the reset have Administrator privileges in Active Directory.. |
|
enableSearchMethods |
False |
Allows an administrator to set whether or not search-oriented methods can be called on the provider instance. Because methods such as Find* and GetAllUsers can be very expensive, the default value for this attribute is false. The following methods throw a NotSupportedException if they are called when this attribute is set to false: FindUsersByName FindUsersByEmail GetAllUsers |
|
requiresQuestionAnd Answer |
False |
Determines whether a password question and answer are required for a password reset.
For security reasons, with ActiveDirectoryMembership Provider, this attribute can only be set to true if all of the following have been set: attributeMapPasswordQuestion, attributeMapPasswordAnswer, attributeMapFailedPasswordAnswerCount, attributeMapFailedPasswordAnswerTime, and attributeMapFailedPasswordAnswerLockoutTime |
|
applicationName |
/ |
For this provider, applicationName is included for completeness with other providers. Internally, it does not matter what value is placed here because the application name is not used. The maximum value is 256 characters. |
|
requiresUniqueEmail |
False |
Specifies whether the e-mail values used in the application must be unique. |
|
maxInvalidPassword Attempts |
5 |
Indicates the number of failed password attempts or failed password answer attempts allowed before a user's account is locked. When the number of failed attempts equals the value set in this attribute, the user's account is locked out.
For the Active Directory provider, this attribute applies only to managing resets that use a password answer. Active Directory manages bad password attempts internally. |
|
passwordAttempt Window |
10 |
Indicates the time window, in minutes, during which failed password attempts and failed password answer attempts are tracked.
For the Active Directory provider, this attribute applies only to managing resets that use a password answer. Active Directory manages bad password attempts internally. |
|
passwordAnswer AttemptLockout Duration |
30 |
Specifies the duration, in minutes, that a lockout due to a bad password answer is considered still in effect. Because Active Directory uses the concept of timing out bad password lockouts, this attribute is necessary to support a similar concept of timing bad password answer attempts. |
|
minRequiredPassword Length |
7 |
Specifies the minimum number of characters required in a password. The value can be from 1 to 128. |
|
minRequiredNonAlpha numericCharacters |
1 |
Specifies the minimum number of non-alphanumeric characters required in a password. This configuration attribute cannot be set to a value greater than the value of the minRequiredPasswordLength. This means the configuration setting must be in the range of 0–minRequiredPasswordLength, inclusive of minRequiredPasswordLength. |
|
passwordStrength RegularExpression |
"" |
Provides a valid regular expression that the provider will use as part of password strength validation. |
|
attributeMapUsername |
userPrincipalName |
Defines the mapping from a property on a MembershipUser object to an attribute within the directory. The only directory attributes for mapping to a username if you are using Active Directory are userPrincipalName or sAMAccountName. The only allowed directory attributes for mapping to username if you are using ADAM is userPrincipalName. |
|
attributeMapEmail |
Mail |
Defines the mapping from a property on a MembershipUser object to an attribute within the directory. |
|
attributeMapPassword Question |
UNDEFINED |
Defines the mapping from a property on a MembershipUser object to an attribute within the directory. |
|
attributeMapPassword Answer |
UNDEFINED |
Defines the mapping from a property on a MembershipUser object to an attribute within the directory. |
|
attributeMapFailed PasswordAnswerCount |
UNDEFINED |
Defines the mapping from a property on a MembershipUser object to an attribute within the directory. |
|
attributeMapFailed PasswordAnswerTime |
UNDEFINED |
Defines the mapping from a property on a MembershipUser object to an attribute within the directory. |
|
attributeMapFailed PasswordAnswer LockoutTime |
UNDEFINED |
Defines the mapping from a property on a MembershipUser object to an attribute within the directory. |
如果要启用取回密码你需要在<providers>后增加<add>设置attributeMapPasswordQuestion 和 attributeMapPasswordAnswer 属性来增加ActiveDirectoryMembershipProvider详细见How To: Use Forms Authentication with Active Directory in ASP.NET 2.0.
SqlMembershipProvider Configuration Attributes
SqlMembershipProvider属性配置
表2显示了SqlMembershipProvider的属性,默认值和用途
表 2. SqlMembershipProvider属性配置
|
属性 |
默认 |
用途 |
|
connectionStringName |
? |
SQL SERVER的连接字符串 |
|
enablePasswordReset |
False |
密码能否重置 安全原因,只有当 requiresQuestionAndAnswer 设置为 true的时候你才可以设置enablePasswordReset为true
|
|
requiresQuestionAnd Answer |
False |
是否需要启用取回密码 |
|
applicationName |
/ |
设置了它可以让多个应用程序在数据库内有所区分,不需要为每个应用建立一个数据库了 |
|
requiresUniqueEmail |
False |
邮件地址是否需要唯一 |
|
maxInvalidPassword Attempts |
5 |
密码输入错误几次就会锁定用户 |
|
passwordAttempt Window |
10 |
每分钟可以失败的次数 |
|
passwordFormat |
? |
密码方式 Clear, Encrypted, 和Hashed. 第一种是明文存储,效率比较高,但是SQL SERVER中能直接读取密码,不安全. 第二种是不可逆加密,需要一定的加密换算过程,但是比较安全.第三种是可逆加密,密码不能找回 |
|
minRequiredPassword Length |
7 |
指定至少密码需要几位 |
|
minRequiredNonAlpha numericCharacters |
1 |
指定需要是非数字字母作为密码的位数,不能大于minRequiredPassword Length |
|
passwordStrength RegularExpression |
"" |
指定强度计算的正则表达式 |
Membership类
表3列出了一些Membership类重要的一些方法参数和用法
表3. Membership 类方法
|
方法名 |
参数 |
备注 |
|
CreateUser |
string username–创建的用户名. string password–新用户密码 string email–新用户mail地址 string passwordQuestion string passwordAnswer bool IsApproved object providerUserKey |
? |
|
DeleteUser |
string username–需要删除的用户名 bool removeAllRelatedData |
返回true表示删除,false表示没有找到 |
|
FindUsersByName |
string usernameToMatch int pageIndex int pageSize |
返回找到的用户的集合,支持通配符 "*", "%" 和 "_". |
|
FindUsersByEmail |
string emailToMatch int pageIndex int pageSize |
? |
|
GeneratePassword |
int length Int numberOfNonAlpha NumericCharacters |
? |
|
GetAllUsers |
int pageIndex int pageSize |
返回用户记录集 |
|
GetNumberOfUsersOnline |
None |
返回在线的用户,活动目录不支持 |
|
GetUsernameByEmail |
string email–需要查找的用户的mail地址 |
? |
|
UpdateUser |
MembershipUser user–需要更新的用户名 |
? |
|
ValidateUser |
string username–需要验证的用户名 string password–需要验证的密码 |
? |
注意? GetAllUsers 方法在 RTM 版本的 .NET Framework 2.0 会取消
?
特别注意
默认情况下表单认证的票据传输是明文的,为了防止票据被盗窃,我们还是建议你为服务器启用SSL。设置requireSSL属性为true来启用SSL,下面的例子显示了怎么启用SSL,还有不管用户使用http还是https形式的url进入网站都能启用,你可以尝试登录到loginUrl指定的页面看看,但是需要保证这个页面是没有任何约束的
?
???
???????
?????????????? protection="All"
?????????????? timeout="30"
?????????????? name="AppNameCookie"
?????????????? path="/FormsAuth"
?????????????? requireSSL="true"
?????????????? slidingExpiration="true"
?????????????? defaultUrl="default.aspx"
?????????????? cookieless="UseCookies"
?????????????? enableCrossAppRedirects="false"/>
???
?
??? 禁止没有权限的用户 -->
???
??????
??????
????
?
?
使得登录页面没有任何限制 -->
?
???
??????
????
?
2007年4月21日
RSS 2.0 的新特性
RSS 2.0 建立在 RSS 0.91 规范的基础上。它是向后兼容的,因此任何处理 RSS 2.0 的工具应该也能够处理 0.91 提要。升级后的规范增加了少量元素,比如 和 。
它也去掉了一些限制。在过去, 和 元素只能是 http 或 ftp,现在可以使用任何有效的 URI。在 RSS 0.91 中,每个频道只能包含 15 个项,而且元素的长度也有限制,现在这些限制都取消了。不过仍然应该小心使用较大的值,因为它们可能对老的应用程序造成问题。
不过更大的变化是能够使用名称空间扩展这种格式。RSS 2.0 支持名称空间,一种增加规范中没有的元素的标准方法。只要定义在一个名称空间中,提要可以包含新的元素。
RSS 2.0 概述
RSS 是一种 XML 方言,用于连锁 Web 内容和元数据。RSS 0.91 是几种可用版本中最常用的一种。对于新的 RSS 提要,更好的办法是使用 2.0 版,因为这是现行的规范,而且如前所述,它与 0.91 向后兼容。
Dave Winer 编写了规范的 2.0 版。规范的修改可能变得难以使用,或者损害已有的应用程序,他有意识地避免了这种情况。Winer 总结了他的思想:“保持简单。这就是 RSS 的价值所在。任何稍微了解 HTML 的人都能够理解 RSS。这一点极其重要!”
该规范在 Creative Commons 许可下发布(请参阅参考资料)。这意味着您可以免费复制和分发该规范,并进行衍生工作,而且可以自由地用于商业工作。一个咨询委员会负责更新规范、推广规范和编写文档。
RSS 文件形式
RSS 文件由一个 <channel> 元素及其子元素组成。除了频道内容本身之外,<channel> 还以项的形式包含表示频道元数据的元素 —— 比如 <title>、<link> 和 <description>。项通常是频道的主要部分,包含经常变化的内容。
频道
频道一般有三个元素,提供关于频道本身的信息:
<title>:频道或提要的名称。
<link>:与该频道关联的 Web 站点或者站点区域的 URL。
<description>:简要介绍该频道是做什么的。
许多频道子元素都是可选的。常用的 <image> 元素包含三个必需的子元素:
<url>:表示该频道的 GIF、JPEG 或 PNG 图像的 URL。
<title>:图象的描述。当频道以 HTML 呈现时,用作 HTML <image> 标签的 ALT 属性。
<link>:站点的 URL。如果频道以 HTML 呈现,该图像作为到这个站点的链接。
<image> 还有三个可选的子元素:
<width>:数字,表示图象的像素宽度,最大值是 188,默认值为 88。
<height>:数字,表示图象的像素高度。最大值是 400,默认值为 31。
<description>:包含文本,在呈现时可以作为围绕着该图像形成的链接元素的 title 属性。
此外还可以使用许多其他可选的频道元素。多数都是不言自明的:
<language>:en-us
<copyright>:Copyright 2006, Maklon Z
<managingEditor>:Maklon@126.com
<webMaster>:Maklon@126.com
<pubDate>:Sat, 15 Nov 2006 0:00:01 GMT
<lastBuildDate>:Sat, 15 Nov 2006 0:00:01 GMT
<category>:Technique
<generator>:WebEditor
<docs>:http://www.maklonzjing.ne
<cloud>:允许进程注册为“cloud”,频道更新时通知它,为 RSS 提要实现了一种轻量级的发布-订阅协议。
<ttl>:存活时间 是一个数字,表示提要在刷新之前缓冲的分钟数。
<rating>:关于该频道的 PICS 评价。
<textInput>:定义可与频道一起显示的输入框。
<skipHours>:告诉聚集器哪些小时的更新可以忽略。
<skipDays>:告诉聚集器那一天的更新可以忽略。
项
项通常是提要中最重要的部分。每个项都可以关于某个 weblog、完整文档、电影评论、分类广告或者任何希望与 频道连锁的内容的记录。频道中的其他元素可能不变,但项经常发生变化。
您可以有任意多个项。以前的规范限值为 15 个项,如果要保持向后兼容这仍然是一个很好的上限。
新闻项的元素
每个项通常包含三个元素:
<title>:这是项的名称,在标准应用中被转换成 HTML 中的标题。
<link>:这是该项的 URL。title 通常作为一个链接,指向包含在 <link> 元素中的 URL。
<description>:通常作为 link 中所指向的 URL 的摘要或者补充。
所有的元素都是可选的,但是一个项至少要么 包含一个 <title>,要么包含一个 <description>。
项还有其他一些可选的元素:
<author>:作者的 e-mail 地址。
<category>:支持有组织的记录。
<comments>:关于项的注释页的 URL。
<enclosure>:支持和该项有关的媒体对象。
<guid>:唯一与该项联系在一起的永久性链接。
<pubDate>:该项是什么时候发布的。
<source>:该项来自哪个 RSS 频道,当把项聚合在一起时非常有用。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=591115
什么是 RSS?
RSS 是一种站点内容聚合的格式。
它的名字是Really Simple Syndication 的的简写。
RSS是XML的一种。所有的RSS文档都遵循 XML 1.0规范, 该规范发布在W3C网站上。
这里是RSS版本历史的一个概要。
在一个RSS文档中,最外层是一个<rss>元素,这个元素必须规定version属性,该属性明确了本文档遵从何种RSS版本规范。如果一个RSS文档以这个规范来表示,那么它的version属性就必须是2.0。
<rss>元素只有一个子元素<channel>,包含了关于这个频道(元数据)和它的内容的一些信息。
样本文件
这里有一些RSS样本文件: RSS 0.91, 0.92 和 2.0。
注意这些样本文件所指向的链接地址和服务器可能已经不再存在。在撰写0.91文档的时候,这个0.91的样本文件就已经创建了。维护一个样本文件的历史也许是一个不错的主意。
关于本文档
本文档完成于2002年秋天,版本为 2.0.1。
它包含从 RSS 0.91 规范(2000年)开始的所有的修改和添加,以及包含在RSS 0.92 (2000年12月)和RSS 0.94(2002年8月)中的新的特性。
详细的文档历史纪录请参阅这里。
本文档中首先介绍必须的和可选的频道元素;接着介绍了<item>的子元素。最后回答了一些经常碰到的问题,并提供了未来的发展路线和RSS扩展的指导方针。
必需的频道元素
下面是一个必须包含的频道(channel)元素的列表,每一个都有一个简单的描述、一个例子、应该出现的位置和更详细描述的链接地址。
01.● title
名称:title
描述:频道的名称。它表明别人如何访问你的服务。如果你有一个与你的RSS文件内容一致的HTML网站,你的title元素值应该与你的网站的标题相同。
例子:GoUpstate.com 的新闻大字标题。
02.● link
名称:link
描述:对应频道的网站的URL链接地址。
例子:http://www.goupstate.com/ 。
03.● description
名称:description
描述:关于频道的描述。
例子:The latest news from GoUpstate.com, a Spartanburg Herald-Journal Web site。
可选的频道元素
下面是一个可选的频道(channel)元素的列表。
01.● language
名称:language
描述:频道使用的语言。比如,在一个网站上,允许聚合所有的意大利语站点到相应的分组。对于这个元素,可使用的值,参阅 Netscape提供的清单。或者可以参阅W3C定义的 清单。
例子:en-us。
02.● copyright
名称:copyright
描述:频道内容的版权声明。
例子:Copyright 2002, Spartanburg Herald-Journal
03.● managingEditor
名称:managingEditor
描述:频道内容责任编辑的电子邮件地址。
例子:geo@herald.com (George Matesky)
04.● webMaster
名称:webMaster
描述:频道技术支持人员的电子邮件地址。
例子:betty@herald.com (Betty Guernsey)
05.● pubDate
名称:pubDate
描述:频道内容发布的日期。所有的日期和时间都必须遵循 RFC 822规范, 但年份可以用2个或4个字母表示(首选4个字母)。
例子:Sat, 07 Sep 2002 00:00:01 GMT
06.● lastBuildDate
名称:lastBuildDate
描述:频道内容的最后修改时间。
例子:Sat, 07 Sep 2002 09:42:31 GMT
07.● category
名称:category
描述:指定频道所属的一个或多个分类。遵循与item级category元素相同的规则。详见这里。
例子:<category>Newspapers</category>
08.● generator
名称:generator
描述:表明生成频道的程序名称的字符串。
例子:MightyInHouse Content System v2.3
09.● docs
名称:docs
描述:指向该RSS文件所用格式说明文档的URL链接地址。
例子:http://blogs.law.harvard.edu/tech/rss。
10.● cloud
名称:cloud
描述:允许通过注册一个cloud来处理获得频道的更新通知,并为rss种子实现一个轻量级的发布订阅协议,详见这里。
例子:<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="pingMe" protocol="soap"/>
11.● ttl
名称:ttl
描述:ttl是Time to live的缩写,表示生存时间。它表示频道从源更新之前可以缓存的时间。详见 这里。
例子:<ttl>60</ttl>。
12.● image
名称:image
描述:指定一个可以在频道中显示的GIF、JPEG或者 PNG 图像。详见这里。
例子:。
13.● rating
名称:rating
描述:频道的 PICS 内容分级信息。
例子: 。
14.● textInput
名称:textInput
描述:指定一个可以在频道中显示的文本输入框。详见这里。
例子:。
15.● skipHours
名称:skipHours
描述:提示聚合器,可以跳过那些小时的时间段。详见这里。
例子:。
16.● skipDays
名称:skipDays
描述:提示聚合器,可以跳过那些天的时间段。详见这里。
例子:。
<channel>的子元素<image>
<image> 是 <channel>的一个可选子元素, 它本身包含了三个必须的和三个可选的子元素。
<url>是一个GIF、JPEG或PNG图像文件的URL链接地址,该图像代表整个频道。
<title>用于描述上面的图像,当频道在HTML中显示时,用于HTML语言中的<img>的alt属性。
<link>是要连接的站点的url,当显示频道时,图像的连接指向该站点。(在实际中,<title>和<link>应该与频道的<title>和<link>有相同的值)。
可选的元素包括<width>和<height>,它们是数字类型,指定图像的宽度和高度,单位为像素。
<description>就是link的TITLE属性中文本,它将在调用网页时显示出来。
图像宽度的最大值为144,默认值为88 。
图像高度的最大值为400,默认值为31 。
<channel>的子元素<cloud>
<cloud> 是 <channel>的一个可选子元素。
它指定一个可以支持rssCloud接口的web服务,rssCloud接口可以在HTTP-POST、XML-RPC或SOAP1.1中实现。
它的目的是允许通过注册一个cloud来处理获得频道的更新通知,从而为RSS feeds实现一个轻量级的发布订阅协议.
<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="myCloud.rssPleaseNotify" protocol="xml-rpc" />
在这个例子中,为了请求频道通知,你需要发送一个XML-RPC消息到rpc.sys.com的80端口,路径为/RPC2。调用的程序为为myCloud.rssPleaseNotify。
这个元素的详细说明和 rssCloud 接口说明请参阅 这里。
<channel>子元素<ttl>
<ttl><channel>的一个可选子元素。
ttl是Time to live的缩写,表示生存时间。它表示频道从源重新更新之前可以缓存的时间。这使得rss源可以被一个支持文件共享的网络所管理,例如Gnutella。
例子: <ttl>60</ttl>
<channel>的子元素<textInput>
频道可以选择包含一个<textInput>子元素,它本身包含了四个必须的子元素。
<title>--文本输入区域提交按钮的标签。
<description>--文本输入区域的描述。
<name>--文本输入区域中文本对象的名称。
<link>--处理文本输入请求的CGI脚本的URL链接地址。
使用<textInput>元素的目的看起来有些神秘。你可以用它提供一个搜索引擎输入框,或让读者提供反馈信息。许多聚合器忽略该元素。
<item>的元素
一个频道可以包含许多<item>元素。一个项目可以代表一个"故事" ——比如说一份报纸或杂志上的故事;如果是这样的话,那么项目的描述则是故事的摘要,项目的链接则指向整个故事的链接位置。一个项目也可以本身是完整的,如果是这样的话,项目的描述就包含了文本(整体以HTML格式编码是可以的;参见 例子),而链接和标题可以省略。项目的所有元素都是可选的,但是至少要包含一个标题(title)或描述(description)。
01.● title
名称:title
描述:item的标题。
例子:Venice Film Festival Tries to Quit Sinking
02.● link
名称:link
描述:item的URL链接地址。
例子:http://nytimes.com/2004/12/07FEST.html
03.● description
名称:description
描述:item的摘要。
例子:Some of the most heated chatter at the Venice Film Festival this week was about the way that the arrival of the stars at the Palazzo del Cinema was being staged.
04.● author
名称:author
描述:item作者的电子邮件地址。详见这里。
例子:。
05.● category
名称:category
描述:包含item在一个或多个分类中。详见这里。
例子:。
06.● comments
名称:comments
描述:与item相关的评论的URL链接地址。详见 这里。
例子:。
07.● enclosure
名称:enclosure
描述:item附加的媒体对象。详见这里。
例子:。
08.● guid
名称:guid
描述:可以唯一确定item身份的字符串。详见 这里。
例子:。
09.● pubDate
名称:pubDate
描述:item发布的时间。详见 这里。
例子:。
10.● source
名称:source
描述:rss频道来源。详见 这里。
例子:。
<item>的子元素<source>
<source>是<item>的一个可选子元素。
它的值是item所属rss频道的名称,从title衍生而来。它有一个必须包含的属性url, 该属性链接到XML序列化源。
<source url="http://www.tomalak.org/links2.xml">Tomalak's Realm</source>
该元素的作用是提高链接的声望,从而进一步推广新闻项目的源头。它可以用在聚合器的Post命令中。当从聚合器中通过一个webblog编辑工具提交一个item时,<source>应该能够被自动生成。
<item>的子元素<enclosure>
<enclosure>是<item>的一个可选子元素。
它有三个必须的属性。url属性表明enclosure的位置,length属性表明它的字节大小,而type属性则指出它的标准MIME类型。
这里的url必须为一个http url。
<enclosure url="http://www.scripting.com/mp3s/weatherReportSuite.mp3" length="12216320" type="audio/mpeg" />
它的 use-case 说明请参见这里。
<item>的子元素<category>
<category>是<item>的一个可选子元素。
它有一个可选属性domain,该属性是一个用来定义分类法的字符串。
该节点的值是一个斜杠分割的字符串,它用来表明在指定的分类法中的层次位置。处理器可以为分类的识别建立协定。以下是两个例子:
<category>Grateful Dead</category>
<category domain="http://www.fool.com/cusips">MSFT</category>
你可以根据需要为不同的域包含很多<category>元素,并且可以在相同域的不同部分拥有一个交叉引用的item。
<item>的子元素<pubDate>
<pubDate> 是<item>的一个可选子元素。
它的值是一个 日期, 表明项目发布的时间。如果它是一个将来的日期,则聚合器在日期到达之前可以选择不显示该项目。
<pubDate>Sun, 19 May 2002 15:21:36 GMT</pubDate>
<item>的子元素<guid>
<guid>是<item>的一个可选子元素。
guid 是 globally unique identifier的缩写。它是一个可以唯一识别这个<item>的字符串。在发布之后,聚合器可以选择使用该字符串判断这个<item>是否是新的。
<guid>http://some.server.com/weblogItem3207</guid>
guid没有特定的语法规则。聚合器必须将它们当作一个字符串来处理。生成具有唯一性的字符串guid取决于种子的源头。
如果guid元素有isPermaLink属性,并且值为真,解释器就会认为它是item的permalink。permalink是一个可在web浏览器中打开的url链接,它指向<item>节点所描述的完整item。 例如:
<guid isPermaLink="true">http://inessential.com/2002/09/01.php#a2</guid>
isPermaLink是可选属性,默认值为真。如果值为假,guid将不会被认为是一个url或指向任何对象的url。
<item>的子元素<comments>
<comments>是<item>的一个可选子元素。
如果出现,它指向与item相关的评论的url。
<comments>http://ekzemplo.com/entry/4403/comments</comments>
更多信息,请参阅 这里。
<item>的子元素<author>
<author>是<item>的一个可选子元素。
它是item作者的电子邮件地址l。对于通过rss传播的报纸和杂志,作者可能是写该item所描述的文章的人。对于聚集型webblogs,作者可能不是责任编辑或站长。对于个人维护的webblog,忽略<author>节点是有意义的。
<author>lawyer@boyer.net (Lawyer Boyer)</author>
注释
RSS限制<link> 和 <url>元素的数据首字母为非空格字符。这些元素的数据必须以IANA-registered URI方案规定的格式开始,如http://, https://, news://, mailto:和 ftp://等。在RSS2.0规范之前,RSS规范只允许http:// 和 ftp://,然而在实践中,其他的URI方案被内容开发者广泛使用,并被聚合器所支持。聚合器也许对它们支持的URI方案有一些限制,而内容开发者不应该假定所有的聚合器都支持所有的URI方案。
在 RSS 0.91规范中,各种元素都被限制为500或100个字符。在一个符合0.91规范的频道中,不能超过15个 <item> 元素。在RSS 0.92和以后的规范中,不再有这些字符长度或者XML级别的限制。处理器也许强加一些它们自己的限制,产生者也许有自己的一些参数选择,它们可以规定在一个频道中,不超过一定数目的<item>元素,或者字符串都限制在一定的长度。
如上所述,在 RSS 2.0规范中,对于一个目录系统,当链接一个频道到它的标识中时,使用基于频道级别的分类特征。 例如,如果链接一个频道到它的Syndic8 标识,则将包括一个分类元素作为频道的子元素,它有域“Syndic8”属性,同时在Syndic8 数据库中为你的频道确定这个标识。正确的分类元素脚本应该是 <category domain="Syndic8">1765</category>。
一个经常被问到的问题是关于<guid> 如何和 <link>进行区别。它们指的是相同的事情吗?在一些内容系统中是,但在别的内容系统中可能不是。在一些系统中,<link>是一个网络日志项的永久链接。然后在别的系统中,每一个<item>都是一个较长文章的摘要,<link>指向这篇文章,而<guid>则是这个网络日志入口的永久链接。在所有的情况下,建议提供<guid>,如果可能的话,并使它成为一个永久链接。这使聚合着在内容发生变化时,也不会出现重复项目成为可能。
如果你对RSS 2.0规范的格式有任何问题,请向由Sjoerd Visscher维护的电子邮件列表RSS2-Support发送邮件。这个邮件列表不是一个技术辩论的列表,而是一个针对作者和开发人员在创建和使用RSS 2.0格式的内容时提供技术支持的列表。
RSS的扩展
RSS起源于1999年,目标是成为一个简单、易于理解的数据格式。在它逐渐成为一种流行格式之后,开发者想在一个名字空间中使用模块对它进行扩展,正像W3C定义的那样。
RSS遵循简单的规则,增加了它的能力。一个RSS feed 可以包含不是在本页中描述的内容,而只是在一个名字空间中定义的那些元素。
本文档中定义的元素不是一个名字空间本省的元素,因此, RSS2.0从某种意义上来讲,和原来的版本是兼容的,即一个 0.91 或者 0.92 版本的文件也是一个有效的 2.0 版本文件。如果RSS2.0的元素是在一个名字空间中,那么这种约束将被打破,即 一个0.9x 版本的文件不可能是一个有效的2.0 版本的文件。
发展方向
RSS决不是一个完美的格式,但是它现在已经非常流行,并得到广泛的支持。要成为一个固定的规范,RSS需要很长的一段时间。这项工作的目的是帮助RSS成为一个固定的事情,同时促进和培育围绕它进行的开发的市场的增长,并为新的聚合格式铺平道路。因此,为了实用的目的,RSS规范将被冻结在2.0.2版本。我们可以预期的可能的2.0.2 或者 2.0.3等版本,都只是出于澄清规范的目的,而不是在格式上增加新的特征。后续的工作应该集中在模块化、名字空间的使用和在完全新的聚合格式中用新的名字等方面。
许可协议和作者
RSS 2.0 是在遵循i the Attribution/Share Alike Creative Commons 许可协议 的基础上由 the Berkman Center for Internet & Society at Harvard Law School 提供。本文档的作者是 Dave Winer,UserLand software的创始人,也是 Berkman Center 的员工。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=639444
2007年4月4日
1、DateTime 数字型
System.DateTime currentTime=new System.DateTime();
1.1 取当前年月日时分秒
currentTime=System.DateTime.Now;
1.2 取当前年
int 年=currentTime.Year;
1.3 取当前月
int 月=currentTime.Month;
1.4 取当前日
int 日=currentTime.Day;
1.5 取当前时
int 时=currentTime.Hour;
1.6 取当前分
int 分=currentTime.Minute;
1.7 取当前秒
int 秒=currentTime.Second;
1.8 取当前毫秒
int 毫秒=currentTime.Millisecond;
(变量可用中文)
2、Int32.Parse(变量) Int32.Parse("常量")
字符型转换 转为32位数字型
3、 变量.ToString()
字符型转换 转为字符串
12345.ToString("n"); //生成 12,345.00
12345.ToString("C"); //生成 ¥12,345.00
12345.ToString("e"); //生成 1.234500e+004
12345.ToString("f4"); //生成 12345.0000
12345.ToString("x"); //生成 3039 (16进制)
12345.ToString("p"); //生成 1,234,500.00%
4、变量.Length 数字型
取字串长度:
如: string str="中国";
int Len = str.Length ; //Len是自定义变量, str是求测的字串的变量名
5、System.Text.Encoding.Default.GetBytes(变量)
字码转换 转为比特码
如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str);
然后可得到比特长度:
len = bytStr.Length;
6、System.Text.StringBuilder("")
字符串相加,(+号是不是也一样?)
如:System.Text.StringBuilder sb = new System.Text.StringBuilder("");
sb.Append("中华");
sb.Append("人民");
sb.Append("共和国");
7、变量.Substring(参数1,参数2);
截取字串的一部分,参数1为左起始位数,参数2为截取几位。
如:string s1 = str.Substring(0,2);
8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
取远程用户IP地址
9、穿过代理服务器取远程用户真实IP地址:
if(Request.ServerVariables["HTTP_VIA"]!=null){
string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}else{
string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
}
10、 Session["变量"];
存取Session值;
如,赋值: Session["username"]="小布什";
取值: Object objName=Session["username"];
String strName=objName.ToString();
清空: Session.RemoveAll();
11、String str=Request.QueryString["变量"];
用超链接传送变量。
如在任一页中建超链接:<a href=Edit.aspx?fbid=23>点击</a>
在Edit.aspx页中取值:String str=Request.QueryString["fdid"];
12、DOC对象.CreateElement("新建节点名");
创建XML文档新节点
13、父节点.AppendChild(子节点);
将新建的子节点加到XML文档父节点下
14、 父节点.RemoveChild(节点);
删除节点
15、Response
Response.Write("字串");
Response.Write(变量);
向页面输出。
Response.Redirect("URL地址");
跳转到URL指定的页面
16、char.IsWhiteSpce(字串变量,位数)——逻辑型
查指定位置是否空字符;
如:
string str="中国 人民";
Response.Write(char.IsWhiteSpace(str,2)); //结果为:True, 第一个字符是0位,2是第三个字符。
17、char.IsPunctuation('字符') --逻辑型
查字符是否是标点符号
如:Response.Write(char.IsPunctuation('A')); //返回:False
18、(int)'字符'
把字符转为数字,查代码点,注意是单引号。
如:
Response.Write((int)'中'); //结果为中字的代码:20013
19、(char)代码
把数字转为字符,查代码代表的字符。
如:
Response.Write((char)22269); //返回“国”字。
20、 Trim()
清除字串前后空格
21 、字串变量.Replace("子字串","替换为")
字串替换
如:
string str="中国";
str=str.Replace("国","央"); //将国字换为央字
Response.Write(str); //输出结果为“中央”
再如:(这个非常实用)
string str="这是<script>脚本";
str=str.Replace("<","<font><</font>"); //将左尖括号替换为<font> 与 < 与 </font> (或换为<,但估计经XML存诸后,再提出仍会还原)
Response.Write(str); //显示为:“这是<script>脚本”
如果不替换,<script>将不显示,如果是一段脚本,将运行;而替换后,脚本将不运行。
这段代码的价值在于:你可以让一个文本中的所有HTML标签失效,全部显示出来,保护你的具有交互性的站点。
具体实现:将你的表单提交按钮脚本加上下面代码:
string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。
strSubmit=strSubmit.Replace("<","<font><</font>");
然后保存或输出strSubmit。
用此方法还可以简单实现UBB代码。
22、Math.Max(i,j)
取i与j中的最大值
如 int x=Math.Max(5,10); // x将取值 10
加一点吧 23、字串对比......
加一点吧
23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法:
(1)、
string str1; str2
//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如:
if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); }
(2)、
//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
(3)、
//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
24、IndexOf() 、LastIndexOf()
查找字串中指定字符或字串首次(最后一次)出现的位置,返回索引值,如:
str1.IndexOf("字"); //查找“字”在str1中的索引值(位置)
str1.IndexOf("字串");//查找“字串”的第一个字符在str1中的索引值(位置)
str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置)
25、Insert()
在字串中指定索引位插入指定字符。如:
str1.Insert(1,"字");在str1的第二个字符处插入“字”,如果str1="中国",插入后为“中字国”;
26、PadLeft()、PadRight()
在字串左(或右)加空格或指定char字符,使字串达到指定长度,如:
<%
string str1="中国人";
str1=str1.PadLeft(10,'1'); //无第二参数为加空格
Response.Write(str1); //结果为“1111111中国人” , 字串长为10
%>
27、Remove()
从指定位置开始删除指定数的字符
字串对比一般都用: if(str1==str2){ } , 但还有别的方法:
1、
string str1; str2
//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如:
if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); }
2、
//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
3、
//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
IndexOf()
查找字串中指定字符或字串首次出现的位置,返首索引值,如:
str1.IndexOf("字"); //查找“字”在str1中的索引值(位置)
str1.IndexOf("字串");//查找“字串”的第一个字符在str1中的索引值(位置)
str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置)
1.9 取中文日期显示——年月日时分
string strY=currentTime.ToString("f"); //不显示秒
1.10 取中文日期显示_年月
string strYM=currentTime.ToString("y");
1.11 取中文日期显示_月日
string strMD=currentTime.ToString("m");
1.12 取当前年月日,格式为:2003-9-23
string strYMD=currentTime.ToString("d");
1.13 取当前时分,格式为:14:24
string strT=currentTime.ToString("t");
更新一下, 上面不能编辑:
c#.net函数和方法集(大家一起来加啊)
1、DateTime 数字型
System.DateTime currentTime=new System.DateTime();
1.1 取当前年月日时分秒
currentTime=System.DateTime.Now;
1.2 取当前年
int 年=currentTime.Year;
1.3 取当前月
int 月=currentTime.Month;
1.4 取当前日
int 日=currentTime.Day;
1.5 取当前时
int 时=currentTime.Hour;
1.6 取当前分
int 分=currentTime.Minute;
1.7 取当前秒
int 秒=currentTime.Second;
1.8 取当前毫秒
int 毫秒=currentTime.Millisecond;
(变量可用中文)
1.9 取中文日期显示——年月日时分
string strY=currentTime.ToString("f"); //不显示秒
1.10 取中文日期显示_年月
string strYM=currentTime.ToString("y");
1.11 取中文日期显示_月日
string strMD=currentTime.ToString("m");
1.12 取中文年月日
string strYMD=currentTime.ToString("D");
1.13 取当前时分,格式为:14:24
string strT=currentTime.ToString("t");
1.14 取当前时间,格式为:2003-09-23T14:46:48
string strT=currentTime.ToString("s");
1.15 取当前时间,格式为:2003-09-23 14:48:30Z
string strT=currentTime.ToString("u");
1.16 取当前时间,格式为:2003-09-23 14:48
string strT=currentTime.ToString("g");
1.17 取当前时间,格式为:Tue, 23 Sep 2003 14:52:40 GMT
string strT=currentTime.ToString("r");
1.18获得当前时间 n 天后的日期时间
DateTime newDay = DateTime.Now.AddDays(100);
2、Int32.Parse(变量) Int32.Parse("常量")
字符型转换 转为32位数字型
3、 变量.ToString()
字符型转换 转为字符串
12345.ToString("n"); //生成 12,345.00
12345.ToString("C"); //生成 ¥12,345.00
12345.ToString("e"); //生成 1.234500e+004
12345.ToString("f4"); //生成 12345.0000
12345.ToString("x"); //生成 3039 (16进制)
12345.ToString("p"); //生成 1,234,500.00%
4、变量.Length 数字型
取字串长度:
如: string str="中国";
int Len = str.Length ; //Len是自定义变量, str是求测的字串的变量名
5、System.Text.Encoding.Default.GetBytes(变量)
字码转换 转为比特码
如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str);
然后可得到比特长度:
len = bytStr.Length;
6、System.Text.StringBuilder("")
字符串相加,(+号是不是也一样?)
如:System.Text.StringBuilder sb = new System.Text.StringBuilder("");
sb.Append("中华");
sb.Append("人民");
sb.Append("共和国");
7、变量.Substring(参数1,参数2);
截取字串的一部分,参数1为左起始位数,参数2为截取几位。
如:string s1 = str.Substring(0,2);
8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
取远程用户IP地址
9、穿过代理服务器取远程用户真实IP地址:
if(Request.ServerVariables["HTTP_VIA"]!=null){
string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}else{
string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
}
10、 Session["变量"];
存取Session值;
如,赋值: Session["username"]="小布什";
取值: Object objName=Session["username"];
String strName=objName.ToString();
清空: Session.RemoveAll();
11、String str=Request.QueryString["变量"];
用超链接传送变量。
如在任一页中建超链接:<a href=Edit.aspx?fbid=23>点击</a>
在Edit.aspx页中取值:String str=Request.QueryString["fdid"];
12、DOC对象.CreateElement("新建节点名");
创建XML文档新节点
13、父节点.AppendChild(子节点);
将新建的子节点加到XML文档父节点下
14、 父节点.RemoveChild(节点);
删除节点
15、Response
Response.Write("字串");
Response.Write(变量);
向页面输出。
Response.Redirect("URL地址");
跳转到URL指定的页面
16、char.IsWhiteSpce(字串变量,位数)——逻辑型
查指定位置是否空字符;
如:
string str="中国 人民";
Response.Write(char.IsWhiteSpace(str,2)); //结果为:True, 第一个字符是0位,2是第三个字符。
17、char.IsPunctuation('字符') --逻辑型
查字符是否是标点符号
如:Response.Write(char.IsPunctuation('A')); //返回:False
18、(int)'字符'
把字符转为数字,查代码点,注意是单引号。
如:
Response.Write((int)'中'); //结果为中字的代码:20013
19、(char)代码
把数字转为字符,查代码代表的字符。
如:
Response.Write((char)22269); //返回“国”字。
20、 Trim()
清除字串前后空格
21 、字串变量.Replace("子字串","替换为")
字串替换
如:
string str="中国";
str=str.Replace("国","央"); //将国字换为央字
Response.Write(str); //输出结果为“中央”
再如:(这个非常实用)
string str="这是<script>脚本";
str=str.Replace("<","<font><</font>"); //将左尖括号替换为<font> 与 < 与 </font> (或换为<,但估计经XML存诸后,再提出仍会还原)
Response.Write(str); //显示为:“这是<script>脚本”
如果不替换,<script>将不显示,如果是一段脚本,将运行;而替换后,脚本将不运行。
这段代码的价值在于:你可以让一个文本中的所有HTML标签失效,全部显示出来,保护你的具有交互性的站点。
具体实现:将你的表单提交按钮脚本加上下面代码:
string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。
strSubmit=strSubmit.Replace("<","<font><</font>");
然后保存或输出strSubmit。
用此方法还可以简单实现UBB代码。
22、Math.Max(i,j)
取i与j中的最大值
如 int x=Math.Max(5,10); // x将取值 10
23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法:
(1)、
string str1; str2
//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如:
if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); }
(2)、
//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
(3)、
//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
24、IndexOf() 、LastIndexOf()
查找字串中指定字符或字串首次(最后一次)出现的位置,返回索引值,如:
str1.IndexOf("字"); //查找“字”在str1中的索引值(位置)
str1.IndexOf("字串");//查找“字串”的第一个字符在str1中的索引值(位置)
str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置)
25、Insert()
在字串中指定索引位插入指定字符。如:
str1.Insert(1,"字");在str1的第二个字符处插入“字”,如果str1="中国",插入后为“中字国”;
26、PadLeft()、PadRight()
在字串左(或右)加空格或指定char字符,使字串达到指定长度,如:
<%
string str1="中国人";
str1=str1.PadLeft(10,'1'); //无第二参数为加空格
Response.Write(str1); //结果为“1111111中国人” , 字串长为10
%>
27、Remove()
从指定位置开始删除指定数的字符
<%
string str1="我是萨达姆的崇拜者之一";
Response.Write(str1.Remove(5,4)); //结果为“我是萨达姆之一”
%>
2007年2月28日
DHTML和JS中页面元素的识别控制DHTML和JS中页面元素的识别控制
在动态网页制作过程中,经常需要对相应的页面元素进行相应的操作,这就需要我们能够准确的控制每一个页面元素。
一般网页中的元素,都可以用多种方式来标识,例如可以通过上下文关系识别,或者触发元素识别,等等。
网页中最常用的元素标识方法有三种,它们是ID、CLASS和NAME,表示给单个元素标识,而CLASS用于给同类型的命名,而NAME给一般元素命名。例如,可以在如下命名:
<img id="pic" src="..">
<span name="kuai"></span>
<div class="layer"></div>
当我们在JAVASCRIPT中调用这些元素时,就可以用document.all.pic、document.all.kuai来识别了。
一般情况下,一个名称只用于一个元素的命名,但也不完全如此,有时候同一类型的元素要同样的效果,不仅可以用CLASS来标识,还可以用ID或者NAME标识,引用时就可以对全部同样的ID和NAME一起操作了。
但这样就带来一个问题,如何识别其中的某一个元素。
这种情况下的识别和单一命名识别的区别在于加上数字索引,如前面的pic也可以用document.all.pic[1]来识别,其他的就按照它们在页面中出现的顺序来用相应的数字识别。
很多情况下,是由相应的事件触发了控制函数,我们就可能会用到引发事件的元素,这时可以用eventElement来识别,它代表的就是触发事件的哪个元素。
同时,还可以用parentElement和childrenElement来识别触发事件元素的上级元素和下级元素。
当用eventElement获得一个触发元素后,我们还可以获得它的标识名称。例如,用eventElement.tagName获得的是元素的HTML标识名,用eventElement.id 获得的是元素的名字,用eventElement.name获得的是元素的name名称。
2006年12月27日
原文地址:
http://sheneyan.com/g.php/tech/article/js/jsfunc.html
javascript的函数
子乌注:一篇相当不错的function入门文章,个人感觉相当经典。
- 词语翻译列表
- function:函数(Function未翻译)
- declare:定义
- assign:指派,分配
- functionbody:函数体(就是函数的内容)
- object:对象
- property:属性
- unnamed:匿名(在这里没翻译成未命名)
- object oriented programming:面相对相编程
- class:类(比如后面的class data type我翻译成类数据类型)
- pointer:指针
- reassign:重新分配
- nest:嵌套
- feature:功能,特性
- local/global:局部/全局
- blueprint:蓝图(?)
- user defined:用户自定义
- instance:实例
- prototype:原型(除了标题都不翻译)
- internal:内部
- constructor:构造器
- duplication:复制
函数:定义
有以下这些方法可以定义一个函数。所有这些都是有效的,但是它们在后台如何实现的则有一些差别。
常用的写法
一般大家都用这个写法来定义一个函数:
functionName([parameters]){functionBody};
Example D1:
Language:javascript, parsed in: 0.005 seconds, using GeSHi 1.0.7.12
-
function add(a, b)
-
{? ? ? ? ? ? ? ? ? ? ?
-
? return a+b;
-
}? ? ? ? ? ? ? ? ? ? ?
-
alert(add(1,2));? ? ? ? // 结果 3
-
?
运行示例
当我们这么定义函数的时候,函数内容会被编译(但不会立即执行,除非我们去调用它)。而且,也许你不知道,当这个函数创建的时候有一个同名的对象也被创建。就我们的例子来说,我们现在有一个对象叫做“add”(要更深入了解,看底下函数:对象节。)
匿名函数
我们也可以通过指派一个变量名给匿名函数的方式来定义它。
Example D2
Language:javascript, parsed in: 0.006 seconds, using GeSHi 1.0.7.12
-
var add=function(a, b)
-
{? ? ? ? ? ? ? ? ? ? ?
-
? return a+b;
-
}? ? ? ? ? ? ? ? ? ? ?
-
alert(add(1,2));? ? ? ? // 结果 3
-
?
运行示例
这个代码和前一个例子做了同样的事情。也许语法看起来比较奇怪,但它应该更能让你感觉到函数是一个对象,而且我们只是为这个对指派了一个名称。可以把它看做和var myVar=[1,2,3]一样的语句。以这种方式声明的函数内容也一样会被编译。
当我们指派一个这样的函数的时候,我们并不一定要求必须是匿名函数。在这里,我作了和ExampleD2一样的事情,但我加了函数名“theAdd”,而且我可以通过调用函数名或者是那个变量来引用函数。
Example D2A
Language:javascript, parsed in: 0.008 seconds, using GeSHi 1.0.7.12
-
var add=function theAdd(a, b)
-
{? ? ? ? ? ? ? ? ? ? ?
-
? return a+b;
-
}? ? ? ? ? ? ? ? ? ? ?
-
alert(add(1,2));? ? ? ? ? ?// 结果 3
-
alert(theAdd(1,2));? ? ? ? // 结果也是 3
-
?
运行示例
使用这种方式来定义函数在面向对象编程中是很有用的,因为我们能像底下这样使一个函数成为一个对象的属性。
Language:javascript, parsed in: 0.005 seconds, using GeSHi 1.0.7.12
-
var myObject=new Object();
-
myObject.add=function(a,b){return a+b};?
-
// myObject 现在有一个叫做“add”的属性(或方法)
-
// 而且我能够象下面这样使用它
-
myObject.add(1, 2);
-
?
new
我们也能够通过使用运算符new来定义一个函数。
这是一个最少见的定义函数的方式并且并不推荐使用这种方式除非有特殊的理由(可能的理由见下)。语法如下:
varName=new Function([param1Name, param2Name,...paramNName], functionBody);
Example D3:
Language:javascript, parsed in: 0.005 seconds, using GeSHi 1.0.7.12
-
var add=new Function("a", "b", "return a+b;");
-
alert(add(3,4));? ? ? ? // 结果 7
-
?
运行示例
我在这里有两个参数叫做a和b,而函数体返回a和b的和。请注意new Function(...)使用了大写F,而不是小写f。 这就告诉javascript,我们将要创建一个类型是Function的对象。 还要注意到,参数名和函数体都是作为字符串而被传递。我们可以随心所欲的增加参数,javascript知道函数体会是右括号前的最后一个字符串(如果没有参数,你能够只写函数体)。你没必要将所有东西都写在一行里(使用\或者使用字符串连接符+来分隔长代码)。\标记告诉JavaScript在下一行查找字符串的其余部分。例子如下:
Example D4
Language:javascript, parsed in: 0.007 seconds, using GeSHi 1.0.7.12
-
// 注意 "+"
-
// 和 "\"的不同用法
-
var add=new Function("a", "b",
-
? "alert" +? ? ? ? ? ? ? ? ? ? ?
-
? "('adding '+a+' and ' +b);\
-
? ?return a+b;");
-
alert(add(3,4));? ? ? ? // 结果 7
-
?
javascript:exampleD4();
采用这种方式定义函数会导致函数并没被编译,而且它有可能会比用其它方式定义的函数要慢。至于为什么,看一下这个代码:
Example D5
Language:javascript, parsed in: 0.022 seconds, using GeSHi 1.0.7.12
-
function createMyFunction(myOperator)
-
{
-
? return new Function("a", "b", "return a" + myOperator + "b;");
-
}
-
?
-
var add=createMyFunction("+");? ? ? ? ? ? ? ? // 创建函数 "add"
-
var subtract=createMyFunction("-");? ? ? ? ? ?// 创建函数 "subtract"
-
var multiply=createMyFunction("*");? ? ? ? ? ?// 创建函数 "multiply"
-
// test the functions
-
alert("加的结果="+add(10,2));? ? ? ? ? ? ? ? ? // 结果是 12
-
alert("减的结果="+subtract(10,2));? ? ? ? ? ? ?// 结果是 8
-
alert("乘的结果="+multiply(10,2));? ? ? ? ? ? ?// 结果是 20
-
alert(add);
-
?
运行示例
这个有趣的例子创建了三个不同的function,通过实时传递不同的参数来创建一个新Function。因为编译器没法知道最终代码会是什么样子的,所以new Function(...)的内容不会被编译。那这有什么好处呢?嗯,举个例子,如果你需要用户能够创建他们自己的函数的时候这个功能也许很有用,比如在游戏里。我们也许需要允许用户添加“行为”给一个“player”。但是,再说一次,一般情况下,我们应该避免使用这种形式,除非有一个特殊的目的。
函数:对象
函数是javascript中的一种特殊形式的对象。它是第一个类数据类型。这意味着我们能够给它增加属性。这里有一些需要注意的有趣观点:
对象的创建
就像刚才提及的,当我们定义一个函数时,javascript实际上在后台为你创建了一个对象。这个对象的名称就是函数名本身。这个对象的类型是function。在下面的例子,我们也许不会意识到这一点,但我们实际上已经创建了一个对象:它叫做Ball。
Example 1
Language:javascript, parsed in: 0.006 seconds, using GeSHi 1.0.7.12
-
function Ball()? ? ? ?// 也许看起来有点奇怪,但是这个声明
-
{? ? ? ? ? ? ? ? ? ? ?// 创建了一个叫做Ball的对象
-
? i=1;
-
}? ? ? ? ? ? ? ? ? ? ?
-
alert(typeof Ball);? ? ?// 结果 "function"
-
?
运行示例
我们甚至能将这个对象的内容打印出来而且它会输出这个函数的实际代码,Example 2: 点击 alert(Ball);来看看Ball的内容。
属性的添加
我们能够添加给Object添加属性,包括对象function。因为定义一个函数的实质是创建一个对象。我们能够“暗地里”给函数添加属性。比如,我们这里定义了函数Ball,并添加属性callsign。
Language:javascript, parsed in: 0.006 seconds, using GeSHi 1.0.7.12
-
function Ball()? ? ? ?// 也许看起来有点奇怪,但是这个声明
-
{? ? ? ? ? ? ? ? ? ? ?// 创建了一个叫做Ball的对象,而且你能够
-
}? ? ? ? ? ? ? ? ? ? ?// 引用它或者象下面那样给它增加属性
-
Ball.callsign="The Ball"; // 给Ball增加属性
-
alert(Ball.callsign); // 输出 "The Ball"
-
?
运行示例
指针
因为function是一个对象,我们能够为一个function分配一个指针。如下例,变量ptr指向了对象myFunction。
Language:javascript, parsed in: 0.005 seconds, using GeSHi 1.0.7.12
-
function myFunction(message)
-
{
-
? alert(message);
-
}
-
var ptr=myFunction;? // ptr指向了myFunction
-
ptr("hello");? ?? ? ?// 这句会执行myFunction:输出"hello"
-
?
运行示例
我们能够运行这个函数,就好像这个函数名已经被指针名代替了一样。所以在上面,这行ptr("hello"); 和myFunction("hello");的意义是一样的。
指向函数的指针在面向对象编程中相当有用。例如:当我们有多个对象指向同一个函数的时候(如下):
Example 4A
Language:javascript, parsed in: 0.017 seconds, using GeSHi 1.0.7.12
-
function sayName(name)
-
{
-
? alert(name);
-
}
-
var object1=new Object();? ? ? // 创建三个对象
-
var object2=new Object();
-
var object3=new Object();
-
object1.sayMyName=sayName;? ? ? ?// 将这个函数指派给所有对象
-
object2.sayMyName=sayName;
-
object3.sayMyName=sayName;
-
-
object1.sayMyName("object1");? ? // 输出 "object1"
-
object2.sayMyName("object2");? ? // 输出 "object2"
-
object3.sayMyName("object3");? ? // 输出 "object3"
-
?
运行示例
因为只有指针被保存(而不是函数本身),当我们改变函数对象自身的时候,所有指向那个函数的指针都会发生变化。我们能够在底下看到:
Example 5:
Language:javascript, parsed in: 0.016 seconds, using GeSHi 1.0.7.12
-
function myFunction()
-
{
-
? alert(myFunction.message);
-
}
-
myFunction.message="old";
-
var ptr1=myFunction;? ? ? ? ? ? ? ? ?// ptr1 指向 myFunction
-
var ptr2=myFunction;? ? ? ? ? ? ? ? ?// ptr2 也指向 myFunction
-
?
-
ptr1();????? ? ?// 输出 "old"
-
ptr2();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 输出 "old"
-
?
-
myFunction.message="new";
-
?
-
ptr1();????? ? ?// 输出 "new"
-
ptr2();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 输出 "new"
-
?
运行示例
指针的指向
我们能够在一个函数创建之后重新分配它,但是我们需要指向函数对象本身,而不是指向它的指针。在下例中,我将改变myfunction()的内容。
Example 6:
Language:javascript, parsed in: 0.007 seconds, using GeSHi 1.0.7.12
-
function myFunction()
-
{
-
? alert("Old");
-
}
-
myFunction(); // 输出 "Old"
-
myFunction=function()
-
{
-
? alert("New");
-
};
-
myFunction(); // 输出 "New"
-
?
运行示例
旧函数哪里去了??被抛弃了。
如果我们需要保留它,我们可以在改变它之前给它分配一个指针。
Example 6A:
Language:javascript, parsed in: 0.008 seconds, using GeSHi 1.0.7.12
-
function myFunction()
-
{
-
? alert("Old");
-
}
-
var savedFuncion=myFunction;
-
myFunction=function()
-
{
-
? alert("New");
-
};
-
myFunction();? ? // 输出 "New"
-
savedFuncion();? // 输出 "Old"
-
?
运行示例
不过要小心,象下面这样的例子并不会有作用,因为是创建了另一个叫做myFunctionPtr的函数而不是修改它。
Example 6B:
Language:javascript, parsed in: 0.009 seconds, using GeSHi 1.0.7.12
-
function myFunction()
-
{
-
? alert("Old");
-
}
-
var savedFunc=myFunction;
-
savedFunc=function()
-
{
-
? alert("New");
-
};
-
myFunction();? ? ? ? ? ? // 输出 "Old"
-
savedFunc();? ? ? ? ? ? ?// 输出 "New"
-
?
运行示例
内嵌函数
我们还能够在一个函数中嵌套一个函数。下例,我有一个叫做getHalfOf的函数,而在它里面,我有另一个叫做calculate的函数。
Example 7
Language:javascript, parsed in: 0.016 seconds, using GeSHi 1.0.7.12
-
function getHalfOf(num1, num2, num3)? ? ?
-
{
-
? function calculate(number)
-
? {
-
? ? return number/2;
-
? }
-
?
-
? var result="";
-
? result+=calculate(num1)+" ";
-
? result+=calculate(num2)+" ";
-
? result+=calculate(num3);
-
? return result;
-
}? ? ? ? ?
-
var resultString=getHalfOf(10,20,30);
-
alert(resultString);? ? ? ? ?// 输出 "5 10 15"
-
?
运行示例
你只能在内部调用嵌套的函数。就是说,你不能这么调用:getHalfOf.calculate(10),因为calculate只有当外部函数(getHalfOf())在运行的时候才会存在。这和我们前面的讨论一致(函数会被编译,但只有当你去调用它的时候才会执行)。
调用哪个函数?
你也许正在想命名冲突的问题。比如,下面哪一个叫做calculate的函数会被调用?
Example 8
Language:javascript, parsed in: 0.023 seconds, using GeSHi 1.0.7.12
-
function calculate(number)
-
{
-
? return number/3;
-
}
-
?
-
function getHalfOf(num1, num2, num3)? ? ?
-
{
-
? function calculate(number)
-
? {
-
? ? return number/2;
-
? }
-
?
-
? var result="";
-
? result+=calculate(num1)+" ";
-
? result+=calculate(num2)+" ";
-
? result+=calculate(num3);
-
? return result;
-
}? ? ? ? ?
-
var resultString=getHalfOf(10,20,30);
-
alert(resultString);? ? ? ? ?// 输出 "5 10 15"
-
?
运行示例
在这个例子中,编译器会首先搜索局部内存地址,所以它会使用内嵌的calculate函数。如果我们删除了这个内嵌(局部)的calculate函数,这个代码会使用全局的calculate函数。
函数:数据类型及构造函数
让我们来看看函数的另一个特殊功能--这让它和其它对象类型截然不同。一个函数能够用来作为一个数据类型的蓝图。这个特性通常被用在面向对象编程中来模拟用户自定义数据类型(user defined data type)。使用用户自定义数据类型创建的对象通常被成为用户自定义对象(user defined object)。
数据类型
在定义了一个函数之后,我们也同时创建了一个新的数据类型。这个数据类型能够用来创建一个新对象。下例,我创建了一个叫做Ball的新数据类型。
Example DT1
Language:javascript, parsed in: 0.004 seconds, using GeSHi 1.0.7.12
-
function Ball()
-
{
-
}
-
var ball0=new Ball(); // ball0 现在指向一个新对象
-
?
-
alert(ball0);? ? ? ? ?// 输出 "Object",因为 ball0 现在是一个对象
-
?
运行示例
这样看来,ball0=new Ball()作了什么?new关键字创建了一个类型是Object的新对象(叫做ball0)。然后它会执行Ball(),并将这个引用传给ball0(用于调用对象)。下面,你会看到这条消息:“creating new Ball”,如果Ball()实际上被运行的话。
Example DT2
Language:javascript, parsed in: 0.009 seconds, using GeSHi 1.0.7.12
-
function Ball(message)
-
{
-
? alert(message);
-
}
-
var ball0=new Ball("creating new Ball");? // 创建对象并输出消息
-
ball0.name="ball-0";? ? ? ? ? ? ? ? ? ? ? // ball0现在有一个属性:name
-
alert(ball0.name);? ? ? ? ? ? ? ? ? ? ? ? // 输出 "ball-0"
-
?
运行示例
我们可以把上面这段代码的高亮的一行看做是底下的代码高亮处的一个简写:
Language:javascript, parsed in: 0.010 seconds, using GeSHi 1.0.7.12
-
function Ball(message)
-
{
-
? alert(message);
-
}
-
var ball0=new Object();
-
ball0.construct=Ball;
-
ball0.construct("creating new ball");? // 执行 ball0.Ball("creating..");
-
ball0.name="ball-0";? ? ? ? ? ? ? ? ? ? ?
-
alert(ball0.name);? ? ? ? ?
-
?
运行示例
这行代码ball0.construct=Ball和Example 4中的ptr=myFunction语法一致。
如果你还是不明白这行的含义那就回过头再复习一下Example 4。注意:你也许考虑直接运行ball0.Ball("..."),但是它不会起作用的,因为ball0并没有一个叫做Ball("...")的属性,并且它也不知道你究竟想作些什么。
添加属性
当我们象上面那样使用关键字new创建一个对象的时候,一个新的Object被创建了。我们可以在创建之后给这个对象添加属性(就好像我在上面那样添加属性name。而接下来的问题就是如果我们创建了这个对象的另外一个实例,我们得象下面那样再次给这个新对象添加这个属性。)
Example DT3 (creates 3 ball objects)
Language:javascript, parsed in: 0.013 seconds, using GeSHi 1.0.7.12
-
function Ball()
-
{
-
}
-
var ball0=new Ball(); // ball0 现在指向了类型Ball的一个新实例
-
ball0.name="ball-0";? // ball0 现在有一个属性"name"
-
?
-
var ball1=new Ball();
-
ball1.name="ball-1";
-
?
-
var ball2=new Ball();
-
?
-
alert(ball0.name);? ? // 输出 "ball-0"
-
alert(ball1.name);? ? // 输出 "ball-1"
-
alert(ball2.name);? ? // 哦,我忘记给ball2添加“name”了!
-
?
我忘记给ball2添加属性name了,如果在正式的程序中这也许会引发问题。有什么好办法可以自动增加属性呢?嗯,有一个:使用this关键字。this这个词在function中有特别的意义。它指向了调用函数的那个对象。让我们看看下面的另一个示例,这时候我们在构造函数中添加上这些属性:
Example DT4
Language:javascript, parsed in: 0.010 seconds, using GeSHi 1.0.7.12
-
function Ball(message, specifiedName)
-
{
-
? alert(message);
-
? this.name=specifiedName;? ? ? ? ? ? ? ?
-
}
-
var ball0=new Ball("creating new Ball", "Soccer Ball");?
-
alert(ball0.name);? ? ? ? ? ? ? ? ? ?// prints "Soccer Ball"
-
?
运行示例
请记住:是new关键字最终使得构造函数被执行。在这个例子中,它将会运行Ball("creating new Ball", "Soccer Ball");而关键字this将指向ball0。
因此,这行:this.name=specifiedName变成了ball0.name="Soccer Ball"。
它主要是说:给ball0添加属性name,属性值是Soccer Ball。
我们现在只是添加了一个name属性给ball0,看起来和上一个例子中所做的很象,但却是一个更好更具扩展性的方法。现在,我们可以随心所欲的创建许多带有属性的ball而无需我们手动添加它们。而且,人们也希望创建的Ball对象能够清晰的看懂它的构造函数并且能够轻松找出Ball的所有属性。让我们添加更多属性到Ball里。
Example DT5
Language:javascript, parsed in: 0.026 seconds, using GeSHi 1.0.7.12
-
function Ball(color, specifiedName, owner, weight)
-
{
-
? this.name=specifiedName;? ? ? ? ? ? ? ?
-
? this.color=color;
-
? this.owner=owner;
-
? this.weight=weight;
-
}
-
var ball0=new Ball("black/white", "Soccer Ball", "John", 20);?
-
var ball1=new Ball("gray", "Bowling Ball", "John", 30);?
-
var ball2=new Ball("yellow", "Golf Ball", "John", 55);?
-
var balloon=new Ball("red", "Balloon", "Pete", 10);?
-
?
-
alert(ball0.name);? ? ? ? ? ? ? ? ? ? ? ? // 输出 "Soccer Ball"
-
alert(balloon.name);? ? ? ? ? ? ? ? ? ? ? // 输出 "Balloon"
-
alert(ball2.weight);? ? ? ? ? ? ? ? ? ? ? // 输出 "55"
-
?
运行示例
嘿!使用面向对象术语,你能够说Ball是一个拥有如下属性的对象类型:name, color, owner, weight。
将对象赋给属性
我们并没被限制只能添加形如字符串或者数字之类的简单数据类型作为属性。我们也能够将对象赋给属性。下面,supervisor是Employee的一个属性.
Example DT6
Language:javascript, parsed in: 0.021 seconds, using GeSHi 1.0.7.12
-
function Employee(name, salary, mySupervisor)
-
{
-
? this.name=name;? ? ? ? ? ? ? ?
-
? this.salary=salary;
-
? this.supervisor=mySupervisor;
-
}
-
var boss=new Employee("John", 200);
-
?
-
var manager=new Employee("Joan", 50, boss);?
-
var teamLeader=new Employee("Rose", 50, boss);?
-
?
-
alert(manager.supervisor.name+" is the supervisor of "+manager.name);
-
alert(manager.name+"\'s supervisor is "+manager.supervisor.name);?
-
?
会输出什么呢?运行示例
就像你在上面这个例子中看到的那样,manager和teamLeader都有一个supervisor属性,而这个属性是类型Employee的一个对象。
将函数作为属性
任何类型的对象都可以作为一个属性,回忆一下前面的Example 4(不是Example DT4),函数也是一个对象。所以你可以让一个函数作为一个对象的一个属性。下面,我将添加两个函数getSalary和addSalary。
Example DT7
Language:javascript, parsed in: 0.021 seconds, using GeSHi 1.0.7.12
-
function Employee(name, salary)
-
{
-
? this.name=name;? ? ? ? ? ? ? ?
-
? this.salary=salary;
-
?
-
? this.addSalary=addSalaryFunction;
-
?
-
? this.getSalary=function()
-
? ? ? ? ? ? ? ? ?{
-
? ? ? ? ? ? ? ? ? ?return this.salary;
-
? ? ? ? ? ? ? ? ?};
-
}
-
function addSalaryFunction(addition)
-
{
-
? this.salary=this.salary+addition;
-
}
-
?
-
var boss=new Employee("John", 200000);
-
boss.addSalary(10000);? ? ? ? ? ? ? ? ? ? // boss 长了 10K 工资……为什么老板工资可以长这么多:'(
-
alert(boss.getSalary());? ? ? ? ? ? ? ? ? // 输出 210K……为什么默认工资也那么高……:'(
-
?
运行示例
addSalary和getSalary演示了几种将函数赋给属性的不同方法。如果你记得我们最开始的讨论;我讨论了三种声明函数的不同方式。所有那些在这里都是适用的,但是上面展示的两个最常用。
让我们看看有什么不同。下面,注意一下9-12行的代码。当这部分代码执行的时候,函数getSalary被声明。如前面数次提到的,一个函数声明的结果是一个对象被创建。所以这时候boss被创建(接下来的高亮行),而boss里有一个getSalary属性。
Language:javascript, parsed in: 0.022 seconds, using GeSHi 1.0.7.12
-
function Employee(name, salary)
-
{
-
? this.name=name;? ? ? ? ? ? ? ?
-
? this.salary=salary;
-
?
-
? this.addSalary=addSalaryFunction;
-
?
-
? this.getSalary=function()
-
? ? ? ? ? ? ? ? ?{
-
? ? ? ? ? ? ? ? ? ?return this.salary;
-
? ? ? ? ? ? ? ? ?};
-
}
-
function addSalaryFunction(addition)
-
{
-
? this.salary=this.salary+addition;
-
}
-
?
-
var boss=new Employee("John", 200000);
-
var boss2=new Employee("Joan", 200000);
-
var boss3=new Employee("Kim", 200000);
-
?
-
?
当你创建这个对象的更多实例时(boss2和boss3),每一个实例都有一份getSalary代码的单独拷贝;而与此相反,addSalary则指向了同一个地方(即addSalaryFunction)。
看看下面的代码来理解一下上面所描述的内容。
Example DT8
Language:javascript, parsed in: 0.039 seconds, using GeSHi 1.0.7.12
-
function Employee(name, salary)
-
{
-
? this.name=name;? ? ? ? ? ? ? ?
-
? this.salary=salary;
-
?
-
? this.addSalary=addSalaryFunction;
-
? this.getSalary=function()
-
? ? ? ? ? ? ? ? ?{
-
? ? ? ? ? ? ? ? ? ?return this.salary;
-
? ? ? ? ? ? ? ? ?};
-
}
-
function addSalaryFunction(addition)
-
{
-
? this.salary=this.salary+addition;
-
}
-
?
-
var boss1=new Employee("John", 200000);
-
var boss2=new Employee("Joan", 200000);
-
?
-
?
-
// 给getSalary函数对象添加属性
-
boss1.getSalary.owner="boss1";
-
boss2.getSalary.owner="boss2";
-
alert(boss1.getSalary.owner);? ?// 输出 "boss1"
-
alert(boss2.getSalary.owner);? ?// 输出 "boss2"
-
// 如果两个对象指向同一个函数对象,那么
-
// 上面两个输出都应该是“boss2”。
-
?
-
// 给addSalary函数对象添加属性
-
boss1.addSalary.owner="boss1";
-
boss1.addSalary.owner="boss2";
-
alert(boss1.addSalary.owner);? ?// 输出 "boss2"
-
alert(boss2.addSalary.owner);? ?// 输出 "boss2"
-
// 因为两个对象都指向同一个函数,(子乌注:原文写are not pointing to the same function,疑为笔误)
-
// 当修改其中一个的时候,会影响所有的实例(所以两个都输出“boss2”).
-
?
-
?
运行示例
也许不是重要的事情,但这里有一些关于运行类似上面的getSalary的内嵌函数的结论: 1) 需要更多的存储空间来存储对象(因为每一个对象实例都会有它自己的getSalary代码拷贝);2) javascript需要更多时间来构造这个对象。
让我们重新写这个示例来让它更有效率些。
Example DT9
Language:javascript, parsed in: 0.014 seconds, using GeSHi 1.0.7.12
-
function Employee(name, salary)
-
{
-
? this.name=name;? ? ? ? ? ? ? ?
-
? this.salary=salary;
-
?
-
? this.addSalary=addSalaryFunction;
-
? this.getSalary=getSalaryFunction;
-
}
-
function getSalaryFunction()
-
{
-
? return this.salary;
-
}
-
?
-
function addSalaryFunction(addition)
-
{
-
? this.salary=this.salary+addition;
-
}
-
?
看这儿,两个函数都指向同一个地方,这将会节约空间和缩短构造时间(特别是当你有一大堆内嵌函数在一个构造函数的时候)。这里有另外一个函数的功能能够来提升这个设计,它叫做prototype,而我们将在下一节讨论它。
函数:原型
每一个构造函数都有一个属性叫做原型(prototype,下面都不再翻译,使用其原文)。这个属性非常有用:为一个特定类声明通用的变量或者函数。
prototype的定义
你不需要显式地声明一个prototype属性,因为在每一个构造函数中都有它的存在。你可以看看下面的例子:
Example PT1
Language:javascript, parsed in: 0.003 seconds, using GeSHi 1.0.7.12
-
function Test()
-
{
-
}
-
alert(Test.prototype);? // 输出 "Object"
-
?
运行示例
给prototype添加属性
就如你在上面所看到的,prototype是一个对象,因此,你能够给它添加属性。你添加给prototype的属性将会成为使用这个构造函数创建的对象的通用属性。
例如,我下面有一个数据类型Fish,我想让所有的鱼都有这些属性:livesIn="water"和price=20;为了实现这个,我可以给构造函数Fish的prototype添加那些属性。
Example PT2
Language:javascript, parsed in: 0.007 seconds, using GeSHi 1.0.7.12
-
function Fish(name, color)
-
{
-
? this.name=name;
-
? this.color=color;
-
}
-
Fish.prototype.livesIn="water";
-
Fish.prototype.price=20;
-
?
接下来让我们作几条鱼:
Language:javascript, parsed in: 0.007 seconds, using GeSHi 1.0.7.12
-
var fish1=new Fish("mackarel", "gray");
-
var fish2=new Fish("goldfish", "orange");
-
var fish3=new Fish("salmon", "white");
-
?
再来看看鱼都有哪些属性:
Language:javascript, parsed in: 0.009 seconds, using GeSHi 1.0.7.12
-
for (var i=1; i<=3; i++)
-
{
-
? var fish=eval("fish"+i);? ?// 我只是取得指向这条鱼的指针
-
? alert(fish.name+","+fish.color+","+fish.livesIn+","+fish.price);
-
}
-
?
运行示例
输出应该是:
Language:text, parsed in: 0.001 seconds, using GeSHi 1.0.7.12
-
"mackarel, gray, water, 20"
-
"goldfish, orange, water, 20"
-
"salmon, white? water, 20"
-
?
你看到所有的鱼都有属性livesIn和price,我们甚至都没有为每一条不同的鱼特别声明这些属性。这时因为当一个对象被创建时,这个构造函数将会把它的属性prototype赋给新对象的内部属性__proto__。这个__proto__被这个对象用来查找它的属性。
用prototype给对象添加函数
你也可以通过prototype来给所有对象添加共用的函数。这有一个好处:你不需要每次在构造一个对象的时候创建并初始化这个函数。为了解释这一点,让我们重新来看Example DT9并使用prototype来重写它:
Example PT3
Language:javascript, parsed in: 0.013 seconds, using GeSHi 1.0.7.12
-
function Employee(name, salary)
-
{
-
? this.name=name;? ? ? ? ? ? ? ?
-
? this.salary=salary;
-
}
-
Employee.prototype.getSalary=function getSalaryFunction()
-
{
-
? return this.salary;
-
}
-
?
-
Employee.prototype.addSalary=function addSalaryFunction(addition)
-
{
-
? this.salary=this.salary+addition;
-
}
-
?
我们可以象通常那样创建对象:
Language:javascript, parsed in: 0.007 seconds, using GeSHi 1.0.7.12
-
var boss1=new Employee("Joan", 200000);
-
var boss2=new Employee("Kim", 100000);
-
var boss3=new Employee("Sam", 150000);
-
?
并验证它:
Language:javascript, parsed in: 0.006 seconds, using GeSHi 1.0.7.12
-
alert(boss1.getSalary());? ?// 输出 200000
-
alert(boss2.getSalary());? ?// 输出 100000
-
alert(boss3.getSalary());? ?// 输出 150000
-
?
运行示例
这里有一个图示来说明prototype是如何工作的。这个对象的每一个实例(boss1, boss2, boss3)都有一个内部属性叫做__proto__,这个属性指向了它的构造器(Employee)的属性prototype。当你执行getSalary或者addSalary的时候,这个对象会在它的__proto__找到并执行这个代码。注意这点:这里并没有代码的复制(和Example DT8的图表作一下对比)。
?
2006年11月20日
未注册版本只允许一个投票主题,
原理就是使用自写程序添加一个主题!
服务器支持ASP以及ado即可
破解下载(216KB)
破解补丁下载(4K)
2006年10月24日
在C#中,.NET为我们提供了一个System.Text.RegularExpression命名空间,包含了一些我们常用的操作和运用RegularExpression的对象,属性和方法。其中相当重要的有Regex,Match,Group,Capture等对象。
我们可以来看看这些对象之间有什么联系和区别,并学习在实际中运用它们。
|
类 |
说明 |
|
|
表示单个子表达式捕获中的结果。Capture表示单个成功捕获中的一个子字符串。 |
|
|
表示一个捕获子字符串序列。CaptureCollection返回由单个捕获组执行的捕获的集合。 |
|
|
Group表示单个捕获组的结果。由于存在数量词,一个捕获组可以在单个匹配中捕获零个、一个或更多的字符串,因此 Group 提供 Capture 对象的集合。 |
|
|
表示捕获组的集合。GroupCollection返回单个匹配中的捕获组的集合。 |
|
|
表示单个正则表达式匹配的结果。 |
|
|
表示通过以迭代方式将正则表达式模式应用于输入字符串所找到的成功匹配的集合。 |
|
|
表示不可变的正则表达式。 |
|
|
提供编译器用于将正则表达式编译为独立程序集的信息。 |
首先我们接触到的就是Regex对象,表示不可变的正则表达式。另外Regex类包含若干静态方法,使您无需显式创建 Regex 对象即可使用正则表达式。使用静态方法等效于构造 Regex 对象,使用该对象一次然后将其销毁。
例如:
我们可以通过Regex的构造函数创建对象:
Regex objRegex = new Regex();
或者通过静态方法直接运用:
string strTarget= "123abc456def789g";
string strRegex = @"\d+";
Console.WriteLine((System.Text.RegularExpressions.Regex.Matches(strTarget,strRegex)).Count);
以上就是直接通过静态方法的实例。
运用RegularExpression就不可能不涉及到匹配。Match表示单个正则表达式匹配的结果。这一点不用解释,以
string strTarget= "123abc456def789g";
string strRegex = @"\d+";
Console.WriteLine((System.Text.RegularExpressions.Regex.Matches(strTarget,strRegex)).Count);
为例,一个Match可能就是123。
由于单个匹配可能涉及多个捕获组,因此 Match 具有返回 GroupCollection 的 Groups 属性。GroupCollection具有返回每个组的访问器。Match从 Group 继承,因此可以直接访问匹配的整个子字符串。即 Match 实例本身等效于 Match.Groups[0](在 Visual Basic 中为 Match.Groups(0))。Match对象是不可变的,并且没有公共构造函数。
这里衍生出一个新的对象----Group,Group表示单个捕获组的结果。在C#的RegularExpression中用圆括号括起来表示一个捕获组。看例子:
string strTarget= "123abc456def789g";
string strRegex1 = @"\d+([a-z])+";
Console.WriteLine(Regex.Match(strTarget,strRegex,RegexOptions.IgnoreCase).Groups.Count);
这里用([a-z])来捕获单个英文字符。这就是一个捕获组。所以这里Groups的Count就是2个,Groups[0]等效于Match实例本身。Groups[1]为’C’。
由于存在数量词,一个捕获组可以在单个匹配中捕获零个、一个或更多的字符串,因此 Group 提供 Capture 对象的集合。
Capture,顾名思义,就是一次捕获,还是以上面的正则表达式例子:
Console.WriteLine(Regex.Match(strTarget,strRegex1,RegexOptions.IgnoreCase).Groups[1].Captures.Count);
通过输出我们可以看见有3个Capture,如果我们都打印出来会发现分别是a,b,c而Groups[1]保留了最后一次捕获。
至此,我们可以大概了解了。这些常用对象。
至于如何运用,还是要视具体情况,正则表达式主要用以处理文本,如果机会合适还是可以节约很多工作量的,推荐大家使用。
也欢迎大家就这方面继续深入和我讨论。