RSS 2.0 Feed
2004-06 Entries
摘要:下载VWD  今天安装了一下 VWD , 发现AspNet2.0Beta1有一个兼容性的Bug。这个问题主要是 <head id=”head1” runat=server> 在asp.net1.1之前是 HtmlGenericControl ,而在 Asp.Net2 中是 HtmlHead , 并且这个 HtmlHead 不是继承 HtmlGenericControl 的。 这就导致了这个文件不能编译过去: Parser Error Message: The base class includes the field 'htmlHead', but its type (System.Web.UI.HtmlControls.HtmlGenericControl) is not compatible with the type of control (System.Web.UI.HtmlControls.HtmlHead). 解决方法当然有,不过很麻烦。希望能从 AspNet2 上直接把这个问题解决掉。...[阅读全文]

posted @ | Feedback (6) | Filed Under [ DotNet AspNet ]

摘要:进入 http://blog.joycode.com/lostinet/gallery/885.aspx 浏览10张的界面的图...[阅读全文]

posted @ | Feedback (5) | Filed Under [ DotNet ]

摘要:今天要在 SPS 里做个东西.不过一直都是这个错误: System.TypeLoadException: 因为格式无效,未能从程序集 CuteChat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=da0fc3a24b6f18ba 中加载类型 CuteChat.ContextBoundModel.AspectObject。 at CuteChat.SPLib.ChatWebPart.WriteInternal(HtmlTextWriter output) at CuteChat.SPLib.ChatWebPart.RenderWebPart(HtmlTextWriter output) in l:\solutions\cutechat\extends\forsharepoint\cutechat.splib\chatwebpart.cs:line 45   呵呵。我实在是不知道为什么会出这个错误的。因为这个类在其他地方完全能正常使用。   当然,测试了一晚也不是说没有结果的。当我修改到web.config的的时候,情况变了。把WSS_Minimal改为Full并且重启动IIS就解决了。   不过这个错误提示和最后改权限的做法好象没有怎样对应啊。难道是低权限不能继承 ContextBoundObject ?..  ...[阅读全文]

posted @ | Feedback (4) | Filed Under [ 迷失中 DotNet ]

摘要:看了 关于中文输入的一点小建议 里面的回复。我就装了MSPY2003。 其实我很早就想换微软拼音。不过就是因为一直都有一个很大的问题。(这个问题也就是很多其他输入法的问题) 就是它想智能一点,往往会把它认为你常用的字自动排到前面去(非常没有规律),而且没有提供选项来禁止“这么智能”的动作。 而这样的结果是,一个拼音里有几个字都是很常用的,但是位置却经常换来换去。这真的很多手! 我的一个建议是,在 1 的前面放一个常用字选择。这个字是用空格来选的。这样的话,其他字的编号就不用变了。 还有一点就是按Shift来切换中英文的问题。Shift是很常用的键,被它这么一搞,我很经常搞错中英文输入。这也很麻烦。同样,没有办法设置这个多余的行为。   当然,各人有各人的习惯,为什么就不提供选项去改变它呢 ?...[阅读全文]

posted @ | Feedback (102) | Filed Under [ 迷失中 ]

摘要: 下面的东西显示了在复杂的情况下, 怎样最好地在一个Element的旁边显示某个DIV。 要测试它,请点 ClickMe 当然,你可以滚动窗口,使这个按纽靠窗口的 左/上/右/下 的情况,观察菜单的弹出方位。 全部代码: <table border=1 cellpadding=8 cellspacing=0> <tr><td>table1</td><td>table1</td></tr> <tr><td>table1</td><td> <div id=div1 style='position:absolute;background-color:wheat;padding:4px;'> div1 start <div id=div1button style='border:outset 2px;background-color:threedface;color:red;font-weight:bold;cursor:hand;padding:4px;'> ClickMe </div> div1 end </div> &nbsp;</td></tr> </table> <div style='height:100px'>-</div> <table border=1 cellpadding=8 cellspacing=0> <tr><td>table2</td><td>table2</td></tr> <tr><td>table2</td><td> <div id=div2 style='position:relative;left:24px;background-color:wheat;'> div2 start <div id=div2menu style='display:none;position:absolute;background-color:lightgrey;height:200px;width:120px;border:outset 1px;padding:4px'> div2menu<br> div2menu<br> div2menu<br> div2menu<br> div2menu<br> </div> div2 end </div> &nbsp;</td></tr> </table> <script language='jscript'> //get the position of a element ( by the scroll offset ) function LostinetWebGetScrollPostion(e) { var b=e.document.body; if(e==b)return {left:0,top:0}; with(e.getBoundingClientRect()) { return {left:b.scrollLeft+left,top:b.scrollTop+top}; } } //get the position of a element ( by the client offset ) function LostinetWebGetClientPosition(e) { var b=e.document.body; if(e==b)return {left:-b.scrollLeft,top:-b.scrollTop}; with(e.getBoundingClientRect()) { return {left:left-b.clientLeft,top:top-b.clientTop}; } } //get absolute or relative parent function LostinetWebGetStandParent(e) { for(var......[阅读全文]

posted @ | Feedback (13) | Filed Under [ Browser ]

摘要:记得我刚出来的时候,还没有学DotNet呢。 那时主要是用ASP和DHTML,语言是JScript 。 本来打算重操旧业-学C++的。 不过写惯了脚本,就十分讨厌C++里操作字符串那么麻烦。所以就做了这个东西。 // JString.cpp : Defines the entry point for the console application. // #include "stdafx.h" #ifndef _Lostinet_class_JString_ #define _Lostinet_class_JString_ #include <stdlib.h> #include <string.h> #include <stdio.h> class JString { protected: JString* pAllocator; JString* pNext; //只有链头才用pLast JString* pLast; char* pString; int length; JString(JString& pA,unsigned int initLen=0,const char* initStr="") { pAllocator=&pA; if(pA.pLast)pA.pLast->pNext=this; pA.pLast=this; pNext=pLast=0; length=initLen; pString=new char[initLen+1]; strcpy(pString,initStr); } public: JString(const char* str) { pAllocator=this; pNext=pLast=0; length=strlen(str); pString=new char[length+1]; strcpy(pString,str); } JString() { pAllocator=this; pNext=pLast=0; pString=new char[1]; pString[0]=0; length=0; } virtual ~JString() { delete pString; if(pNext)delete pNext; } char* Detach() { char* str=pString; pString=new char[1]; pString[0]=0; length=0; return str; } char* GetBuffer() { return pString; } char* GetBufferSetLength(int len) { //assert(len>=0); delete pString; length=len; pString=new char[len+1]; return pString; } /****************************************************************/ int GetLength() { return length; } int IndexOf(const char * str,int start=0) { if(start+1>length)return -1; char* pStart=pString+start; char* pos=strstr(pStart,str); if(pos==0)return -1; return pos-pString; } int LastIndexOf(const char * str) { int len=strlen(str); char *buf1=new char[length+1]; char *buf2=new char[len+1]; strcpy(buf1,pString); strcpy(buf2,str); strrev(buf1); strrev(buf2); char* pos=strstr(buf1,buf2); delete buf1; delete buf2; if(pos==0)return -1; return length+buf1-pos-len; } JString& Left(int len) { return Substr(0,len); } JString& Right(int len) { return Substr(length-len,len); } JString& Substr(int start,int len) { if(start<0)start=0; if(start+1>length) return * new JString(*pAllocator); if(len<=0) return * new JString(*pAllocator); if(start+len>length) len=length-start; char* buf=new char[len+1]; memcpy(buf,pString+start,len); buf[len]=0; JString* pStr=new JString(*pAllocator,len,buf); delete buf; return * pStr; } JString& Lower() { JString* pStr=new JString(*pAllocator); strcpy(pStr->GetBufferSetLength(length),pString); strlwr(pStr->GetBuffer()); return......[阅读全文]

posted @ | Feedback (10) | Filed Under [ 迷失中 ]

摘要:我使用Remoting也有很长的一段时间了。一直以来,我心中最痛的就是 DataRow不能序列化! 这使我无法这样地写 DataRow GetEmployee(int empid) , 而必须改为 DataTable GetEmployee(int empid) ; 自从发明了CBM后,这个也变成可能了。详细的代码如下: namespace Test.TestDataRowMarshalerAttribute { using System; using System.Collections; using System.Data; using System.Runtime.Remoting; using System.Runtime.Remoting.Messaging; using R=System.Runtime.Remoting; using Lostinet.ContextBoundModel; using Lostinet.ContextBoundModel.Messaging; #region public class DataRowMashalerAttribute : Attribute,IMessageHandlerAttribute /// <summary> /// Marshal the DataRow /// </summary> [AttributeUsage(AttributeTargets.Interface|AttributeTargets.Class|AttributeTargets.Method)] public class DataRowMashalerAttribute : Attribute,IMessageHandlerAttribute { public string HandlerName { get { return "DataRowMashaler"; } } public IMessageHandler CreateMessageHandler(bool bserver) { if(bserver) return new ServerHandler(); return new ClientHandler(); } [Serializable] class DataContainer { DataSet ds; DataRowState state; private DataContainer(DataRow row) { state=row.RowState; DataTable table=row.Table.Clone(); ds=new DataSet(); ds.Tables.Add(table); table.Rows.Add(row.ItemArray); ds.AcceptChanges(); } public object PopupValue() { DataTable table=ds.Tables[0]; ds.Tables.Clear(); DataRow row=table.Rows[0]; switch(state) { case DataRowState.Detached: DataRow newrow=table.NewRow(); newrow.ItemArray=row.ItemArray; table.Rows.Remove(row); return newrow; case DataRowState.Added: table.Rows.Remove(row); table.Rows.Add(row); break; case DataRowState.Modified: row.ItemArray=row.ItemArray; break; case DataRowState.Deleted: row.Delete(); break; } return row; } static public DataContainer Marshal(object arg) { if(arg is DataRow) { return new DataContainer((DataRow)arg); } return null; } } [Serializable] class MarshalInfo : ILogicalThreadAffinative { public DataContainer[] Args; public DataContainer Ret; } class ClientHandler:IMessageHandlerWithPriority { public string HandlerName { get { return "DataRowMashaler"; } } public MessageHandlerPriority HandlerPriority { get { return MessageHandlerPriority.FinalImplementation; } } public IMethodReturnMessage ProcessMessage(IMethodCallMessage mcm, AspectObjectProxy proxy, MessageHandlerQueue queue) { object[] args=(object[])mcm.Args; MarshalInfo requestdata=new MarshalInfo(); for(int i=0;i<args.Length;i++) { DataContainer data=DataContainer.Marshal(args[i]); if(data!=null) { if(requestdata.Args==null) requestdata.Args=new DataContainer[args.Length]; requestdata.Args[i]=data; args[i]=null; } } try { if(requestdata.Args!=null) { MethodCallWrapper......[阅读全文]

posted @ | Feedback (8) | Filed Under [ DotNet ]

摘要:通常,写一个WinForm的程序都会引用多个dll的。如果把这个WinForm发布出去,那么一个目录下就有很多个dll了。 如果希望只发布一个client.exe,那么应该怎样做呢? 做法很简单,就是把dll以资源的形式打包进 exe 里就好了。 然后问题就在于,你怎样才能在运行时加载这些dll。 一个可行的方法是,在程序运行的时候,一次过把这些dll都load出来,然后用AppDomain.Load来加载它。 但是这样有一个不好的地方,就是启动速度太慢。 AppDomain提供了一个事件,叫 AssemblyResolve ,这个事件是告诉你,DotNet找不到它想找的Assembly了。 通过关联这个事件,比较一下ResolveEventArgs.Name是否是你打包的那些东西,就能在需要的时候才加载dll了。 例子在这里下载 ResOfDll.zip 当然,如果你开发的是dll,并且引用别人的dll,也可以这样做。不过难点在于,你必须保证在需要使用其他dll的类之前,关联了AssemblyResolve这个事件。(这个可以在所有使用 其他dll的类 的类的静态构造方法中,执行一段代码来保证这个条件)...[阅读全文]

posted @ | Feedback (20) | Filed Under [ DotNet WinForm ]

摘要:一直都想找IOleClientSite等接口的定义。不过找光了机器上的tlb文件都不行。 后来竟然发现,System.Windows.Forms.dll 里就有了。 这是我把它们抽出来的结果,不过还没有经过任何测试! nativedeclare.cs.txt  使用这个的用途是实现OLE里某些接口,然后可以脱离IWebBrowser2来直接 HOST MSHTML 了。 (想一想,用这个可以用程序截取某某网站的截图!) 5555,实在太感谢 IAMROBOT 了。http://www.mvps.org/emorcillo/vb6/tlb/olelib.shtml 里的tlb倒入后完全可以正常使用:)...[阅读全文]

posted @ | Feedback (14) | Filed Under [ DotNet Browser WinForm ]

摘要:我想不少人都知道 ElementBehavior 是什么回事。通常,我们是用 *.HTC 的形式,用脚本来编写它的。 但实际上,我们可以用C++,VB,甚至是用DotNet来编写ElementBehavior。 这个请看 MSHTML.IElementBehavior 的 BUG 里的例子。 用 DotNet 来写有什么好与不呢? 优:配合DotNet的类库,功能强大,使用DotNet语言优点(强类型,编译验证。。)。缺:客户端必须装DotNet。待补充。。。 那么用 DotNet 来写 Behavior 有什么用途呢? 一:可以写个非常强大的基于HTML的编辑器。(我怀疑VS.NET设计ASP.NET的界面就是用这个的。。)二:结合 MSHTML 与 WebBrowser 生成美观实用的 WinForm 应用程序。 写Behavior能起复用的效果。(例如鼠标移动变色这种东西)待补充。。。 资源:MSDN - Binary Behavior...[阅读全文]

posted @ | Feedback (5) | Filed Under [ DotNet Browser ]

摘要:IHtmlElement2 提供一个方法 addBehavior , 使用这个方法,我们可以编写托管的Behavior (用C#,VB) 但是在实际的尝试中,却发现其中有BUG。使用addBehavior后抛出 ExecutionEngineException 。这个是一个超级的Exception。使DotNet强制关闭,无法拦截。 后来这个问题在 http://itwriting.com/phorum/read.php?f=3&i=288&t=288 里有了描述。 里面给的解决方案是重新定义 IElementBehavior 。 我整理了一个简单的例子出来,下载 WinHtml.zip  从例子中看到 WinHtml.IElementBehavior 与 mshtml.IElementBehavior 中有一个不同处 : Notify 方法的参数类型不同。 这个就是导致异常的原因。不过按MSHTML的文档来看,mshtml.IElementBehavior的定义应该是对的。难道这是DotNet的BUG?...[阅读全文]

posted @ | Feedback (6) | Filed Under [ DotNet Browser ]

摘要:shensr 在他的 在ActiveX Form中加载.Net Control 提到了通过用传统的Window的父子关系来把 WinForm.Net 的 Control 嵌进 VB 的方法。 这个方法不错。 看来我想的把控件嵌到Html里的想法有了着落了。  ...[阅读全文]

posted @ | Feedback (0) | Filed Under [ DotNet Browser WinForm ]

摘要:博客园那边的朋友对为类生成动态代理的技术比较感兴趣。 如果有兴趣的话,可以看看这个  http://rail.dei.uc.pt/...[阅读全文]

posted @ | Feedback (4) | Filed Under [ DotNet ]

摘要:我的PASSPORT是很早前注册的。当时可以用我自己的Email地址。 后来我想帮一个朋友注册一个时,发现只能支持 @hotmail.com 了。 今天想上去弄个新的邮箱,发现PASSPORT又支持自定义的邮件地址了。 不过有没有人知道,怎样申请一个 ???@msn.com 的邮箱?...[阅读全文]

posted @ | Feedback (42) | Filed Under [ 迷失中 ]

摘要:Control.Invoke 的作用是发送一条Windows消息到控件的线程上执行指定的Delegate。 如果委托出现异常,那么就直接把这个异常拦截掉,然后在调用Control.Invoke的线程上抛出。 我倒是希望有个选项把这个拦截去掉。如果出现错误,直接在控件的线程上抛出,然后显示错误。这多好啊。 否则的话,出现错误,根本就没有提示。也不好调试。  ...[阅读全文]

posted @ | Feedback (3) | Filed Under [ DotNet WinForm ]

摘要:只是偶而的发现。我在C#规范里好象没有见过这个的。还没有知道的可以了解一下:public object @object{   get   {      return this;   }}而使用它呢?object something=theclassobj.@object  ...[阅读全文]

posted @ | Feedback (4) | Filed Under [ DotNet ]

摘要:我用WinForm开发也有一段时间了。我觉得目前的WinForm开发速度是够的,但是一些原本在HTML就很容易做到的事情,在WinForm中就很难实现了。 这个主要的原因可能是WinForm复用控件的能力非常强,但是可用的控件却非常少。一般买回来的控件不但贵,而且也不是太好扩展。 作为一个学了多年HTML的人,我当然希望在WinForm中依然能使用HTML的特征,例如强大的CSS!,自动排版伸缩的特征,(CSS与排版可以更方便打印!),以及脚本的编写。(有时候写脚本比写WinForm的程序更爽。具体情况具体做)。 要做这个其实不难。但是要灵活运用则不容易了。 通常,使用WebBrowser控件的人,只是简单地使用MSHTML调用WebBrowser里的东西。也就是说,这个调用是单项的,只考虑到修改HTML来显示某种东西。 今天我写这个随笔的意图是告诉大家怎样把用户在WebBrowser里的操作反馈给WinForm 。 做这个反馈的基石是 DotNet 的 InteropServices 。通过把DotNet的某个对象,传到HTML DOM里去,然后用脚本来操作该DotNet对象。 要做到这个,核心是: 获取 WebBrowser.Document ,它实现了mshtml.IHtmlDocument /2/3/4/5 (其中IHtmlDocument2最有用) 这个Document是 System.Runtime.InteropServices.Expando.IExpando,通过它来设置和获取Document的一些动态命名的成员。 例子中的代码是:mshtml.IHTMLDocument2 doc2=(mshtml.IHTMLDocument2)browser.Document;System.Runtime.InteropServices.Expando.IExpando ex=(System.Runtime.InteropServices.Expando.IExpando)doc2;System.Reflection.PropertyInfo piform1=ex.AddProperty("Form1");piform1.SetValue(doc2,this,null);//从此,在HTML的document.Form1就是这个WinForm的Control了。你可以用脚本来调用Form1 ! 有了这些交互,我们可以实现的东西实在太多太多了。 我做了一个简单的例子,在这里下载 http://www.lostinet.com/files/WinHtml.zip 我下一步应该是研究一下,怎样直接把WinForm的Control动态地嵌进这个HTML里。(不是用 《 OBJECT 》来部署的形式)...[阅读全文]

posted @ | Feedback (73) | Filed Under [ DotNet Browser WinForm ]

摘要:Rane 是 Remote Asp.Net Execution 的简称。它的用途是简化编写客户端脚本与服务器进行交互的编码。 这个例子是一个通用的例子。它处理SQL SERVER上基于日期的表的数据录入。比起常规的WebForm,它不需要提交。每个数据的更新都是即时的。(想想,你做大量数据录入的时候,客户是否曾经抱怨它录入了大批数据,按“提交”时却报错重来的痛苦经历?)只要数据表是基于日期的简单表,就能立刻应用到你的工程里去。 例子的应用方法是: 首先下载?http://www.lostinet.com/files/Lostinet.Rane.rar,解压,建立RaneCS,RaneVB的虚拟目录。修改RaneCS/web.config 里的数据库连接字符串在Northwind里运行里面的 “天气状况.SQL”运行 http://localhost/RaneCS/Data/DataInput.Aspx(如果你要编译 Lostinet.Rane 这个工程的话,那么你需要把里面的强名称改掉) 原理说明: 例子中的天气状况的列为 “日期,省,市,天气,温度,湿度,备注”,其中“日期,省,市”为主键。 DataInput.Aspx 打开的时候,首先加载DataInput.xsd,获取哪些表(或视图)的哪些列可以进行操作。然后把日期列(第一列)作为特殊列,其他主键列(省,市)作为关键字列。再把这个信息转成表格输出到客户端。 DataInput.Aspx为每个其他的非主键列(数据列,温度,湿度,备注..)输出成INPUT,然后为它关联上事件。 当某个INPUT的Value被修改后,则调用脚本,把当前页的日期,当前行的关键字列的信息和该INPUT的Value传到服务器上执行 DataInputService.UpdateColumn 。如果INPUT的字变成蓝色,则表示数据更新完成了。 ? 当然,你可以立刻把这个东西,经过简单的修改后应用到你的应用程序中。这里要改的东西是: 编辑DataInput.xsd,使它的列和Sql Server上的表或视图对应起来。 如果表的第一列不是日期,那么可以做个视图来影射。对于更复杂的表(例如有外键关联到其他表,则用视图+触发器解决) 有什么问题可以在这帖回。...[阅读全文]

posted @ | Feedback (14) | Filed Under [ DotNet AspNet ]

摘要:TabControl 中的Page只会在切换到的时候才加载。 所以里面的控件一开始的时候是不会”Load”的。除非它是第一个Tab,或者你激活它。 我今天才发现这个特征,真难为我之前还手动写代码来延迟Tab中的控件的加载呢。555...[阅读全文]

posted @ | Feedback (5) | Filed Under [ DotNet WinForm ]

摘要:朋友要求到。帖一个实现 IHttpModule 的例子:/* CREATE TABLE [Logs] ( [dt] [datetime] NOT NULL CONSTRAINT [DF_Logs_dt] DEFAULT (getdate()), [SERVER_NAME] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL , [UserHostAddress] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL , [Path] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL , [QueryString] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL , [UserName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL , [Category] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL , [Message] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL , CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED ( [dt] ) ON [PRIMARY] ) ON [PRIMARY] GO CREATE TABLE [Exceptions] ( [dt] [datetime] NOT NULL CONSTRAINT [DF_Exceptions_dt] DEFAULT (getdate()), [SERVER_NAME] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL , [UserHostAddress] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL , [Path] [nvarchar] (500)......[阅读全文]

posted @ | Feedback (75) | Filed Under [ DotNet AspNet ]

摘要:这个在这里出现过。不过好象没有太正式的介绍。 NDOC-http://ndoc.sourceforge.net/ 是一个帮助你把 xx.dll 以及 xx.dll.xml 这两个文件 或者是从vs.net.sln中导入 来生成在线文档和 xx.chm 的工具。 基本的用法是在 vs.net 的工程属性里,编译那里选择文档输出为 xx.dll.xml ,然后编译。那么程序中的注释编译后就成 xx.dll.xml 了。 用 NDOC Add 这个 xx.dll 和 xx.dll.xml 然后修改下面的一些选项,就可以compile了。通常这个会编译到一个单独的 doc\ 中。里面有一打堆的 .html 和 .hhp 等一些文件 。 当然还有 xx.chm 文件(要先安装HTMLHELP)。 效果如下 http://www.contextboundmodel.net/doc/index.html 编译出来的chm如下 http://www.contextboundmodel.net/doc/cbm.chm...[阅读全文]

posted @ | Feedback (4) | Filed Under [ DotNet ]

摘要:刚才看了 Kaneboy 的 用Lostinet的ContextBoundModel来实现前置和后置条件检查 中的例子。 发现里面用到 ParameterInfo 时,定位它的位置是用 param.Position 。 这个我以前则没有留意到啊。所以我循环的时候不是foreach的,而是for(int i=0;i<ps.Length;i++)的(走弯路了。)。。 其实这个用于定位的属性在很多类都有,可是命名却不同。 例如: DataColumn.Ordinal , DataGridItem/DataListItem/Repeater.ItemIndex ,  ListViewItem/ColumnHeader/TreeNode/MenuItem.Index以及 ParameterInfo.Position 有了这些属性,循环时可以直接用foreach了。 很可惜的就是 DataRow 没有这个。所以每次都是for(int i=0;i<rows.Length;i++)...[阅读全文]

posted @ | Feedback (0) | Filed Under [ DotNet ]

摘要:之前做的Rane中,对中文我是用SharpEncode(我自己做的简单编码)来进行编码的。 可惜那个方法比较依赖RegEx,并且还很慢。 今天才记起JS中有escape,虽然编码后的字符串长了,不过速度应该是非常非常快的。 看来Rane对NN6.2/Mozilla的支持中的字符编码有了着落了。...[阅读全文]

posted @ | Feedback (2) | Filed Under [ Browser ]

摘要:今天晚上打算做个小站.里面有一些公共的链接.打算用FrontPage的模板来做.如果当前页就是模板中的链接的话,怎样突出那链接呢? 这个问题最后选择用CSS来解决 ,  模板为 <style>li.thelink{}li.theitem{ display:none; color:red; font-weight:bold;}</style> <ul> <li class="theitem homeitem">Home <li class="thelink homelink"><a href='default.htm'>Home</a> <li class="theitem downloaditem">Download <li class="thelink downloadlink"><a href='download.htm'>Download</a> <li class="theitem supportitem">Support <li class="thelink supportlink"><a href='support.htm'>Support</a></ul> default.htm的前面定义 <style>li.homeitem{ display:block!important;}li.homelink{ display:none;}</style> 来切换即可 . 当然.同样的原理,这样做也可以<body id="homepage"> <!-- BEGIN TEMPLATE --> <style> li.thelink { } li.theitem { display:none; color:red; font-weight:bold; } #homepage .homelink,#downloadpage .downloadlink,#supportpage .supportlink { display:none!important; } #homepage .homeitem,#downloadpage .downloaditem,#supportpage .supportitem { display:block!important; } </style> <ul> <li class="theitem homeitem">Home <li class="thelink homelink"><a href='default.htm'>Home</a> <li class="theitem downloaditem">Download <li class="thelink downloadlink"><a href='download.htm'>Download</a> <li class="theitem supportitem">Support <li class="thelink supportlink"><a href='support.htm'>Support</a> </ul> <!-- END TEMPLATE --> homepage editable content </div>...[阅读全文]

posted @ |