﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-龙行天下</title><link>http://www.blogjava.net/feingto/</link><description>&amp;nbsp;&amp;nbsp;政  博</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:01:02 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:01:02 GMT</pubDate><ttl>60</ttl><item><title>FckEditor中文配置手册详细说明</title><link>http://www.blogjava.net/feingto/archive/2008/01/09/173964.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 09 Jan 2008 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2008/01/09/173964.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/173964.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2008/01/09/173964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/173964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/173964.html</trackback:ping><description><![CDATA[javascript调用方式： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
&lt;script. type=&#8221;text/javascript&#8221; src=&#8221;FCKeditor/fckeditor.js&#8221;&gt;&lt;/scrīpt&gt; <br />
&lt;textarea name=&#8221;content&#8221; cols=&#8221;80&#8243; rows=&#8221;4&#8243;&gt; <br />
&lt;/textarea&gt; <br />
&lt;script. type=&#8221;text/javascript&#8221;&gt; <br />
var FCKeditor = new FCKeditor(&#8221;content&#8221;); <br />
oFCKeditor.BasePath = &#8220;FCKeditor/&#8221;; <br />
oFCKeditor.Height = 400; <br />
oFCKeditor.ToolbarSet = &#8220;Default&#8221;; <br />
oFCKeditor.ReplaceTextarea(); <br />
&lt;/script&gt; <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
如果想要使用从数据库读来的文本数据或者是后台来自文件的txt/html文本数据。 <br />
只要在 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
&lt;textarea name=&#8221;content&#8221; cols=&#8221;80&#8243; rows=&#8221;4&#8243;&gt; <br />
&lt;/textarea&gt; <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
中加入自己的显示内容的formbean对应字段即可 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
&lt;textarea name=&#8221;content&#8221; cols=&#8221;80&#8243; rows=&#8221;4&#8243;&gt; <br />
&lt;c:out value=&#8221;${contentData}&#8221; /&gt; <br />
&lt;/textarea&gt; <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
这样内容就会被显示在FCKeditor编辑框中了，点击提交按钮以后就可以在后台的相应java action中得到content参数中的内容就是页面上FCKeditor中的内容数据了。可以在struts/jsf中使用。 <br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br />
由于给FCKeditor瘦身，所以常会报缺少对象支持等错误，只要在FCKeditor/editor/lang中加上相应的js语言文件即可。如果加载页面失败（FCKeditor未定义）还有一个可能就是引用FCKeditor/fckeditor.js文件路径不对！ <br />
关于FCKeditor瘦身要点如下： <br />
1.将FCKeditor目录下及子目录下所有以&#8220;_&#8221;下划线开头的文件夹删除 <br />
2.FCKeditor根目录下只保留fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml，其余全部删除 <br />
3.将editor/filemanager/upload目录下文件及文件夹清空 <br />
4.将/editor/filemanager/browser/default/connectors/下的所有文件删除 <br />
5.还可以将editor/skins目录下的皮肤文件删除，只留下default一套皮肤（如果你不需要换皮肤的话） <br />
6.还可以将editor/lang目录下文件删除，只保留en.js, fcklanguagemanager.js, zh-cn.js, zh.js文件 <br />
7.如果你是使用javascrīpt来调用加载FCKeditor，那么就不需要在web.xml中配置fckeditor的tag文件。 <br />
8.还有一个问题刚开始使用FCKeditor的人常会遇到就怎么控制它的toolbar的大小和元素排列，其实很简单。 <br />
在fckconfig.js中用这样的标签[]来划分每行的元素的多少，这样就可以控制toolbar的长短和大小了，具体示例参看：fckconfig.js中的toolbarset[&#8221;Default&#8221;] <br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br />
用fckconfig.js中的一些选项来控制toolbarset中控件的功能，实现功能裁剪： <br />
1)：取消超链接中的浏览服务器和上传功能，方法如下： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
FCKConfig.LinkBrowser = true; <br />
FCKConfig.LinkUpload = true; <br />
改为： <br />
FCKConfig.LinkBrowser = false; <br />
FCKConfig.LinkUpload = false; <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
2)：取消图片链接中的浏览服务器和上传功能，方法如下： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
FCKConfig.ImageUpload = true; <br />
FCKConfig.ImageBrowser = true; <br />
改为： <br />
FCKConfig.ImageUpload = false; <br />
FCKConfig.ImageBrowser = false; <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
3)：Dlg Button中取消高级功能，方法如下： <br />
FCKConfig.LinkDlgHideAdvanced = false ; <br />
FCKConfig.ImageDlgHideAdvanced = false ; <br />
改为： <br />
FCKConfig.ImageDlgHideAdvanced = true ; <br />
FCKConfig.LinkDlgHideTarget = true ; <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
下一篇介绍FCKeditor的上传和浏览服务器功能，以及如何在里面实现动态 <br />
超连接，转发到servlet经过filter以后去调用服务器的action <br />
如何实现对应用户浏览自己的图片的列表实现！ <br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br />
FCKeditor集成java servlet可以实现文件的上传和服务器端列表读取功能FCKeditor自己提供了两个servlet来分别实现上传文件功能，和读取服务器端文件列表功能，这两个servlet分别为： <br />
com.fredck.FCKeditor.connector.ConnectorServlet（读取文件列表） <br />
com.fredck.FCKeditor.uploader.SimpleUploaderServlet（实现文件上传） <br />
1.浏览服务器端文件列表 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
web.xml文件中，比如：ConnectorServlet中的配置选项： <br />
&lt;init-param&gt; <br />
&lt;param-name&gt;baseDir&lt;/param-name&gt; <br />
&lt;param-value&gt;/UserFiles/&lt;/param-value&gt; <br />
&lt;/init-param&gt; <br />
意思是在浏览服务器上的baseDir配置指定里面的所有文件及其目录结构列表。 <br />
如果你的baseDir没有配置，Connector将会自动创建一个默认的文件夹 <br />
UserFiles，对应的ConnectorServlet中init()方法中代码如下： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
baseDir = getInitParameter(&#8221;baseDir&#8221;); <br />
if (baseDir == null) <br />
baseDir = &#8220;/UserFiles/&#8221;; <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
还想说一下的是，FCKeditor的client调用server的servlet方法采用的是Ajax思想来实现。当你点击浏览服务器(browser server)的时候就会触发一个异步的javascrīpt + xmlhttp的调用响应，后台的servlet会去完成你要请求的事件，然后数据以xml方式返回给client来解析。很明显，你要实现去数据库或者其他的文件系统请求列表，你只要修改 <br />
ConnectorServlet中两个私有方法：getFolders 和 getFiles <br />
让它去你指定的地方得到文件列表即可，这样你的文件可以放在任何你指定目录下。多说一句，很多人都想知道个人blog系统中怎么实现上传文件以后对应用户浏览自己的列表的，我的做法很简单，建立你用户名的文件夹，你上传只能上传到你的目录夹，浏览可以通过程序指定浏览对应用户下的文件夹即可，这个时候你要修改Connectorservlet中的路径即可！ <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
2.超连接重定位问题 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
FCKeditor可以插入超连接，实现对文件的预览功能，只要我们稍微改变我们可以使FCKeditor编辑器支持对任意文件系统下的任意文件的客户端浏览和下载保存！FCKeditor本来提供的是相对URL超链接，只要我们修改ConnectorServlet中传递给客户端的地址的时候，把它改写成绝对URL然后再通过我们自己的filter的servlet实现重定向去一个下载/浏览文件的struts的action方法就可以实现在客户端对超连接文件的下载和浏览！说一下具体做法吧： <br />
1)：修改ConnectorServlet传递给客户端javascrīpt的路径，代码如下： <br />
String currentUrl = &#8220;http://&#8221; + request.getserver +request.getServerPort + request.getContextPath + resourcePath; <br />
以上代码请在ConnectorServlet的doGet()里面拼装！在调用CreateCommonXml()私有方法的时候参数传入： <br />
myEl.setAttribute(&#8221;path&#8221;,currentPath); <br />
myEl.setAttribute(&#8221;url&#8221;,currentUrl); <br />
提醒一下resourcePath为在web.xml配置文件中ConnectorServlet中的一个初始化参数配置，等一下利用filter实现对超连接的重定位就提取URL中的这个配置参数来判断，配置如下： <br />
&lt;init-param&gt; <br />
&lt;param-name&gt;resourcePath&lt;/param-name&gt; <br />
&lt;param-value&gt;/fileSystem/&lt;/param-value&gt; <br />
&lt;/init-param&gt; <br />
2)：建立你的filter servlet，实现对URL的截获，对符合要求的URL进行重定位到你的对应action中去即可 <br />
3)：实现你的对应action来实现文件的上传和下载功能即可！ <br />
4)：扩展功能－实现对URL的加密，对连接的URL中加上一串字符，最后几位作为算法校验，对不符合要求的URL连接,filter将会拒绝重定位到指定action。此外利用自己写的扩展类还可以实现对超连接的文件类型进行限制，比如你只能超连接JPG|GIF|DOC|TXT|HTML等几种后缀名的文件，对其他文件即使你指定超连接也让你浏览和下载，这些都可以在web.xml中通过修改对应servlet的配置文件的初始化参数实现。 <br />
3.页面javascrīpt修改 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
浏览服务器的功能对应的html/javascrīpt相关的文件为：browser.html和frmresourcelist.html对应你想传递的信息你可以append在文件名的字符串后面，在GetFileRowHtml（）的javascrīpt函数中实现对文件名的截取，这样client只会显示文件名，而你可以得到文件的数据库唯一标识，任何你想要的信息你都可以通过修改ConnectorServlet中的私有方法getFiles()来实现，只要修改页面frmresurcelist.html中的GetFileRowHtml（）中传入变量fileName即可。你还可以在点击选中文件的时候实现一个你自己的Ajax调用，一切取决你的项目需要！ <br />
4.我不是一个javascrīpt高手，其实如果我对javascrīpt了解多一些也许对客户端的代码修改以后做出更眩的功能。可以更好的完成对FCKeditor裁剪。 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
5.注意点 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
无论怎么修改别人的东西，请一定尊重开源精神！ <br />
很多人配置好了FCKeditor的上传功能以后常会遇到xmlhttp request 404 error,后面是一串路径，其实就是你的servlet-mapping中的路径不对，你只要把xmlhttp request errot 404 后面跟的路径，copy到你的web.xml中对应红色文字的位置，如下： <br />
&lt;servlet-mapping&gt; <br />
&lt;servlet-name&gt;Connector&lt;/servlet-name&gt; <br />
&lt;url-pattern&gt;/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector&lt;/url-pattern&gt; <br />
&lt;/servlet-mapping&gt; <br />
别忘了SimpleUploader的servlet－mapping也要做同样的修改！ <br />
还有一个错误就是http 500错误，这个可能是你的URL请求不对，应该和FCKeditor没关系的! <br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br />
fckconfig.js总配置文件，可用记录本打开，修改后将文件存为utf-8 编码格式。找到： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
FCKConfig.TabSpaces = 0; <br />
改为： <br />
FCKConfig.TabSpaces = 1; <br />
即在编辑器域内可以使用Tab键。 <br />
如果你的编辑器还用在网站前台的话，比如说用于留言本或是日记回复时，那就不得不考虑安全了， <br />
在前台千万不要使用Default的toolbar，要么自定义一下功能，要么就用系统已经定义好的Basic， <br />
也就是基本的toolbar，找到： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
FCKConfig.ToolbarSets[&#8221;Basic&#8221;] = [ <br />
[&#8217;Bold&#8217;,'Italic&#8217;,'-&#8217;,'OrderedList&#8217;,'UnorderedList&#8217;,'-&#8217;,/*&#8217;Link&#8217;,*/&#8217;Unlink&#8217;,'-&#8217;,'Style&#8217;,'FontSize&#8217;,'TextColor&#8217;,'BGColor&#8217;,'-&#8217;, <br />
&#8216;Smiley&#8217;,'SpecialChar&#8217;,'Replace&#8217;,'Preview&#8217;] ]; <br />
这是改过的Basic，把图像功能去掉，把添加链接功能去掉，因为图像和链接和flash和图像按钮添加功能都能让前台页直接访问和上传文件， fckeditor还支持编辑域内的鼠标右键功能。 <br />
FCKConfig.ContextMenu = [&#8217;Generic&#8217;,/*&#8217;Link&#8217;,*/&#8217;Anchor&#8217;,/*&#8217;Image&#8217;,*/&#8217;Flash&#8217;,'Select&#8217;,'Textarea&#8217;,'Checkbox&#8217;,'Radio&#8217;,'TextField&#8217;,'HiddenField&#8217;, <br />
/*&#8217;ImageButton&#8217;,*/&#8217;Button&#8217;,'BulletedList&#8217;,'NumberedList&#8217;,'TableCell&#8217;,'Table&#8217;,'Form&#8217;]; <br />
这也是改过的把鼠标右键的&#8220;链接、图像，FLASH，图像按钮&#8221;功能都去掉。 <br />
找到： <br />
FCKConfig.FontNames = &#8216;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana&#8217;; <br />
加上几种我们常用的字体 <br />
FCKConfig.FontNames = &#8216;宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana&#8217;; <br />
添加文件 /TestFCKeditor/test.jsp: <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
&lt;%@ page language=&#8221;java&#8221; import=&#8221;com.fredck.FCKeditor.*&#8221; %&gt; <br />
&lt;%@ taglib uri=&#8221;/TestFCKeditor&#8221; prefix=&#8221;FCK&#8221; %&gt; <br />
&lt;script. type=&#8221;text/javascript&#8221; src=&#8221;/TestFCKeditor/FCKeditor/fckeditor.js&#8221;&gt;&lt;/script&gt; <br />
&lt;%&#8211; <br />
三种方法调用FCKeditor <br />
1.FCKeditor自定义标签 (必须加头文件 &lt;%@ taglib uri=&#8221;/TestFCKeditor&#8221; prefix=&#8221;FCK&#8221; %&gt; ) <br />
2.script脚本语言调用 (必须引用 脚本文件 &lt;script. type=&#8221;text/javascript&#8221; src=&#8221;/TestFCKeditor/FCKeditor/fckeditor.js&#8221;&gt;&lt;/script&gt; ) <br />
3.FCKeditor API 调用 (必须加头文件 &lt;%@ page language=&#8221;java&#8221; import=&#8221;com.fredck.FCKeditor.*&#8221; %&gt; ) <br />
&#8211;%&gt; <br />
&lt;%&#8211; <br />
&lt;form. action=&#8221;show.jsp&#8221; method=&#8221;post&#8221; target=&#8221;_blank&#8221;&gt; <br />
&lt;FCK:editor id=&#8221;content&#8221; basePath=&#8221;/TestFCKeditor/FCKeditor/&#8221; <br />
width=&#8221;700&#8243; height=&#8221;500&#8243; skinPath=&#8221;/TestFCKeditor/FCKeditor/editor/skins/silver/&#8221; <br />
toolbarSet = &#8220;Default&#8221;&gt; <br />
内容 <br />
&lt;/FCK:editor&gt; <br />
&lt;input type=&#8221;submit&#8221; value=&#8221;Submit&#8221;&gt; <br />
&lt;/form&gt; <br />
&#8211;%&gt; <br />
&lt;form. action=&#8221;show.jsp&#8221; method=&#8221;post&#8221; target=&#8221;_blank&#8221;&gt; <br />
&lt;table border=&#8221;0&#8243; width=&#8221;700&#8243;&gt; <br />
&lt;tr&gt; <br />
&lt;td&gt; <br />
&lt;textarea id=&#8221;content&#8221; name=&#8221;content&#8221; style=&#8221;WIDTH: 100%; HEIGHT: 400px&#8221;&gt;input&lt;/textarea&gt; <br />
&lt;script. type=&#8221;text/javascript&#8221;&gt; <br />
var FCKeditor = new FCKeditor(&#8217;content? ; <br />
oFCKeditor.BasePath = &#8220;/TestFCKeditor/FCKeditor/&#8221; ; <br />
oFCKeditor.Height = 400; <br />
oFCKeditor.ToolbarSet = &#8220;Default&#8221; ; <br />
oFCKeditor.ReplaceTextarea(); <br />
&lt;/script&gt; <br />
&lt;input type=&#8221;submit&#8221; value=&#8221;Submit&#8221;&gt; <br />
&lt;/td&gt; <br />
&lt;/tr&gt; <br />
&lt;/table&gt; <br />
&lt;/form&gt; <br />
&lt;%&#8211; <br />
&lt;form. action=&#8221;show.jsp&#8221; method=&#8221;post&#8221; target=&#8221;_blank&#8221;&gt; <br />
&lt;% <br />
FCKeditor oFCKeditor ; <br />
oFCKeditor = new FCKeditor( request, &#8220;content&#8221; ) ; <br />
oFCKeditor.setBasePath( &#8220;/TestFCKeditor/FCKeditor/&#8221; ) ; <br />
oFCKeditor.setValue( &#8220;input&#8221; ); <br />
out.println( oFCKeditor.create() ) ; <br />
%&gt; <br />
&lt;br&gt; <br />
&lt;input type=&#8221;submit&#8221; value=&#8221;Submit&#8221;&gt; <br />
&lt;/form&gt; <br />
&#8211;%&gt; <br />
添加文件/TestFCKeditor/show.jsp: <br />
&lt;% <br />
String content = request.getParameter(&#8221;content&#8221;); <br />
out.print(content); <br />
%&gt; <br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br />
1、适时打开编辑器 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
很多时候，我们在打开页面的时候不需要直接打开编辑器，而在用到的时候才打开，这样一来有很好的用户体验，另一方面可以消除FCK在加载时对页面打开速度的影响，点击&#8220;Open Editor&#8221;按钮后才打开编辑器界面。 <br />
实现原理： <br />
使用JAVASCRIPT版的FCK，在页面加载时（未打开FCK），创建一个隐藏的TextArea域，这个TextArea <br />
的name和ID要和创建的FCK实例名称一致，然后点击&#8221;Open Editor&#8221;按钮时，通过调用一段函数，使用 <br />
FCK的ReplaceTextarea()方法来创建FCKeditor，代码如下： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
&lt;script. type=&#8221;text/javascript&#8221;&gt; <br />
&lt;!&#8211; <br />
function showFCK(){ <br />
var FCKeditor = new FCKeditor( &#8216;fbContent&#8217; ) ; <br />
oFCKeditor.BasePath = &#8216;/FCKeditor/&#8217; ; <br />
oFCKeditor.ToolbarSet = &#8216;Basic&#8217; ; <br />
oFCKeditor.Width = &#8216;100%&#8217; ; <br />
oFCKeditor.Height = &#8216;200&#8242; ; <br />
oFCKeditor.ReplaceTextarea() ; <br />
} <br />
//&#8211;&gt; <br />
&lt;/script&gt; <br />
&lt;textarea name=&#8221;fbContent&#8221; id=&#8221;fbContent&#8221;&gt;&lt;/textarea&gt; <br />
2、使用FCKeditor 的 API <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
FCKeditor编辑器，提供了非常丰富的API，用于给End User实现很多想要定制的功能，比如最基本的数据验证，如何在提交的时候用JS判断当前编辑器区域内是否有内容，FCK的API提供了GetLength()方法； <br />
再比如如何通过脚本向FCK里插入内容，使用InsertHTML()等； <br />
还有，在用户定制功能时，中间步骤可能要执行FCK的一些内嵌操作，那就用ExecuteCommand()方法。 <br />
详细的API列表，请查看FCKeditor的Wiki。而常用的API，请查看FCK压缩包里的_samples/html/sample08.html。此处就不贴代码了。 <br />
3、外联编辑条（多个编辑域共用一个编辑条） <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
这个功能是2.3版本才开始提供的，以前版本的FCKeditor要在同一个页面里用多个编辑器的话，得一个个创建，现在有了这个外联功能，就不用那么麻烦了，只需要把工具条放在一个适当的位置，后面就可以无限制的创建编辑域了。 <br />
要实现这种功能呢，需要先在页面中定义一个工具条的容器：&lt;div id=&#8221;xToolbar&#8221;&gt;&lt;/div&gt;，然后再根据这个容器的id属性进行设置。 <br />
JAVASCRIPT实现代码： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
&lt;div id=&#8221;xToolbar&#8221;&gt;&lt;/div&gt; <br />
FCKeditor 1: <br />
&lt;script. type=&#8221;text/javascript&#8221;&gt; <br />
&lt;!&#8211; <br />
// Automatically calculates the editor base path based on the _samples directory. <br />
// This is usefull only for these samples. A real application should use something like this: <br />
// oFCKeditor.BasePath = &#8216;/fckeditor/&#8217;; // &#8216;/fckeditor/&#8217; is the default value. <br />
var sBasePath = document.location.pathname.substring(0,document.location.pathname.lastIndexOf(&#8217;_samples&#8217;)); <br />
var FCKeditor = new FCKeditor( &#8216;FCKeditor_1&#8242; ); <br />
oFCKeditor.BasePath = sBasePath; <br />
oFCKeditor.Height = 100; <br />
oFCKeditor.Config[ &#8216;ToolbarLocation&#8217; ] = &#8216;Out:parent(xToolbar)&#8217;; <br />
oFCKeditor.Value = &#8216;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using FCKeditor.&#8217;; <br />
oFCKeditor.Create(); <br />
//&#8211;&gt; <br />
&lt;/script&gt; <br />
&lt;br /&gt; <br />
FCKeditor 2: <br />
&lt;script. type=&#8221;text/javascript&#8221;&gt; <br />
&lt;!&#8211; <br />
FCKeditor = new FCKeditor( &#8216;FCKeditor_2&#8242; ); <br />
oFCKeditor.BasePath = sBasePath; <br />
oFCKeditor.Height = 100; <br />
oFCKeditor.Config[ &#8216;ToolbarLocation&#8217; ] = &#8216;Out:parent(xToolbar)&#8217;; <br />
oFCKeditor.Value = &#8216;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using FCKeditor.&#8217;; <br />
oFCKeditor.Create(); <br />
//&#8211;&gt; <br />
&lt;/script&gt; <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
此部分的详细DEMO请参照_samples/html/sample11.html，_samples/html/sample11_frame.html <br />
4、文件管理功能、文件上传的权限问题 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
一直以来FCKeditor的文件管理部分的安全是个值得注意，但很多人没注意到的地方，虽然FCKeditor在各个Release版本中一直存在的一个功能就是对上传文件类型进行过滤，但是她没考虑过另一个问题：到底允许谁能上传？到底谁能浏览服务器文件？ <br />
之前刚开始用FCKeditor时，我就出现过这个问题，还好NetRube（FCKeditor中文化以及FCKeditor ASP版上传程序的作者）及时提醒了我，做法是去修改FCK上传程序，在里面进行权限判断，并且再在fckconfig.js里把相应的一些功能去掉。但随之FCK版本的不断升级，每升一次都要去改一次配置程序fckconfig.js，我发觉厌烦了，就没什么办法能更好的控制这种配置么？事实上，是有的。 <br />
在fckconfig.js里面，有关于是否打开上传和浏览服务器的设置，在创建FCKeditor时，通过程序来判断是否创建有上传浏览功能的编辑器。首先，我先在fckconfig.js里面把所有的上传和浏览设置全设为false，接着我使用的代码如下： <br />
JAVASCRIPT版本： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
&lt;script. type=&#8221;text/javascript&#8221;&gt; <br />
var FCKeditor = new FCKeditor( &#8216;fbContent&#8217; ); <br />
&lt;% if power = powercode then %&gt; <br />
oFCKeditor.Config[&#8217;LinkBrowser&#8217;] = true; <br />
oFCKeditor.Config[&#8217;ImageBrowser&#8217;] = true; <br />
oFCKeditor.Config[&#8217;FlashBrowser&#8217;] = true; <br />
oFCKeditor.Config[&#8217;LinkUpload&#8217;] = true; <br />
oFCKeditor.Config[&#8217;ImageUpload&#8217;] = true; <br />
oFCKeditor.Config[&#8217;FlashUpload&#8217;] = true; <br />
&lt;% end if %&gt; <br />
oFCKeditor.ToolbarSet = &#8216;Basic&#8217;; <br />
oFCKeditor.Width = &#8216;100%&#8217;; <br />
oFCKeditor.Height = &#8216;200&#8242;; <br />
oFCKeditor.Value = &#8216;&#8217;; <br />
oFCKeditor.Create(); <br />
&lt;/script&gt; <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
在按钮旁边加文字 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
打开 editor/js/ 两个js文件 <br />
fckeditorcode_gecko.js <br />
fckeditorcode_ie.js <br />
第一个是支持非ie浏览器的 <br />
第二个文件是支持ie浏览器的 <br />
搜索 FCKToolbarButton，可以看到许多类似这样的语句： <br />
case &#8216;Save&#8217;:B = new FCKToolbarButton(&#8217;Save&#8217;, FCKLang.Save, null, null, true, null, 3); break; <br />
&#8216;Save&#8217;是按钮英文名字 <br />
FCKToolbarButton 的四个参数分别是： <br />
按钮命令名称，按钮标签文字，按钮工具提示，按钮样式，按钮是否在源代码模式可见，按钮下拉菜单其中将第4项参数设置为 FCK_TOOLBARITEM_ICONTEXT 即可使按钮旁边出现文字，注意没有引号。 <br />
例如： <br />
case &#8216;Preview&#8217;:B = new FCKToolbarButton(&#8217;Preview&#8217;, FCKLang.Preview, null, FCK_TOOLBARITEM_ICONTEXT, true, null, 5); <br />
这样我们就可以将 我们经常用的3种模式源代码、预览、全屏编辑按钮都加上文字了。 <br />
解释fck样式的工作原理 <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
fck的样式设置涉及到了两个文件，一个是你定义好的样式表文件.css，另一个是告诉fck样式表如何使用的xml文件，两个文件确一不可。 <br />
css文件的位置是不做要求的，但是需要你在应用的编辑器的页面上插入样式表文件的链接。这样才能显示出来样式。 <br />
fckstyles.xml 在与editor目录同级的目录下。该文件定义了那些样式可以使用在那些标签里面。 <br />
这就是fck自带的样式xml定义： <br />
&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243; ?&gt; <br />
&lt;Styles&gt; <br />
&lt;Style name=&#8221;Image on Left&#8221; element=&#8221;img&#8221;&gt; <br />
&lt;Attribute name=&#8221;style&#8221; value=&#8221;padding: 5px; margin-right: 5px&#8221; /&gt; <br />
&lt;Attribute name=&#8221;border&#8221; value=&#8221;2&#8243; /&gt; <br />
&lt;Attribute name=&#8221;align&#8221; value=&#8221;left&#8221; /&gt; <br />
&lt;/Style&gt; <br />
&lt;Style name=&#8221;Image on Right&#8221; element=&#8221;img&#8221;&gt; <br />
&lt;Attribute name=&#8221;style&#8221; value=&#8221;padding: 5px; margin-left: 5px&#8221; /&gt; <br />
&lt;Attribute name=&#8221;border&#8221; value=&#8221;2&#8243; /&gt; <br />
&lt;Attribute name=&#8221;align&#8221; value=&#8221;right&#8221; /&gt; <br />
&lt;/Style&gt; <br />
&lt;Style name=&#8221;Custom Bold&#8221; element=&#8221;span&#8221;&gt; <br />
&lt;Attribute name=&#8221;style&#8221; value=&#8221;font-weight: bold;&#8221; /&gt; <br />
&lt;/Style&gt; <br />
&lt;Style name=&#8221;Custom Italic&#8221; element=&#8221;em&#8221; /&gt; <br />
&lt;Style name=&#8221;Title&#8221; element=&#8221;span&#8221;&gt; <br />
&lt;Attribute name=&#8221;class&#8221; value=&#8221;Title&#8221; /&gt; <br />
&lt;/Style&gt; <br />
&lt;Style name=&#8221;Code&#8221; element=&#8221;span&#8221;&gt; <br />
&lt;Attribute name=&#8221;class&#8221; value=&#8221;Code&#8221; /&gt; <br />
&lt;/Style&gt; <br />
&lt;Style name=&#8221;Title H3&#8243; element=&#8221;h3&#8243; /&gt; <br />
&lt;Style name=&#8221;Custom Ruler&#8221; element=&#8221;hr&#8221;&gt; <br />
&lt;Attribute name=&#8221;size&#8221; value=&#8221;1&#8243; /&gt; <br />
&lt;Attribute name=&#8221;color&#8221; value=&#8221;#ff0000&#8243; /&gt; <br />
&lt;/Style&gt; <br />
&lt;/Styles&gt; <br />
每一个&lt;style&gt;将来会生成一个样式的菜单项。name名称就是显示在菜单里的文字；element定义了该样式可以应用在那种html标签上，&lt;Attribute&gt;的 name 指定了将会修改标签的哪个属性来应用样式，value则是修改成的值。 <br />
看这个： <br />
&lt;Style name=&#8221;Title&#8221; element=&#8221;span&#8221;&gt; <br />
&lt;Attribute name=&#8221;class&#8221; value=&#8221;Title&#8221; /&gt; <br />
&lt;/Style&gt; <br />
如果你在fck选定了文字 &#8220;经典论坛 》 前台制作与脚本专栏 》 FCKeditor 实战技巧 - 1 》 编辑帖子&#8221; 应用该样式 则原来文字就会变成&lt;span class=&#8221;Title&#8221;&gt;经典论坛 》 前台制作与脚本专栏 》 FCKeditor 实战技巧 - 1 》 编辑帖子&lt;/span&gt; <br />
注意：如果编辑器呈整页编辑状态，那么整页里面也需要插入样式表链接才能显示出来样式。 <br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br />
FCKeditor JavaScript. API（翻译整理） <br />
原文地址：<a href="http://wiki.fckeditor.net/Developer%27s_Guide/%20_API" target="_new"><font color="#1d58d1">http://wiki.fckeditor.net/Developer%27s_Guide/Javascript_API</font></a> <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
FCK 编辑器加载后，将会注册一个全局的 FCKeditorAPI 对象。 <br />
FCKeditorAPI 对象在页面加载期间是无效的，直到页面加载完成。如果需要交互式地知道 FCK 编辑器已经加载完成，可使用&#8220;FCKeditor_OnComplete&#8221;函数。 <br />
&lt;script. type=&#8221;text/javascript&#8221;&gt; <br />
function FCKeditor_OnComplete(editorInstance) { <br />
FCKeditorAPI.GetInstance(&#8217;FCKeditor1&#8242;).Commands.GetCommand(&#8217;FitWindow&#8217;).Execute(); <br />
} <br />
&lt;/script&gt; <br />
在当前页获得 FCK 编辑器实例： <br />
var Editor = FCKeditorAPI.GetInstance(&#8217;InstanceName&#8217;); <br />
从 FCK 编辑器的弹出窗口中获得 FCK 编辑器实例： <br />
var Editor = window.parent.InnerDialogLoaded().FCK; <br />
从框架页面的子框架中获得其它子框架的 FCK 编辑器实例： <br />
var Editor = window.FrameName.FCKeditorAPI.GetInstance(&#8217;InstanceName&#8217;); <br />
从页面弹出窗口中获得父窗口的 FCK 编辑器实例： <br />
var Editor = opener.FCKeditorAPI.GetInstance(&#8217;InstanceName&#8217;); <br />
获得 FCK 编辑器的内容： <br />
oEditor.GetXHTML(formatted); // formatted 为：true|false，表示是否按HTML格式取出 <br />
也可用： <br />
oEditor.GetXHTML(); <br />
设置 FCK 编辑器的内容： <br />
oEditor.SetHTML(&#8221;content&#8221;, false); // 第二个参数为：true|false，是否以所见即所得方式设置其内容。此方法常用于&#8220;设置初始值&#8221;或&#8220;表单重置&#8221;操作。 <br />
插入内容到 FCK 编辑器： <br />
oEditor.InsertHtml(&#8221;html&#8221;); // &#8220;html&#8221;为HTML文本 <br />
检查 FCK 编辑器内容是否发生变化： <br />
oEditor.IsDirty(); <br />
在 FCK 编辑器之外调用 FCK 编辑器工具条命令： <br />
命令列表如下： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
DocProps, Templates, Link, Unlink, Anchor, BulletedList, NumberedList, About, Find, Replace, Image, Flash, SpecialChar, Smiley, Table, TableProp, TableCellProp, UniversalKey, Style, FontName, FontSize, FontFormat, Source, Preview, Save, NewPage, PageBreak, TextColor, BGColor, PasteText, PasteWord, TableInsertRow, TableDeleteRows, TableInsertColumn, TableDeleteColumns, TableInsertCell, TableDeleteCells, TableMergeCells, TableSplitCell, TableDelete, Form, Checkbox, Radio, TextField, Textarea, HiddenField, Button, Select, ImageButton, SpellCheck, FitWindow, Undo, Redo <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
使用方法如下： <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br />
oEditor.Commands.GetCommand(&#8217;FitWindow&#8217;).Execute(); <br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
<img src ="http://www.blogjava.net/feingto/aggbug/173964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2008-01-09 12:52 <a href="http://www.blogjava.net/feingto/archive/2008/01/09/173964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FCKEditor的赋值和取值操作 </title><link>http://www.blogjava.net/feingto/archive/2008/01/09/173963.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Wed, 09 Jan 2008 04:51:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2008/01/09/173963.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/173963.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2008/01/09/173963.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/173963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/173963.html</trackback:ping><description><![CDATA[<p _fckxhtmljob="3">1、获取编辑器中HTML内容</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" _fckxhtmljob="3"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" _fckxhtmljob="3"  alt="" /><span style="color: #0000ff" _fckxhtmljob="3">function</span><span style="color: #000000" _fckxhtmljob="3">&nbsp;getEditorHTMLContents(EditorName)<br _fckxhtmljob="3" />
<img id="Codehighlighter1_43_134_Open_Image" onclick="this.style.display='none'; Codehighlighter1_43_134_Open_Text.style.display='none'; Codehighlighter1_43_134_Closed_Image.style.display='inline'; Codehighlighter1_43_134_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" _fckxhtmljob="3"  alt="" /><img id="Codehighlighter1_43_134_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_43_134_Closed_Text.style.display='none'; Codehighlighter1_43_134_Open_Image.style.display='inline'; Codehighlighter1_43_134_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" _fckxhtmljob="3"  alt="" /></span><span id="Codehighlighter1_43_134_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff" _fckxhtmljob="3"><img src="http://www.cnblogs.com/Images/dot.gif" _fckxhtmljob="3"  alt="" /></span><span id="Codehighlighter1_43_134_Open_Text" _fckxhtmljob="3"><span style="color: #000000" _fckxhtmljob="3">{&nbsp;<br _fckxhtmljob="3" />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" _fckxhtmljob="3"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" _fckxhtmljob="3">var</span><span style="color: #000000" _fckxhtmljob="3">&nbsp;oEditor&nbsp;</span><span style="color: #000000" _fckxhtmljob="3">=</span><span style="color: #000000" _fckxhtmljob="3">&nbsp;FCKeditorAPI.GetInstance(EditorName);&nbsp;<br _fckxhtmljob="3" />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" _fckxhtmljob="3"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" _fckxhtmljob="3">return</span><span style="color: #000000" _fckxhtmljob="3">(oEditor.GetXHTML(</span><span style="color: #0000ff" _fckxhtmljob="3">true</span><span style="color: #000000" _fckxhtmljob="3">));&nbsp;<br _fckxhtmljob="3" />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" _fckxhtmljob="3"  alt="" />}</span></span></div>
<p _fckxhtmljob="3"><br _fckxhtmljob="3" />
2、获取编辑器中文字内容（在博客发布时获取无html代码摘要使用）</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" _fckxhtmljob="3"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" _fckxhtmljob="3"  alt="" /><span style="color: #0000ff" _fckxhtmljob="3">function</span><span style="color: #000000" _fckxhtmljob="3">&nbsp;getEditorTextContents(EditorName)<br _fckxhtmljob="3" />
<img id="Codehighlighter1_43_149_Open_Image" onclick="this.style.display='none'; Codehighlighter1_43_149_Open_Text.style.display='none'; Codehighlighter1_43_149_Closed_Image.style.display='inline'; Codehighlighter1_43_149_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" _fckxhtmljob="3"  alt="" /><img id="Codehighlighter1_43_149_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_43_149_Closed_Text.style.display='none'; Codehighlighter1_43_149_Open_Image.style.display='inline'; Codehighlighter1_43_149_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" _fckxhtmljob="3"  alt="" /></span><span id="Codehighlighter1_43_149_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff" _fckxhtmljob="3"><img src="http://www.cnblogs.com/Images/dot.gif" _fckxhtmljob="3"  alt="" /></span><span id="Codehighlighter1_43_149_Open_Text" _fckxhtmljob="3"><span style="color: #000000" _fckxhtmljob="3">{&nbsp;<br _fckxhtmljob="3" />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" _fckxhtmljob="3"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" _fckxhtmljob="3">var</span><span style="color: #000000" _fckxhtmljob="3">&nbsp;oEditor&nbsp;</span><span style="color: #000000" _fckxhtmljob="3">=</span><span style="color: #000000" _fckxhtmljob="3">&nbsp;FCKeditorAPI.GetInstance(EditorName);&nbsp;<br _fckxhtmljob="3" />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" _fckxhtmljob="3"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" _fckxhtmljob="3">return</span><span style="color: #000000" _fckxhtmljob="3">(oEditor.EditorDocument.body.innerText);&nbsp;<br _fckxhtmljob="3" />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" _fckxhtmljob="3"  alt="" />}</span></span></div>
<p _fckxhtmljob="3"><br _fckxhtmljob="3" />
3、设置编辑器中内容</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" _fckxhtmljob="3"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" _fckxhtmljob="3"  alt="" /><span style="color: #0000ff" _fckxhtmljob="3">function</span><span style="color: #000000" _fckxhtmljob="3">&nbsp;SetEditorContents(EditorName,&nbsp;ContentStr)<br _fckxhtmljob="3" />
<img id="Codehighlighter1_51_141_Open_Image" onclick="this.style.display='none'; Codehighlighter1_51_141_Open_Text.style.display='none'; Codehighlighter1_51_141_Closed_Image.style.display='inline'; Codehighlighter1_51_141_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" _fckxhtmljob="3"  alt="" /><img id="Codehighlighter1_51_141_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_51_141_Closed_Text.style.display='none'; Codehighlighter1_51_141_Open_Image.style.display='inline'; Codehighlighter1_51_141_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" _fckxhtmljob="3"  alt="" /></span><span id="Codehighlighter1_51_141_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff" _fckxhtmljob="3"><img src="http://www.cnblogs.com/Images/dot.gif" _fckxhtmljob="3"  alt="" /></span><span id="Codehighlighter1_51_141_Open_Text" _fckxhtmljob="3"><span style="color: #000000" _fckxhtmljob="3">{&nbsp;<br _fckxhtmljob="3" />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" _fckxhtmljob="3"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" _fckxhtmljob="3">var</span><span style="color: #000000" _fckxhtmljob="3">&nbsp;oEditor&nbsp;</span><span style="color: #000000" _fckxhtmljob="3">=</span><span style="color: #000000" _fckxhtmljob="3">&nbsp;FCKeditorAPI.GetInstance(EditorName)&nbsp;;&nbsp;<br _fckxhtmljob="3" />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" _fckxhtmljob="3"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;oEditor.SetHTML(ContentStr)&nbsp;;&nbsp;<br _fckxhtmljob="3" />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" _fckxhtmljob="3"  alt="" />}</span></span><span style="color: #000000" _fckxhtmljob="3"><br _fckxhtmljob="3" />
</span></div>
<img src ="http://www.blogjava.net/feingto/aggbug/173963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2008-01-09 12:51 <a href="http://www.blogjava.net/feingto/archive/2008/01/09/173963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Script.aculo.us开发系列(八):使用DropDrag定义拖拽行为</title><link>http://www.blogjava.net/feingto/archive/2008/01/05/172962.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Sat, 05 Jan 2008 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2008/01/05/172962.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/172962.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2008/01/05/172962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/172962.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/172962.html</trackback:ping><description><![CDATA[&nbsp;
<div class="postbody">
<p>在不同的浏览器上默认的拖拽能解决的问题相当少,所以有很多的框架都能实现这么个功能.使用拖拽行为能很好的改善用户体验,尤其是在购物的时候能让用户感到很新奇和体面.Script.aculo.us使用了三个类实现拖拽和排序,它们是Draggable,Droppable,Sortable.要实现一个完整的拖拽行为,需要Draggable,和Droppable的配合使用,由于这连个类的方法比较多,我只选取比较实用的几个方法进行介绍.还是老规矩,先看看Demo:<a href="http://www1.qcxy.hb.cn/qphy/Script_Aculo_Us/DragDrop.html">http://www1.qcxy.hb.cn/qphy/Script_Aculo_Us/DragDrop.html</a></p>
<h2>Draggable</h2>
<p>new Draggable("DraggableId"[,options])</p>
<p>主要选项</p>
<ul>
    <li>snap:推拽的最小单位,默认为false,可以是数组或者函数,将这个属性设置为[50,50],意味着最小的位移单位是50px,50px,如果设置为一个函数,这个函数的参数为(x,y),这个x,y指示当前的绝对坐标,函数应该返回二维数组,上面的例子中的Drag(UnAcceptable)推拽到页面的左上角是就会"吸附"上去,就是因为函数的作用,详细见源码
    <li>revert:推拽完毕之后是否回到原来的位置,默认为false,也可以是一个函数,这个函数必须返回true/false
    <li>handle:"提手",移动整个块的时候通常不需要在整个块的区域都可以拖拽,比如移动一个栏目,通常只需要拖拽标题(比如Google的个性化主页),将该属性设置为标题的Id
    <li>ghosting:推拽的过程中是否显示"影子",默认为false
    <li>constraint:限制能拖动的方向,默认的两个方向都可以,可以设置为"vertical","horizontal"的任意
    <li>zindex:"影子"的z-Index属性
    <li>scroll:拖拽出视图范围是否显示自动滚动
    <li>scrollSensitivity/scrollSpeed:默认值分为为20/15,控制滚动的敏感度和滚动速度
    <li>delay:拖拽前的延时,开始拖拽后经过这个时间才"回过神来"</li>
</ul>
<p>这里需要说明的是并非所有的标签都支持该行为,详细的情况请参阅官方文档</p>
<p>API</p>
<ul>
    <li>onStart:开始拖拽调用该函数,接受两个参数(obj,oEvent)前者是$(DraggableId),后者是当前事件的event对象
    <li>onDrag:在拖拽过程中反复的调用该函数,同样接受两个参数(obj,oEvent)
    <li>change:在onDrag后调用,也会反复调用
    <li>onEnd:拖拽行为结束调用,即鼠标弹起时激发
    <li>destroy():该方法销毁元素的拖拽行为</li>
</ul>
<h2>Droppables</h2>
<p>Droppables(注意是复数形式)是一个抽象类,不能被实例化,只有一些静态方法,常用的方法有add和move,分别增加可放置元素,和去除可放置元素</p>
<p>add方法:Dropables.add("ContainerId"[,options]),常用的选项</p>
<ul>
    <li>accept: 数组或者字符串,表示该容器接受的元素的className的集合,默认的任何元素都接收
    <li>hoverclass:当符合接受要求的元素拖至容器上时,其className
    <li>onDrop():被拖拽的符合要求的元素在这里放置时调用该函数,接受三个参数(draggable,droppable,oEvent),draggable是被拖拽元素,droppable是被放置元素,oEvent当前事件对象</li>
</ul>
<p>remove("ContainerId"),该方法去除容器的放置行为</p>
<p>(上面例子的源代码)</p>
<h2>Sortable</h2>
<p>Sortable是一组可以通过拖拽交换位置的元素,可以先看看实例(<a href="http://www1.qcxy.hb.cn/qphy/Script_Aculo_Us/Sortables.html">http://www1.qcxy.hb.cn/qphy/Script_Aculo_Us/Sortables.html</a>),同样不能被实例化,常用方法create(),serialize(),destroy().下面是create("ContainerId"[,options])的常用选项</p>
<ul>
    <li>ghosting:拖动时是否显示"影子",默认为false
    <li>constraint:允许的拖动方向,默认为两个方向都可以,值为"horizontal","vertical"中的任一
    <li>tag:能被拖动元素的标签,默认为"li"
    <li>hoverclass:拖动经过可以放置的位置是,可放置的元素的className
    <li>dropOnEmpty:默认为false,是否在空的元素上放置
    <li>handle/delayscroll/scrollSensitivity/scrollSpeed::同Draggable
    <li>containment:数组,存放所有的放置元素的ID,参见实例的最后一个例子
    <li>onUpdate():该方法接受参数$("ContainerId"),在拖动到可放置位置是调用该方法
    <li>onChange():结束拖拽行为时调用该方法,接受参数element,表示被拖拽的元素</li>
</ul>
<p>serialize(sortable)方法:该方法返回当前容器内元素的次序,但是要求子元素的id必须以"item_"开头,且返回格式有讲究,看下面的例子</p>
<p>&lt;div id="horizontalSortable" class="item" style="margin-top:20px; height:40px;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="item_5"&gt;IE&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="item_6"&gt;FireFox&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="item_7"&gt;Safari&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="item_8"&gt;Opera&lt;/div&gt;<br />
&lt;/div&gt;</p>
<p>Sortable.create("horizontalSortable",<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; ghosting:true,<br />
&nbsp;&nbsp;&nbsp;&nbsp; tag:'div',<br />
&nbsp;&nbsp;&nbsp;&nbsp; constraint:'horizontal',<br />
&nbsp;&nbsp;&nbsp;&nbsp; hoverclass:'hoverClass2'<br />
});</p>
<p>Sortable.serialize('horizontalSortable')<br />
//--&gt;horizontalSortable[]=5&amp;horizontalSortable[]=6&amp;horizontalSortable[]=7&amp;horizontalSortable[]=8</p>
<p>最后看一个例子,前面提到的containment选项在某些情况下很有用,比如要实现两个容器里的元素可以互相交换子元素,即从一个容器拖至令一个容器中.来看下面的例子</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;</span><span style="color: #000000">script&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">text/javascript</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;Sortable.create('sortUlLeft',{containment:['sortUlLeft','sortUlRight'],&nbsp;dropOnEmpty:</span><span style="color: #0000ff">true</span><span style="color: #000000">,ghosting:</span><span style="color: #0000ff">true</span><span style="color: #000000">,constraint:</span><span style="color: #0000ff">false</span><span style="color: #000000">,hoverclass:'hoverClass'});<br />
&nbsp;&nbsp;Sortable.create('sortUlRight',{containment:['sortUlLeft','sortUlRight'],&nbsp;dropOnEmpty:</span><span style="color: #0000ff">true</span><span style="color: #000000">,ghosting:</span><span style="color: #0000ff">true</span><span style="color: #000000">,constraint:</span><span style="color: #0000ff">false</span><span style="color: #000000">,hoverclass:'hoverClass'});<br />
<br />
</span><span style="color: #000000">&lt;/</span><span style="color: #000000">script</span><span style="color: #000000">&gt;</span></div>
<p>上面的例子可以实现sortUlLeft,和sortUlRight的子元素互相交换</p>
</div>
<img src ="http://www.blogjava.net/feingto/aggbug/172962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2008-01-05 14:14 <a href="http://www.blogjava.net/feingto/archive/2008/01/05/172962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用script.aculo.us实现像google suggest自动完成功能</title><link>http://www.blogjava.net/feingto/archive/2008/01/03/172358.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Thu, 03 Jan 2008 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2008/01/03/172358.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/172358.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2008/01/03/172358.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/172358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/172358.html</trackback:ping><description><![CDATA[&nbsp;
<p>实现像google suggest自动完成功能</p>
<p>首先创建一个jsp</p>
<p>&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;<br />
<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;script type="text/javascript" src="js/prototype.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript" src="js/effects.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript" src="js/controls.js"&gt;&lt;/script&gt;<br />
&lt;style&gt;<br />
div.auto_complete {<br />
&nbsp; width: 350px;<br />
&nbsp; background: #fff;<br />
}<br />
div.auto_complete ul {<br />
&nbsp; border:1px solid #888;<br />
&nbsp; margin:0;<br />
&nbsp; padding:0;<br />
&nbsp; width:100%;<br />
&nbsp; list-style-type:none;<br />
}<br />
div.auto_complete ul li {<br />
&nbsp; margin:0;<br />
&nbsp; padding:3px;<br />
}<br />
div.auto_complete ul li.selected {<br />
&nbsp; background-color: #ffb;<br />
}<br />
div.auto_complete ul strong.highlight {<br />
&nbsp; color: #800;<br />
&nbsp; margin:0;<br />
&nbsp; padding:0;<br />
}<br />
&lt;/style&gt;</p>
<p>&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;input type="text" id="autocomplete"/&gt;<br />
&lt;div id="results" class="auto_complete"&gt;&lt;/div&gt;<br />
&lt;script type="text/javascript"&gt;<br />
&nbsp;new Ajax.Autocompleter(<br />
&nbsp;&nbsp;"autocomplete",<br />
&nbsp;&nbsp;"results",<br />
&nbsp;&nbsp;"list.html", {<br />
&nbsp;&nbsp;&nbsp;method: "GET"<br />
&nbsp;&nbsp;}<br />
&nbsp;);<br />
&lt;/script&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>&nbsp;</p>
<p>list.html</p>
<p>&lt;ul&gt;<br />
&lt;li&gt;Aria&lt;/li&gt;<br />
&lt;li&gt;Aaaa&lt;/li&gt;<br />
&lt;li&gt;Afdsa&lt;/li&gt;<br />
&lt;li&gt;bsa&lt;/li&gt;<br />
&lt;/ul&gt;</p>
<p>上面list.html采用静态页面返回列表，读者可以使用动态页面返回结果。 </p>
<img src ="http://www.blogjava.net/feingto/aggbug/172358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2008-01-03 09:20 <a href="http://www.blogjava.net/feingto/archive/2008/01/03/172358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎么避免浏览器缓存静态文件</title><link>http://www.blogjava.net/feingto/archive/2008/01/03/172357.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Thu, 03 Jan 2008 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2008/01/03/172357.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/172357.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2008/01/03/172357.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/172357.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/172357.html</trackback:ping><description><![CDATA[<div class="postbody">
<p>对于动态文件,比如 index.asp?id=...&nbsp; 或者 index.aspx?id=... 相信有经验的程序员都知道怎样禁止浏览器缓存数据了.<br />
但是对于静态文件(css,jpg,gif等等), 在什么场合下面我们需要禁止浏览器缓存他们,怎么做?<br />
<br />
本文讨论的主题是如何防缓存, 尤其是如何防止静态文件被缓存..<br />
<br />
<br />
在&nbsp; <a href="http://www.cnblogs.com/ashun/archive/2006/12/04/use_cache.html" target="_blank">RE:对博客园URL的一些调整建议, 二级域名不利于客户端浏览器缓存</a> 一文中,我提到了怎么最大化的<br />
利用浏览器缓存功能,来提高客户端浏览速度, 减轻服务器负担的.<br />
<br />
但是事物总是一分为二的,并不是所有的场合都要使用缓存的. 有时候我们的数据被缓存了反而会给我们带来麻烦.<br />
<br />
对于动态数据（从数据库读取生成的那些），我们可以通过以下方法来禁止浏览器缓存。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">'</span><span style="color: #008000">asp&nbsp;为例&nbsp;禁止缓存</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
Response.Buffer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">True</span><span style="color: #000000">&nbsp;<br />
Response.ExpiresAbsolute&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">Now</span><span style="color: #000000">()&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;<br />
Response.Expires&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;<br />
Response.CacheControl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
Response.AddHeader&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Pragma</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">No-Cache</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span></div>
<p>对于Ajax 的请求（不管是静态数据还是动态数据）:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">//</span><span style="color: #008000">以下三种方法使用其中任何一种方法都可以</span><span style="color: #008000"><br />
</span><span style="color: #000000">xmlhttp.setRequestHeader(</span><span style="color: #000000">"</span><span style="color: #000000">Cache-Control</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;<br />
</span><span style="color: #008000">//</span><span style="color: #008000">或者</span><span style="color: #008000"><br />
</span><span style="color: #000000">xmlhttp.setRequestHeader(</span><span style="color: #000000">"</span><span style="color: #000000">If-Modified-Since</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008000">//</span><span style="color: #008000">或者</span><span style="color: #008000"><br />
</span><span style="color: #000000">xmlhttp.Open(url</span><span style="color: #000000">+</span><span style="color: #000000">'</span><span style="color: #000000">?</span><span style="color: #000000">rnd</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">+</span><span style="color: #000000">Math.random(),....)<br />
</span></div>
<p>如果使用 prototype.js&nbsp; ,&nbsp;用类似这样的代码&nbsp;<br />
new Ajax.Request(url,{method:"get",requestHeaders:[<span style="color: #000000">"</span><span style="color: #000000">Cache-Control</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span>]})<br />
或者<br />
new Ajax.Request(url,{method:"get",requestHeaders:[<span style="color: #000000"><span style="color: #000000">"</span><span style="color: #000000">If-Modified-Since</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span></span>]})<br />
&nbsp;<br />
<br />
什么情况下，要禁止静态文件缓存：<br />
1、经常可能要改动的 js, css.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如 一个html 文件， test.html 在 1.0版本中。可能是这样<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;script src="common.js"&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 修改后&nbsp; v1.1版本：<br />
&nbsp;&lt;script src="common.js"&gt;&lt;/script&gt;<br />
&nbsp;&lt;script src="foo.js"&gt;&lt;/script&gt;<br />
&nbsp;&nbsp; 新增加了一个foo.js&nbsp; 同时，也改动了common.js , 在common.js 中定义了新的类，并在foo.js 中使用了common.js.&nbsp; <br />
<br />
在这种情况下如果以前用户浏览过 1.0版本的 html 文件，那么他的浏览器自动缓存了 common.js<br />
当他浏览新版本的时候，因为使用的是 v1.1的 foo.js 和 v1.0的 common.js ，这样将导致脚本出错。<br />
<br />
<br />
解决方法探讨：<br />
&nbsp;&nbsp;因为css,js 是通过 &lt;script src=....&gt; 这种方式加载的，所以，很难使用 asp 的那种服务器端禁止缓存的办法。也很难使用ajax的通过设置 http请求头的办法禁止使用缓存。<br />
<br />
看来随机数是个好办法。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">//</span><span style="color: #008000">方法一：</span><span style="color: #008000"><br />
</span><span style="color: #000000">document.write(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;script&nbsp;src='test.js?rnd=</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Math.random()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">'&gt;&lt;/s</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">cript&gt;</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<br />
</span><span style="color: #008000">//</span><span style="color: #008000">方法二：</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;js</span><span style="color: #000000">=</span><span style="color: #000000">document.createElement(</span><span style="color: #000000">"</span><span style="color: #000000">script</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
js.src</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">test.js</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Math.random()<br />
document.body.appendChild(js)</span></div>
<p><br />
但是，如果采用随机数的话， js文件将永远得不到缓存，每次都必须重新从服务器加载，即使没有任何更改。<br />
大家如果经常上国外网站的话，可以看到他们通常采用这样的方式来解决：<br />
&lt;script src="test.js?ver=113"&gt;&lt;/script&gt;<br />
其中 ver=113 的 113就是版本号，一般都是采用 CVS 或其他工具生成的开发版本号。<br />
<br />
这样真正做到了应该缓存的时候缓存静态文件，当版本有更新的时候从获取最新的版本，并更新缓存。<br />
对于图像 &lt;img src="test.jps?ver=在CVS的版本号"&gt; 来有效利用和更新缓存.<br />
<br />
<br />
唉，现在在CSDN的Web版，不知道有多少人在重复问着同一个问题。&#8220;怎么通过程序删除清空客户端的浏览器缓存&#8221;.........</p>
<p>&nbsp;</p>
<p>未完待续： <br />
<br />
下一篇：&nbsp; 利用浏览器缓存来改善用户体验。。。。Ajax模式之预先加载<br />
<br />
敬请关注，等我写完再加上链接<br />
</p>
</div>
<img src ="http://www.blogjava.net/feingto/aggbug/172357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2008-01-03 09:19 <a href="http://www.blogjava.net/feingto/archive/2008/01/03/172357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX框架/库比较和选择：ECHO2, GWT, DOJO, PROTOTYPE, JQUERY</title><link>http://www.blogjava.net/feingto/archive/2007/12/30/171750.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Sun, 30 Dec 2007 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2007/12/30/171750.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/171750.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2007/12/30/171750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/171750.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/171750.html</trackback:ping><description><![CDATA[看了几篇中英文的AJAX库/框架比较文章，为方便选择使用，特归纳如下：<br />
首先，要在两个类别中选择，一个是编译类，一个是非编译类别。<br />
Echo2/GWT是将JAVA代码编译成JAVASCRIPT，乍看很方便，不用掌握JS也能做出炫目界面。但这只适于不会或者不想了解JS的情况，对于还是想完全控制和定制界面的项目就不适合。<br />
另外，有一种观点认为JAVA-&gt;JS转换是一种低级语言向高级语言转换，本身没有意义。有点像去学汇编，然后再找个工具把汇编语言代码转换成C代码来用。我虽然没完全想通这个观点，不过，我一直用C/C++，这几年才逐渐发现JAVA确实是一种进化。没准别人说的是对的呢？<br />
在Echo2和GWT中，GWT大部分工作是在客户端，尽量少跟SERVER打交道，适合大型网站运用；ECHO2信奉&#8220;用到才加载&#8221;的信条，所以会有大量向SERVER的访问，适合企业应用。另外，个人觉得ECHO2是个更全面的的一站式框架，界面也非常炫。但它的开发工具要收费。<br />
再谈非编译类别，它们包括DOJO、PROTOTYPE、JQEURY，下面一一介绍：<br />
先说PROTOTYPE，它比较轻量极，能让你的代码更加简化。最经典莫过于&#8220;美圆函数&#8221;：<br />
document.getElementById(&#8217;elementid&#8217;) 变成$(&#8217;elementid&#8217;)<br />
它加强了JS语言的可开发性，降低了学习JS的门槛。<br />
DOJO最吸引人的是它的事件系统和丰富的可定制组件。它可以用形如下面的语句为各种HTML元素加入事件：<br />
dojo.event.connect(someNode, "onclick", doStuff); <br />
正由于DOJO提供了强大功能，它分成了许多包，可以分别包含使用。<br />
JQUERY也提供了美圆函数，它的插件系统也提供象DOJO的组件，但它没有PROTOTYPE那样简洁，也没有DOJO这么多的组件供使用，但它兼收两家优点，并且个头不大，文档也算完整，所以说它介乎于前述两者之间。 <br />
所以，如果你需要非常完整的工具组件请用DOJO，如果你想优化你的JS代码，提高书写技巧请用PROTOTYPE，如果你想两者兼顾就用JQUERY。
<img src ="http://www.blogjava.net/feingto/aggbug/171750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2007-12-30 20:37 <a href="http://www.blogjava.net/feingto/archive/2007/12/30/171750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js开发笔记</title><link>http://www.blogjava.net/feingto/archive/2007/12/30/171739.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Sun, 30 Dec 2007 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2007/12/30/171739.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/171739.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2007/12/30/171739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/171739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/171739.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Table of Contents1. Programming Guide1.1. Prototype是什么?1.2. 关联文章1.3. 通用性方法1.3.1. 使用 $()方法1.3.2. 使用$F()方法1.3.3. 使用$A()方法1.3.4. 使用$H()方法1.3.5. 使用$R()方法1.3.6. 使用Try.these()方...&nbsp;&nbsp;<a href='http://www.blogjava.net/feingto/archive/2007/12/30/171739.html'>阅读全文</a><img src ="http://www.blogjava.net/feingto/aggbug/171739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2007-12-30 18:07 <a href="http://www.blogjava.net/feingto/archive/2007/12/30/171739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Prototype 1.5 Ajax 使用教程 </title><link>http://www.blogjava.net/feingto/archive/2007/12/30/171737.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Sun, 30 Dec 2007 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2007/12/30/171737.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/171737.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2007/12/30/171737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/171737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/171737.html</trackback:ping><description><![CDATA[<h3>2.3&nbsp; Prototype对Ajax的支持</h3>
<p style="text-indent: 21pt">作为一个Ajax开发框架，Prototype对Ajax开发提供了有力的支持。在Prototype中，与Ajax相关的类和对象包括：Ajax、Ajax.Responsders、Ajax.Base、Ajax.Request、Ajax. PeriodicalUpdater和Ajax.Updater，图2-3所示为这些类和对象之间的关系及其常用属性和方法，下面分别对这些类和对象进行介绍。</p>
<p align="center"><img height="351" alt="" src="http://book.csdn.net/BookFiles/286/img/image004.jpg" width="491" /></p>
<p align="center">图2-3&nbsp; Prototype中Ajax相关类和对象关系示意图</p>
<h3>2.3.1&nbsp; Ajax对象</h3>
<p style="text-indent: 21pt">Ajax对象为其他的Ajax功能类提供了最基本的支持，它的实现如2.2.7节中例2-10所示，其中包括一个方法getTransport和一个属性activeRequestCount。getTransport方法返回一个XMLHttpRequest对象，activeRequestCount属性代表正在处理中的Ajax请求的个数。</p>
<h3>2.3.2&nbsp; Ajax.Base类</h3>
<p style="text-indent: 21pt">Ajax.Base类是Ajax.Request类和Ajax.PeriodicalUpdater类的基类。它提供了3个方法：</p>
<p style="margin-left: 42pt; text-indent: -21pt">l&nbsp; setOptions：设置Ajax操作所使用的选项。</p>
<p style="margin-left: 42pt; text-indent: -21pt">l&nbsp; responseIsSuccess：判断Ajax操作是否成功。</p>
<p style="margin-left: 42pt; text-indent: -21pt">l&nbsp; responseIsFailure：判断Ajax操作是否失败（与responseIsSuccess相反）。</p>
<p style="text-indent: 21pt">Ajax.Base类的主要作用是提取出一些公用的方法，其他类通过继承的方式使用这些方法，实现代码复用。</p>
<h3>2.3.3&nbsp; Ajax.Request类</h3>
<p style="text-indent: 21pt">这是Prototype中最经常使用的一个Ajax相关类。Ajax.Request类的方法通常是内部使用的，因此这里就不一一列举，有兴趣的读者可以参考Prototype的源代码。这里重点讲讲如何使用Ajax.Request类，首先给出一个最简单的Ajax.Request类的应用示例，如例2-11所示，注意示例中的黑体字。</p>
<p style="text-indent: 21pt">例2-11&nbsp; Ajax.Request类应用示例</p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>Ajax.Request</strong><strong>测试页面：</strong></p>
<p style="line-height: 10.8pt">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"</p>
<p style="line-height: 10.8pt">&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</p>
<p style="line-height: 10.8pt">&lt;html&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;head&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;chapter 3&lt;/title&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" language="javascript"</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;src="prototype.js" &gt;&lt;/script&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" language="javascript"&gt;</p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function test() {</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </strong><strong>创建Ajax.Request</strong><strong>对象，发起一个Ajax</strong><strong>请求</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var myAjax = new Ajax.Request(</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'data.html', // </strong><strong>请求的URL</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method: 'get', &nbsp;// </strong><strong>使用GET</strong><strong>方式发送HTTP</strong><strong>请求</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onComplete: showResponse // </strong><strong>指定请求成功完成时需要执行的方法</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</strong></p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function showResponse(response) {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $('divResult').innerHTML = response.responseText;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;/head&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;body&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;input type="button" value="click" onclick="test()" /&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;div id="divResult" /&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;/body&gt;</p>
<p style="line-height: 10.8pt">&lt;/html&gt;</p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>data.html</strong><strong>：</strong></p>
<p style="line-height: 10.8pt">&lt;input type="text" id="name" /&gt;</p>
<p style="line-height: 10.8pt">&lt;input type="button" value="Click Me" onclick="sayHi()"&gt;</p>
<p style="text-indent: 21pt">Ajax.Request对象在初始化时需要提供两个参数：第1个参数是将要请求页面的URL，这里使用的data.html是一个普通的HTML静态页面；第2个参数是Ajax操作的选项，在Prototype中并没有专门为Ajax操作选项定义一个类，通常都是像例2-11这样，通过匿名对象的方式设置Ajax操作的参数。在例2-11中，Ajax操作选项具有两个属性：method表示HTTP请求方式，默认是POST方式；onComplete指定了Ajax操作完成以后（即XMLHttpRequest对象的status属性为4时），页面将要执行的函数。当然，Ajax操作还包括很多其他选项，如表2-1所示。</p>
<p>表2-1&nbsp; Ajax操作选项属性含义</p>
<p>
<table style="border-top-style: none; border-right-style: none; border-left-style: none; border-collapse: collapse; border-bottom-style: none" cellspacing="0" cellpadding="0" border="1">
    <thead>
        <tr style="page-break-inside: avoid">
            <td style="padding-right: 5.4pt; border-top: black 1.5pt solid; padding-left: 5.4pt; padding-bottom: 0cm; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-indent: 17pt">属性名称</p>
            </td>
            <td style="padding-right: 5.4pt; border-top: black 1.5pt solid; padding-left: 5.4pt; padding-bottom: 0cm; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-indent: 17pt">含义</p>
            </td>
        </tr>
    </thead>
    <tbody>
        <tr style="page-break-inside: avoid">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">method</p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">HTTP请求方式（POST/GET/HEAD）。</p>
            </td>
        </tr>
        <tr style="page-break-inside: avoid">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">parameters</p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">在HTTP请求中传入的URL格式的值列表，即URL串中问号之后的部分。</p>
            </td>
        </tr>
        <tr style="page-break-inside: avoid">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">asynchronous</p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">是否做异步XMLHttpRequest请求。</p>
            </td>
        </tr>
        <tr style="page-break-inside: avoid">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">postBody</p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">在POST请求方式下，传入请求体中的内容。</p>
            </td>
        </tr>
        <tr style="page-break-inside: avoid">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">requestHeaders</p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">和请求一起被传入的HTTP头部列表，这个列表必须含有偶数个项目，因为列表中每两项为一组，分别代表自定义部分的名称和与之对应的字符串值。</p>
            </td>
        </tr>
        <tr style="page-break-inside: avoid">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">onXXXXXXXX</p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">在HTTP请求、响应的过程中，当XMLHttpRequest对象状态发生变化时调用的响应函数。响应函数有5个：onUninitialized、onLoading、onLoaded、onInteractive和onComplete。传入这些函数的参数可以有2个，其中第1个参数是执行HTTP请求的XMLHttpRequest对象，第2个参数是包含被执行的X-JSON响应的HTTP头。</p>
            </td>
        </tr>
        <tr style="page-break-inside: avoid">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">onSuccess</p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">Ajax操作成功完成时调用的响应函数，传入的参数与onXXXXXXXX相同。</p>
            </td>
        </tr>
        <tr style="page-break-inside: avoid">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">onFailure</p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">Ajax操作请求完成但出现错误时调用的响应函数，传入的参数与onXXXXXXXX相同。</p>
            </td>
        </tr>
        <tr style="page-break-inside: avoid">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1.5pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">onException</p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; border-top-style: none; padding-top: 0cm; border-bottom: black 1.5pt solid; border-right-style: none; border-left-style: none" valign="top">
            <p style="text-justify: inter-ideograph; text-indent: 17pt; text-align: justify">Ajax操作发生异常情况时调用的响应函数，它可以接收2个参数，其中第1个参数是执行HTTP请求的XMLHttpRequest对象，第2个参数是异常对象。</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<h3>2.3.4&nbsp; Ajax.Updater类</h3>
<p style="text-indent: 21pt">例2-11使用Ajax.Request类实现了页面的局部刷新效果，而这样类似的功能在Ajax应用中是经常使用的。因此，为了简化这种工作，Prototype框架从Ajax.Requet类中派生出一个子类——Ajax.Updater。与Ajax.Request相比，Ajax.Updater的初始化多了一个container参数，该参数代表将要更新的页面元素的id。例2-11的功能通过Ajax.Updater的实现，会变得更加简单，如例2-12所示。</p>
<p style="text-indent: 21pt">例2-12&nbsp; Ajax.Updater类的应用示例</p>
<p style="line-height: 10.8pt">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"</p>
<p style="line-height: 10.8pt">&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</p>
<p style="line-height: 10.8pt">&lt;html&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;head&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;chapter 3&lt;/title&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" language="javascript"</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;src="prototype.js" &gt;&lt;/script&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" language="javascript"&gt;</p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function test() {</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var myAjax = new Ajax.Updater(</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'divResult', // </strong><strong>更新的页面元素</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'data.html', // </strong><strong>请求的URL</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method: 'get'</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</strong></p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</strong></p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;/head&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;body&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;input type="button" value="click" onclick="test()" /&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;div id="divResult" /&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;/body&gt;</p>
<p style="line-height: 10.8pt">&lt;/html&gt;</p>
<p style="text-indent: 21pt">此外，Ajax.Updater类还有另外一个功能，如果请求的页面内容中包括JavaScript脚本，Ajax.Updater类可以执行其中的脚本，只需要在Ajax操作选项中增加属性&#8220;evalScripts: true&#8221;即可。对例2-11中的data.html进行修改，在其中加入JavaScript脚本，如例2-13所示。</p>
<p style="text-indent: 21pt">例2-13&nbsp; data.html</p>
<p style="line-height: 10.8pt">&lt;script language="javascript" type="text/javascript"&gt;</p>
<p style="line-height: 10.8pt">sayHi = function() {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; alert("Hello, " + $F('name') + "!");</p>
<p style="line-height: 10.8pt">}</p>
<p style="line-height: 10.8pt">&lt;/script&gt;</p>
<p style="line-height: 10.8pt">&lt;input type="text" id="name" /&gt;</p>
<p style="line-height: 10.8pt">&lt;input type="button" value="Click Me" onclick="sayHi()"&gt;</p>
<p style="text-indent: 21pt">调用Ajax.Updater的JavaScript脚本修改为：</p>
<p style="line-height: 10.8pt">function test() {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; var myAjax = new Ajax.Updater(</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'divResult', // 更新的页面元素</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'data.html', // 请求的URL</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method: 'get',</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; evalScripts: true</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; );</p>
<p style="line-height: 10.8pt">}</p>
<p style="text-indent: 21pt">这样就可以使用data.html页面的内容更新当前页面中的&lt;div&gt;元素divResult，并且执行data.html页面中包含的JavaScript脚本。</p>
<p style="text-indent: 21pt">这里需要注意的是例2-13中sayHi函数的写法，如果写成</p>
<p style="line-height: 10.8pt">function sayHi() {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; alert("Hello, " + $F('name') + "!");</p>
<p style="line-height: 10.8pt">}</p>
<p style="text-indent: 21pt">或者</p>
<p style="line-height: 10.8pt">var sayHi = function() {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; alert("Hello, " + $F('name') + "!");</p>
<p style="line-height: 10.8pt">}</p>
<p style="text-indent: 0cm">程序是不能正常运行的。这是因为Ajax.Updater执行脚本是通过eval的方式，而不是将脚本内容引入到当前页面，直接声明的function sayHi或者用var声明的sayHi函数，其作用域只是在这段脚本内部，外部的其他脚本不能访问sayHi函数。而按照例2-13的方式声明的函数，其作用域是整个window。</p>
<h3>2.3.5&nbsp; Ajax.PeriodicalUpdater类</h3>
<p style="text-indent: 21pt">和Ajax.Request类相似，Ajax.PeriodicalUpdater类也继承自Ajax.Base类。在一些Ajax应用中，需要周期性地更新某些页面元素，例如天气预报、即时新闻等等。实现这样的功能通常要使用JavaScript中的定时器函数setTimeout、clearTimeout等，而有了Ajax.PeriodicalUpdater类可以很好地简化这类编码工作。</p>
<p style="text-indent: 21pt">新建一个Ajax. PeriodicalUpdater类的实例需要指定3个参数：</p>
<p style="margin-left: 42pt; text-indent: -21pt">l&nbsp; container：将要更新的页面元素id；</p>
<p style="margin-left: 42pt; text-indent: -21pt">l&nbsp; url：请求的URL地址；</p>
<p style="margin-left: 42pt; text-indent: -21pt">l&nbsp; options：Ajax操作选项。</p>
<p style="text-indent: 21pt">和Ajax.Updater类相似，Ajax.PeriodicalUpdater类也支持动态执行JavaScript脚本，只需在Ajax操作选项中增加（evalScripts: true）属性值即可。</p>
<p style="text-indent: 21pt">Ajax.PeriodicalUpdater类支持两个特殊的Ajax操作选项：frequency和decay。frequency参数很容易理解，既然是定时更新页面元素，或者定时执行脚本，那么多长时间更新或者执行一次呢？frequency指的就是两次Ajax操作之间的时间间隔，单位是秒，默认值为2秒。</p>
<p style="text-indent: 21pt">如果仅指定frequency参数，程序会按照固定的时间间隔执行Ajax操作。这样的更新策略合理吗？答案取决于请求URL中数据的更新频率。如果请求的数据会很有规律地按照固定频率改变，那么只要设置一个合适的frequency值，就可以很有效地实现页面的定时更新。然而实际应用中的数据往往不会那么理想，例如新闻，可能在一天中只有特定的一段时间更新频率会很高，而在其他时间则几乎没有变化。经常遇到这样的情况该怎么办呢？Ajax.PeriodicalUpdater类支持的decay属性就是为了解决这个问题而产生的。当option中带有decay属性时，如果请求返回的数据与上次相同，那么下次进行Ajax操作的时间间隔会乘以一个decay的系数。</p>
<p style="text-indent: 21pt">为了比较明显地看到decay属性的效果，在请求的测试页面中加入记录时间的脚本，代码如例2-14所示。</p>
<p style="text-indent: 21pt">例2-14&nbsp; Ajax.PeriodicalUpdater类应用示例</p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>ex10.html</strong><strong>：</strong></p>
<p style="line-height: 10.8pt">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"</p>
<p style="line-height: 10.8pt">&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</p>
<p style="line-height: 10.8pt">&lt;html&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;head&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;chapter 3&lt;/title&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" language="javascript"</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;src="prototype.js" &gt;&lt;/script&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" language="javascript"&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var str='';</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var intcount=0;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function test() {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var myAjax = new Ajax.PeriodicalUpdater(</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'divResult', // 定时更新的页面元素</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'script1.html', // 请求的URL</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method: 'get', // HTTP请求的方式为GET</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; evalScripts: true, // 是否执行请求页面中的脚本</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frequency: 1, // 更新的频率</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decay: 1 // 衰减系数</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;/head&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;body&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;input type="button" value="click" onclick="test()" /&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;div id="divResult" &gt;&lt;/div&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;div id="divResult2" &gt;&lt;/div&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;/body&gt;</p>
<p style="line-height: 10.8pt">&lt;/html&gt;</p>
<p style="text-indent: 21.35pt; line-height: 10.8pt"><strong>script1.html:</strong></p>
<p style="line-height: 10.8pt">&lt;script language="javascript" type="text/javascript"&gt;</p>
<p style="line-height: 10.8pt">// Ajax.PeriodicalUpdater调用函数计数</p>
<p style="line-height: 10.8pt">// 在&lt;div&gt;元素divResult2中增加一行结果，并记录当前时间和</p>
<p style="line-height: 10.8pt">// Ajax.PeriodicalUpdater的调用次数</p>
<p style="line-height: 10.8pt">intcount++;</p>
<p style="line-height: 10.8pt">str = $('divResult2').innerHTML;</p>
<p style="line-height: 10.8pt">$('divResult2').innerHTML = str + "count = " + intcount+ ": " + new Date() + "&lt;br&gt;";</p>
<p style="line-height: 10.8pt">&lt;/script&gt;</p>
<p style="text-indent: 21pt">例2-14的运行结果如图2-4所示。</p>
<p align="center"><img height="210" alt="" src="http://book.csdn.net/BookFiles/286/img/image005.jpg" width="384" /></p>
<p align="center">图2-4&nbsp; Ajax.PeriodicalUpdater类应用示例</p>
<p style="text-indent: 21pt">可以看到，由于请求返回的数据一直没有发生变化，每次请求时间的间隔是上一次的2倍（decay=2）。如果某一次请求返回的数据发生了变化，那么执行请求的时间间隔则恢复到初始值。</p>
<h3>2.3.6&nbsp; Ajax.Responders对象</h3>
<p style="text-indent: 21pt">Ajax.Responders对象维护了一个正在运行的Ajax对象列表，在需要实现一些全局的功能时就可以使用它。例如，在Ajax请求发出以后需要提示用户操作正在执行中，而操作返回以后则取消提示。利用Ajax.Responders对象就可以实现这样的功能，如例2-15所示。</p>
<p style="text-indent: 21pt">例2-15&nbsp; Ajax.Responders对象应用示例</p>
<p style="line-height: 10.8pt">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"</p>
<p style="line-height: 10.8pt">&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</p>
<p style="line-height: 10.8pt">&lt;html&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;head&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;chapter 3&lt;/title&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" language="javascript"</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;src="prototype.js" &gt;&lt;/script&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" language="javascript"&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function test() {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var myAjax = new Ajax.Request(</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'data.html', </p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method: 'get', </p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onComplete: showResponse</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function showResponse(response) {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $('divResult').innerHTML = response.responseText;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var handle = {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onCreate: function() {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element.show('loading'); // 当创建Ajax请求时，显示loading</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onComplete: function() {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 当请求成功返回时，如果当前没有其他正在运行中的Ajax请求，隐藏loading</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Ajax.activeRequestCount == 0) {</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element.hide('loading');</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将handle注册到全局的Ajax.Responders对象中，使其生效</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax.Responders.register(handle);</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;/head&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;body&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;input type="button" value="click" onclick="test()" /&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;div id="divResult" &gt;&lt;/div&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;div id='loading' style="display:none"&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;img src="loading.gif"&gt;Loading...</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;/div&gt;</p>
<p style="line-height: 10.8pt">&nbsp;&nbsp;&nbsp; &lt;/body&gt;</p>
<p style="line-height: 10.8pt">&lt;/html&gt;</p>
<p style="text-indent: 21pt">例2-15中定义了一个handle对象，其中包含onCreate和onComplete函数。页面中发出任何一个Ajax请求时都会调用onCreate方法，而请求完成时都会调用onComplete方法。例2-15的运行结果如图2-5所示。<br />
<div align="center"><img alt="" src="http://www.blogjava.net/images/blogjava_net/feingto/image006.jpg" border="0" /></div>
</p>
<img src ="http://www.blogjava.net/feingto/aggbug/171737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2007-12-30 18:03 <a href="http://www.blogjava.net/feingto/archive/2007/12/30/171737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对xml进行增、删、改的很好例子</title><link>http://www.blogjava.net/feingto/archive/2007/12/29/171559.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Sat, 29 Dec 2007 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2007/12/29/171559.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/171559.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2007/12/29/171559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/171559.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/171559.html</trackback:ping><description><![CDATA[rule.hta<br />
================<br />
<br />
&lt;!DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;HTML&nbsp;3.2&nbsp;Final//EN"&gt;<br />
&lt;HTML&gt;<br />
&lt;HEAD&gt;<br />
&lt;TITLE&gt;XML&nbsp;Editer&lt;/TITLE&gt;<br />
&lt;HTA:APPLICATION&nbsp;ID="oHTA"<br />
APPLICATIONNAME="myApp"<br />
BORDER="thick"<br />
BORDERSTYLE="normal"<br />
CAPTION="yes"<br />
ContextMenu="yes"<br />
ICON=""<br />
MAXIMIZEBUTTON="yes"<br />
MINIMIZEBUTTON="yes"<br />
scroll="no"<br />
selection="no"<br />
SHOWINTASKBAR="yes"<br />
SINGLEINSTANCE="yes"<br />
SYSMENU="yes"<br />
VERSION="1.0"<br />
WINDOWSTATE="normal"<br />
&gt;<br />
<br />
&lt;style&nbsp;type="text/css"&gt;<br />
&lt;/style&gt;<br />
&lt;/HEAD&gt;<br />
<br />
&lt;script&nbsp;language="javascript"&gt;<br />
<br />
//&nbsp;load&nbsp;the&nbsp;xml&nbsp;file<br />
var&nbsp;xmlDoc&nbsp;=&nbsp;new&nbsp;ActiveXObject("Msxml2.DOMDocument");<br />
xmlDoc.async&nbsp;=&nbsp;false;<br />
xmlDoc.resolveExternals&nbsp;=&nbsp;false;<br />
xmlDoc.load("rule.xml");<br />
<br />
//&nbsp;load&nbsp;the&nbsp;xsl&nbsp;file<br />
var&nbsp;xslDoc&nbsp;=&nbsp;new&nbsp;ActiveXObject("Msxml2.FreeThreadedDOMDocument");<br />
xslDoc.async&nbsp;=&nbsp;false;<br />
xslDoc.resolveExternals&nbsp;=&nbsp;false;<br />
xslDoc.load("rule.xsl");<br />
<br />
//&nbsp;create&nbsp;the&nbsp;xslt&nbsp;object<br />
var&nbsp;xslt&nbsp;=&nbsp;new&nbsp;ActiveXObject("Msxml2.XSLTemplate");<br />
xslt.stylesheet&nbsp;=&nbsp;xslDoc;<br />
var&nbsp;xslProc&nbsp;=&nbsp;xslt.createProcessor();<br />
xslProc.input&nbsp;=&nbsp;xmlDoc;<br />
<br />
var&nbsp;checked_count&nbsp;=&nbsp;0;<br />
var&nbsp;cur_page&nbsp;=&nbsp;1;<br />
var&nbsp;total_page&nbsp;=&nbsp;1;<br />
<br />
function&nbsp;OutputDocument(number){<br />
xslProc.addParameter("ename",&nbsp;number);<br />
xslProc.addParameter("startno",&nbsp;(cur_page&nbsp;-&nbsp;1)*10);<br />
xslProc.addParameter("endno",&nbsp;cur_page*10);<br />
xslProc.transform();<br />
<br />
return&nbsp;xslProc.output;<br />
}<br />
<br />
function&nbsp;delete_node(node){<br />
if(&nbsp;node.hasChildNodes()&nbsp;)&nbsp;{&nbsp;<br />
var&nbsp;kids&nbsp;=&nbsp;node.childNodes;&nbsp;<br />
for(var&nbsp;i=0;i&lt;kids.length;i++)&nbsp;{&nbsp;<br />
delete_node(kids);<br />
}<br />
}<br />
node.parentNode.removeChild(node);<br />
}<br />
<br />
function&nbsp;delete_rule(id){<br />
var&nbsp;node&nbsp;=&nbsp;xmlDoc.selectSingleNode("/rules/rule[event/id="+id+"]");<br />
delete_node(node);<br />
}<br />
<br />
function&nbsp;modify_node(node){<br />
node.selectSingleNode("event/id").text&nbsp;=&nbsp;modify_id.value;<br />
node.selectSingleNode("event/name").text&nbsp;=&nbsp;modify_name.value;<br />
if(&nbsp;modify_state.checked&nbsp;)&nbsp;{<br />
node.selectSingleNode("enable").text&nbsp;=&nbsp;"true";<br />
}&nbsp;else&nbsp;{<br />
node.selectSingleNode("enable").text&nbsp;=&nbsp;"false";<br />
}<br />
}<br />
<br />
function&nbsp;modify_rule(id){<br />
var&nbsp;node&nbsp;=&nbsp;xmlDoc.selectSingleNode("/rules/rule[event/id="+id+"]");<br />
modify_node(node);<br />
}<br />
<br />
function&nbsp;add_rule(){<br />
var&nbsp;id&nbsp;=&nbsp;xmlDoc.createElement("id");<br />
id.appendChild(xmlDoc.createTextNode(add_id.value));<br />
var&nbsp;name&nbsp;=&nbsp;xmlDoc.createElement("name");<br />
name.appendChild(xmlDoc.createTextNode(add_name.value));<br />
<br />
var&nbsp;event&nbsp;=&nbsp;xmlDoc.createElement("event");<br />
event.appendChild(id);<br />
event.appendChild(name);<br />
<br />
var&nbsp;enable&nbsp;=&nbsp;xmlDoc.createElement("enable");<br />
if(&nbsp;add_state.checked&nbsp;)&nbsp;{<br />
enable.appendChild(xmlDoc.createTextNode("true"));<br />
}&nbsp;else&nbsp;{<br />
enable.appendChild(xmlDoc.createTextNode("false"));<br />
}<br />
<br />
var&nbsp;rule&nbsp;=&nbsp;xmlDoc.createElement("rule");<br />
rule.appendChild(event);<br />
rule.appendChild(enable);<br />
<br />
var&nbsp;parent&nbsp;=&nbsp;xmlDoc.selectSingleNode("/rules");<br />
if(&nbsp;parent.hasChildNodes()&nbsp;)&nbsp;{<br />
parent.insertBefore(rule,&nbsp;parent.firstChild);<br />
}&nbsp;else&nbsp;{<br />
parent.appendChild(rule);<br />
}<br />
}<br />
<br />
function&nbsp;gotoPage(pageno){<br />
if(&nbsp;pageno&nbsp;&lt;&nbsp;1&nbsp;)&nbsp;{<br />
cur_page&nbsp;=&nbsp;1;<br />
}&nbsp;else&nbsp;if(&nbsp;pageno&nbsp;&gt;=&nbsp;total_page&nbsp;)&nbsp;{<br />
cur_page&nbsp;=&nbsp;total_page;<br />
}&nbsp;else&nbsp;{<br />
cur_page&nbsp;=&nbsp;pageno;<br />
}<br />
Transform();<br />
}<br />
<br />
function&nbsp;saveXML(){<br />
xmlDoc.save("rule.xml");<br />
}<br />
<br />
function&nbsp;protectsubmit(val){<br />
if(&nbsp;val&nbsp;==&nbsp;1&nbsp;)&nbsp;{&nbsp;//add<br />
if(&nbsp;add_id.value&nbsp;&lt;&nbsp;10000&nbsp;||&nbsp;add_name.value&nbsp;==&nbsp;""&nbsp;)&nbsp;{<br />
window.alert("事件号必须是5位整数且事件名不能为空");<br />
}&nbsp;else&nbsp;if(&nbsp;xmlDoc.selectSingleNode("/rules/rule/event/id[.&nbsp;=&nbsp;"&nbsp;+&nbsp;add_id.value&nbsp;+&nbsp;"]")&nbsp;)&nbsp;{<br />
window.alert("事件号"&nbsp;+&nbsp;add_id.value&nbsp;+&nbsp;"已经存在");<br />
}&nbsp;else&nbsp;{<br />
add_rule();<br />
saveXML();<br />
Transform();<br />
}<br />
}&nbsp;else&nbsp;if(&nbsp;val&nbsp;==&nbsp;2&nbsp;)&nbsp;{&nbsp;//modify<br />
var&nbsp;id&nbsp;=&nbsp;viewTable.rows[getFirstCheckedLine()].cells[2].innerText;<br />
if(&nbsp;modify_id.value&nbsp;&lt;&nbsp;10000&nbsp;||&nbsp;modify_name.value&nbsp;==&nbsp;""&nbsp;)&nbsp;{<br />
window.alert("事件号必须是5位整数且事件名不能为空");<br />
}&nbsp;else&nbsp;if(&nbsp;id&nbsp;!=&nbsp;modify_id.value&nbsp;&amp;&amp;&nbsp;xmlDoc.selectSingleNode("/rules/rule/event/id[.&nbsp;=&nbsp;"&nbsp;+&nbsp;modify_id.value&nbsp;+&nbsp;"]")&nbsp;)&nbsp;{<br />
window.alert("事件号"&nbsp;+&nbsp;modify_id.value&nbsp;+&nbsp;"已经存在");<br />
}&nbsp;else&nbsp;{<br />
if(&nbsp;confirm("确认修改？")&nbsp;)&nbsp;{<br />
modify_rule(id);<br />
saveXML();<br />
Transform();<br />
}<br />
}<br />
}&nbsp;else&nbsp;if(&nbsp;val&nbsp;==&nbsp;3&nbsp;)&nbsp;{&nbsp;//delete<br />
if(&nbsp;!confirm("确认删除？")&nbsp;)&nbsp;{<br />
return;<br />
}<br />
for(&nbsp;var&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;viewTable.rows.length;&nbsp;i++&nbsp;)&nbsp;{<br />
var&nbsp;id&nbsp;=&nbsp;viewTable.rows.cells[2].innerText;<br />
if(&nbsp;eval("viewchk_"&nbsp;+&nbsp;id&nbsp;+&nbsp;".checked")&nbsp;==&nbsp;true&nbsp;)&nbsp;{<br />
delete_rule(id)<br />
}<br />
}<br />
saveXML();<br />
Transform();<br />
}&nbsp;else&nbsp;if(&nbsp;val&nbsp;==&nbsp;4&nbsp;)&nbsp;{&nbsp;//select&nbsp;all<br />
checked_count&nbsp;=&nbsp;viewTable.rows.length&nbsp;-&nbsp;1;<br />
for(&nbsp;var&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;viewTable.rows.length;&nbsp;i++&nbsp;)&nbsp;{<br />
var&nbsp;id&nbsp;=&nbsp;viewTable.rows.cells[2].innerText;<br />
eval("viewchk_"&nbsp;+&nbsp;id&nbsp;+&nbsp;".checked&nbsp;=&nbsp;true");<br />
}<br />
changeState();<br />
}&nbsp;else&nbsp;if(&nbsp;val&nbsp;==&nbsp;5&nbsp;)&nbsp;{&nbsp;//cancel&nbsp;all<br />
checked_count&nbsp;=&nbsp;0;<br />
for(&nbsp;var&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;viewTable.rows.length;&nbsp;i++&nbsp;)&nbsp;{<br />
var&nbsp;id&nbsp;=&nbsp;viewTable.rows.cells[2].innerText;<br />
eval("viewchk_"&nbsp;+&nbsp;id&nbsp;+&nbsp;".checked&nbsp;=&nbsp;false");<br />
}<br />
changeState();<br />
}<br />
}<br />
<br />
function&nbsp;getFirstCheckedLine(){<br />
for(&nbsp;var&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;viewTable.rows.length;&nbsp;i++&nbsp;)&nbsp;{<br />
var&nbsp;id&nbsp;=&nbsp;viewTable.rows.cells[2].innerText;<br />
if(&nbsp;eval("viewchk_"&nbsp;+&nbsp;id&nbsp;+&nbsp;".checked")&nbsp;==&nbsp;true&nbsp;)&nbsp;{<br />
return&nbsp;i;<br />
}<br />
}<br />
return&nbsp;0;<br />
}<br />
<br />
function&nbsp;checkOVItem(val){<br />
if(&nbsp;eval("viewchk_"&nbsp;+&nbsp;val+".checked")&nbsp;==&nbsp;true&nbsp;)&nbsp;{<br />
checked_count++;<br />
}&nbsp;else&nbsp;{<br />
checked_count--;<br />
}<br />
changeState();<br />
}<br />
<br />
function&nbsp;changeState(){<br />
if(&nbsp;checked_count&nbsp;)&nbsp;{<br />
delete_btn.disabled&nbsp;=&nbsp;false;<br />
cancel_all_btn.disabled&nbsp;=&nbsp;false;<br />
}&nbsp;else&nbsp;{<br />
delete_btn.disabled&nbsp;=&nbsp;true;<br />
cancel_all_btn.disabled&nbsp;=&nbsp;true;<br />
}<br />
if(&nbsp;(checked_count&nbsp;+&nbsp;1)&nbsp;==&nbsp;viewTable.rows.length&nbsp;)&nbsp;{<br />
select_all_btn.disabled&nbsp;=&nbsp;true;<br />
}&nbsp;else&nbsp;{<br />
select_all_btn.disabled&nbsp;=&nbsp;false;<br />
}<br />
<br />
if(&nbsp;checked_count&nbsp;==&nbsp;1&nbsp;)&nbsp;{<br />
modify_btn.disabled&nbsp;=&nbsp;false;<br />
modify_id.disabled&nbsp;=&nbsp;false;<br />
modify_name.disabled&nbsp;=&nbsp;false;<br />
modify_state.disabled&nbsp;=&nbsp;false;<br />
var&nbsp;id&nbsp;=&nbsp;getFirstCheckedLine();<br />
modify_id.value&nbsp;=&nbsp;viewTable.rows(id).cells(2).innerText;<br />
modify_name.value&nbsp;=&nbsp;viewTable.rows(id).cells(3).innerText;<br />
if(&nbsp;viewTable.rows(id).cells(1).innerText&nbsp;==&nbsp;"有效"&nbsp;)&nbsp;{<br />
modify_state.checked&nbsp;=&nbsp;true;<br />
}&nbsp;else&nbsp;{<br />
modify_state.checked&nbsp;=&nbsp;false;<br />
}<br />
}&nbsp;else&nbsp;{<br />
modify_btn.disabled&nbsp;=&nbsp;true;<br />
modify_id.disabled&nbsp;=&nbsp;true;<br />
modify_name.disabled&nbsp;=&nbsp;true;<br />
modify_state.disabled&nbsp;=&nbsp;true;<br />
modify_id.value="请选择一条规则";<br />
modify_name.value="请选择一条规则";<br />
}<br />
}<br />
<br />
function&nbsp;showPageInfo(){<br />
if(&nbsp;total_item.value&nbsp;==&nbsp;0&nbsp;)&nbsp;{<br />
total_page&nbsp;=&nbsp;1;<br />
}&nbsp;else&nbsp;{<br />
total_page&nbsp;=&nbsp;Math.floor((9&nbsp;+&nbsp;parseInt(total_item.value))&nbsp;/&nbsp;10);<br />
}<br />
var&nbsp;txt&nbsp;=&nbsp;"&nbsp;共"+total_item.value+"条记录";<br />
var&nbsp;prev_page&nbsp;=&nbsp;cur_page&nbsp;-&nbsp;1;<br />
var&nbsp;next_page&nbsp;=&nbsp;parseInt(cur_page)&nbsp;+&nbsp;1;<br />
if(&nbsp;cur_page&nbsp;&gt;&nbsp;1&nbsp;)&nbsp;{<br />
txt&nbsp;+=&nbsp;"&nbsp;&lt;input&nbsp;type='button'&nbsp;value='&lt;'&nbsp;onClick='gotoPage("&nbsp;+&nbsp;prev_page&nbsp;+&nbsp;")'/&gt;"<br />
}&nbsp;else&nbsp;{<br />
txt&nbsp;+=&nbsp;"&nbsp;&lt;input&nbsp;type='button'&nbsp;value='&lt;'&nbsp;onClick='gotoPage("&nbsp;+&nbsp;prev_page&nbsp;+&nbsp;")'&nbsp;disabled/&gt;"<br />
}<br />
if(&nbsp;cur_page&nbsp;&lt;&nbsp;total_page&nbsp;)&nbsp;{<br />
txt&nbsp;+=&nbsp;"&nbsp;&lt;input&nbsp;type='button'&nbsp;value='&gt;'&nbsp;onClick='gotoPage("&nbsp;+&nbsp;next_page&nbsp;+&nbsp;")'/&gt;"<br />
}&nbsp;else&nbsp;{<br />
txt&nbsp;+=&nbsp;"&nbsp;&lt;input&nbsp;type='button'&nbsp;value='&gt;'&nbsp;onClick='gotoPage("&nbsp;+&nbsp;next_page&nbsp;+&nbsp;")'&nbsp;disabled/&gt;"<br />
}<br />
<br />
txt&nbsp;+=&nbsp;"&nbsp;第&lt;input&nbsp;type='text'&nbsp;id='page_number'&nbsp;size='4'&nbsp;maxlength='4'&nbsp;value='"&nbsp;+&nbsp;cur_page&nbsp;+&nbsp;"'&nbsp;onBlur='gotoPage(this.value)'/&gt;页&nbsp;共"&nbsp;+&nbsp;total_page&nbsp;+&nbsp;"页";<br />
page_info.innerHTML&nbsp;=&nbsp;txt;<br />
//&nbsp;window.alert(txt);<br />
}<br />
<br />
function&nbsp;Transform(){<br />
var&nbsp;txt&nbsp;=&nbsp;document.getElementById("ename").value;<br />
var&nbsp;str&nbsp;=&nbsp;OutputDocument(txt);<br />
rule_list.innerHTML&nbsp;=&nbsp;str;<br />
checked_count&nbsp;=&nbsp;0;<br />
showPageInfo();<br />
changeState();<br />
//&nbsp;window.alert(str);<br />
}<br />
&lt;/script&gt;<br />
<br />
&lt;BODY&nbsp;onLoad="Transform()"&gt;<br />
<br />
&lt;table&nbsp;width="550"&nbsp;border="1"&nbsp;cellpadding="0"&nbsp;cellspacing="0"&nbsp;style="border-collapse:collapse;"&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;<br />
&lt;table&nbsp;width="100%"&nbsp;border="0"&nbsp;cellpadding="0"&nbsp;cellspacing="0"&nbsp;style="border-collapse:collapse;"&gt;<br />
&lt;TR&nbsp;height=5&gt;&lt;td&nbsp;colspan=10&nbsp;style="font-size:0px;"&gt;&lt;/td&gt;&lt;/TR&gt;<br />
&lt;TR&nbsp;height=25&gt;<br />
&lt;td&nbsp;colspan=3&nbsp;align=center&gt;事件名包含:&lt;/td&gt;<br />
&lt;td&nbsp;colspan=3&nbsp;align=center&gt;&lt;input&nbsp;type="text"&nbsp;value=""&nbsp;id="ename"&nbsp;size="35"&nbsp;maxlength="16"/&gt;&lt;/td&gt;<br />
&lt;td&nbsp;colspan=4&gt;&lt;input&nbsp;type="button"&nbsp;value="搜索"&nbsp;onClick="Transform()"/&gt;&lt;/td&gt;<br />
&lt;/TR&gt;<br />
&lt;TR&nbsp;height=1&gt;&lt;td&nbsp;colspan=10&nbsp;bgcolor=#2b7297&gt;&lt;/td&gt;&lt;/TR&gt;<br />
&lt;TR&nbsp;height=30&gt;<br />
&lt;td&nbsp;width=45&nbsp;align=center&gt;&lt;b&gt;添加&lt;/b&gt;&lt;/td&gt;<br />
&lt;td&nbsp;width=5&nbsp;align=center&gt;&lt;font&nbsp;color=gray&gt;|&lt;/font&gt;&lt;/td&gt;<br />
&lt;td&nbsp;width=50&nbsp;align=center&gt;事件号&lt;/td&gt;<br />
&lt;td&nbsp;width=55&nbsp;align=center&gt;&lt;input&nbsp;type="text"&nbsp;name="add_id"&nbsp;value=""&nbsp;size="5"&nbsp;maxlength="5"&nbsp;onkeyup="this.value=this.value.replace(/\D/g,'')"&nbsp;onafterpaste="this.value=this.value.replace(/\D/g,'')"&gt;&lt;/td&gt;<br />
&lt;td&nbsp;width=55&nbsp;align=center&gt;事件名&lt;/td&gt;<br />
&lt;td&nbsp;width=*&nbsp;align=center&gt;&lt;input&nbsp;type="text"&nbsp;name="add_name"&nbsp;maxlength="48"&nbsp;value=""&gt;&lt;/td&gt;<br />
&lt;td&nbsp;width=70&nbsp;align=center&gt;是否使用&lt;/td&gt;<br />
&lt;td&nbsp;width=30&nbsp;align=center&gt;<br />
&lt;input&nbsp;type='checkbox'&nbsp;name='add_state'&nbsp;checked&gt;<br />
&lt;/td&gt;&nbsp;<br />
&lt;td&nbsp;width=5&nbsp;align=center&gt;&lt;font&nbsp;color=gray&gt;|&lt;/font&gt;&lt;/td&gt;<br />
&lt;td&nbsp;width=70&nbsp;align=center&gt;&lt;input&nbsp;type="button"&nbsp;name="add_btn"&nbsp;value="确定"&nbsp;onClick="protectsubmit(1)"&gt;&lt;/td&gt;<br />
&lt;/TR&gt;<br />
&lt;TR&nbsp;height=1&gt;&lt;td&nbsp;colspan=10&nbsp;bgcolor=#2b7297&gt;&lt;/td&gt;&lt;/TR&gt;<br />
&lt;TR&nbsp;height=30&gt;<br />
&lt;td&nbsp;width=45&nbsp;align=center&gt;&lt;b&gt;修改&lt;/b&gt;&lt;/td&gt;<br />
&lt;td&nbsp;width=5&nbsp;align=center&gt;&lt;font&nbsp;color=gray&gt;|&lt;/font&gt;&lt;/td&gt;<br />
&lt;td&nbsp;width=50&nbsp;align=center&gt;事件号&lt;/td&gt;<br />
&lt;td&nbsp;width=55&nbsp;align=center&gt;<br />
&lt;input&nbsp;type="text"&nbsp;name="modify_id"&nbsp;value="&lt;请选择一条规则&gt;"&nbsp;size="5"&nbsp;maxlength="5"&nbsp;onkeyup="this.value=this.value.replace(/\D/g,'')"&nbsp;onafterpaste="this.value=this.value.replace(/\D/g,'')"&nbsp;disabled&gt;&lt;/td&gt;<br />
&lt;td&nbsp;width=55&nbsp;align=center&gt;事件名&lt;/td&gt;<br />
&lt;td&nbsp;width=*&nbsp;align=center&gt;<br />
&lt;input&nbsp;type="text"&nbsp;name="modify_name"&nbsp;maxlength="48"&nbsp;value="&lt;请选择一条规则&gt;"&nbsp;disabled&gt;&lt;/td&gt;<br />
&lt;td&nbsp;width=70&nbsp;align=center&gt;是否使用&lt;/td&gt;<br />
&lt;td&nbsp;width=30&nbsp;align=center&gt;<br />
&lt;input&nbsp;type='checkbox'&nbsp;name='modify_state'&nbsp;disabled&gt;<br />
&lt;/td&gt;&nbsp;<br />
&lt;td&nbsp;width=5&nbsp;align=center&gt;&lt;font&nbsp;color=gray&gt;|&lt;/font&gt;&lt;/td&gt;<br />
&lt;td&nbsp;width=70&nbsp;align=center&gt;&lt;input&nbsp;type="button"&nbsp;name="modify_btn"&nbsp;value="确定"&nbsp;onClick="protectsubmit(2)"&gt;&lt;/td&gt;<br />
&lt;/TR&gt;<br />
&lt;TR&nbsp;height=1&gt;&lt;td&nbsp;colspan=10&nbsp;bgcolor=#2b7297&gt;&lt;/td&gt;&lt;/TR&gt;<br />
&lt;TR&nbsp;height=30&gt;<br />
&lt;td&nbsp;colspan=5&nbsp;align=left&nbsp;class=tablefont&gt;&lt;/td&gt;<br />
&lt;td&nbsp;align=right&gt;&lt;input&nbsp;type="button"&nbsp;name="select_all_btn"&nbsp;value="全部选择"&nbsp;onClick="protectsubmit(4)"&gt;&lt;/td&gt;<br />
&lt;td&nbsp;colspan=2&nbsp;align=right&gt;&lt;input&nbsp;type="button"&nbsp;name="cancel_all_btn"&nbsp;value="全部不选"&nbsp;onClick="protectsubmit(5)"&nbsp;disabled&gt;&lt;/td&gt;<br />
&lt;td&nbsp;align=center&gt;&lt;/td&gt;<br />
&lt;td&nbsp;align=center&gt;&lt;input&nbsp;type="button"&nbsp;name="delete_btn"&nbsp;value="删除"&nbsp;onClick="protectsubmit(3)"&nbsp;disabled&gt;&lt;/td&gt;<br />
&lt;/TR&gt;<br />
&lt;TR&nbsp;height=30&gt;&lt;td&nbsp;colspan=4&gt;规则列表&lt;/td&gt;&lt;TD&nbsp;colspan=6&nbsp;align=right&gt;&lt;div&nbsp;id="page_info"&nbsp;name="page_info"/&gt;&lt;/TR&gt;<br />
&lt;TR&gt;<br />
&lt;TD&nbsp;colspan=10&gt;&lt;div&nbsp;id="rule_list"&nbsp;name="rule_list"/&gt;&lt;/TD&gt;<br />
&lt;/TR&gt;<br />
&lt;TR&nbsp;height=5&gt;&lt;td&nbsp;colspan=10&gt;&lt;/td&gt;&lt;/TR&gt;<br />
&lt;/table&gt;<br />
&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
<br />
&lt;/BODY&gt;<br />
&lt;/HTML&gt;<br />
<br />
<br />
rule.xml<br />
============<br />
&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;<br />
&lt;?xml:stylesheet&nbsp;type="text/xsl"&nbsp;href="rule.xsl"?&gt;<br />
&lt;rules&gt;<br />
&lt;rule&gt;<br />
&lt;event&gt;<br />
&lt;id&gt;10001&lt;/id&gt;<br />
&lt;name&gt;TFTP下载文件&lt;/name&gt;<br />
&lt;/event&gt;<br />
&lt;enable&gt;false&lt;/enable&gt;<br />
&lt;/rule&gt;<br />
&lt;rule&gt;<br />
&lt;event&gt;<br />
&lt;id&gt;10002&lt;/id&gt;<br />
&lt;name&gt;TFTP上传文件&lt;/name&gt;<br />
&lt;/event&gt;<br />
&lt;enable&gt;false&lt;/enable&gt;<br />
&lt;/rule&gt;<br />
&lt;rule&gt;<br />
&lt;event&gt;<br />
&lt;id&gt;10003&lt;/id&gt;<br />
&lt;name&gt;telnet登录成功&lt;/name&gt;<br />
&lt;/event&gt;<br />
&lt;enable&gt;false&lt;/enable&gt;<br />
&lt;/rule&gt;<br />
<br />
&lt;/rules&gt;<br />
<br />
rule.xsl<br />
=============<br />
&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;<br />
&lt;xsl:stylesheet&nbsp;version="1.0"&nbsp;xmlns:xsl="<a href="http://www.w3.org/1999/XSL/Transform" target="_blank">http://www.w3.org/1999/XSL/Transform</a>"&gt;<br />
&lt;xsl:strip-space&nbsp;elements="*"/&gt;<br />
&lt;xsl:output&nbsp;method=&nbsp;"html"/&gt;<br />
&lt;xsl:param&nbsp;name="ename"&gt;undefined&lt;/xsl:param&gt;<br />
&lt;xsl:param&nbsp;name="startno"&gt;undefined&lt;/xsl:param&gt;<br />
&lt;xsl:param&nbsp;name="endno"&gt;undefined&lt;/xsl:param&gt;<br />
<br />
&lt;xsl:template&nbsp;match="/"&gt;<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;xsl:apply-templates&nbsp;select="rules"/&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;xsl:template&nbsp;match="rules"&gt;<br />
&lt;input&nbsp;type="hidden"&nbsp;name="total_item"&gt;<br />
&lt;xsl:attribute&nbsp;name="value"&gt;&lt;xsl:value-of&nbsp;select="count(rule[contains(event/name,&nbsp;$ename)])"/&gt;&lt;/xsl:attribute&gt;<br />
&lt;/input&gt;<br />
&lt;TABLE&nbsp;id="viewTable"&nbsp;name="viewTable"&nbsp;width="100%"&nbsp;border="1"&nbsp;bordercolor="#85979f"&nbsp;cellSpacing="0"&nbsp;cellPadding="0"&nbsp;style="border-collapse:collapse;"&gt;<br />
&lt;tr&nbsp;height="25"&gt;<br />
&lt;TD&nbsp;width="10%"&nbsp;align="center"&gt;选择&lt;/TD&gt;<br />
&lt;TD&nbsp;width="10%"&nbsp;align="center"&gt;状态&lt;/TD&gt;<br />
&lt;TD&nbsp;width="10%"&nbsp;align="center"&gt;事件号&lt;/TD&gt;<br />
&lt;TD&nbsp;width="*"&nbsp;align="center"&gt;事件名&lt;/TD&gt;<br />
&lt;/tr&gt;<br />
<br />
&lt;xsl:for-each&nbsp;select='rule[contains(event/name,&nbsp;$ename)]'&gt;<br />
&lt;xsl:sort&nbsp;select="event/id"/&gt;<br />
&lt;xsl:if&nbsp;test="position()&gt;&nbsp;$startno&nbsp;and&nbsp;position()&lt;=&nbsp;$endno"&gt;<br />
&lt;tr&gt;<br />
&lt;td&nbsp;align="center"&gt;<br />
&lt;input&nbsp;type='checkbox'&gt;<br />
&lt;xsl:attribute&nbsp;name="name"&gt;viewchk_&lt;xsl:value-of&nbsp;select="event/id"/&gt;&lt;/xsl:attribute&gt;<br />
&lt;xsl:attribute&nbsp;name="value"&gt;&lt;xsl:value-of&nbsp;select="event/id"/&gt;&lt;/xsl:attribute&gt;<br />
&lt;xsl:attribute&nbsp;name="onClick"&gt;checkOVItem(&lt;xsl:value-of&nbsp;select="event/id"/&gt;)&lt;/xsl:attribute&gt;<br />
&lt;/input&gt;<br />
&lt;/td&gt;<br />
&lt;xsl:choose&gt;<br />
&lt;xsl:when&nbsp;test="enable[.&nbsp;=&nbsp;'true']"&gt;<br />
&lt;td&nbsp;align="center"&gt;有效&lt;/td&gt;<br />
&lt;/xsl:when&gt;<br />
&lt;xsl:otherwise&gt;<br />
&lt;td&nbsp;align="center"&gt;禁用&lt;/td&gt;<br />
&lt;/xsl:otherwise&gt;<br />
&lt;/xsl:choose&gt;<br />
&lt;td&nbsp;align="center"&gt;&lt;xsl:value-of&nbsp;select="event/id"/&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;xsl:value-of&nbsp;select="event/name"/&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/xsl:if&gt;<br />
&lt;/xsl:for-each&gt;<br />
&lt;/TABLE&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;/xsl:stylesheet&gt;<br />
 <img src ="http://www.blogjava.net/feingto/aggbug/171559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2007-12-29 15:44 <a href="http://www.blogjava.net/feingto/archive/2007/12/29/171559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js　1.4版开发者手册(强烈推荐) </title><link>http://www.blogjava.net/feingto/archive/2007/12/29/171538.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Sat, 29 Dec 2007 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2007/12/29/171538.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/171538.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2007/12/29/171538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/171538.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/171538.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: .reference table{border:1px dashed darkblue;} .reference th{border:1px dashed darkblue;color:white;background-color:darkblue;}  .reference td{border:1px dashed darkblue;corlor:black;background-color:w...&nbsp;&nbsp;<a href='http://www.blogjava.net/feingto/archive/2007/12/29/171538.html'>阅读全文</a><img src ="http://www.blogjava.net/feingto/aggbug/171538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feingto/" target="_blank">feingto</a> 2007-12-29 14:59 <a href="http://www.blogjava.net/feingto/archive/2007/12/29/171538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>