﻿<?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-龙行天下-随笔分类-Ajax、JAVASCRIPT </title><link>http://www.blogjava.net/feingto/category/28515.html</link><description>&amp;nbsp;&amp;nbsp;政  博</description><language>zh-cn</language><lastBuildDate>Wed, 09 Jan 2008 15:15:49 GMT</lastBuildDate><pubDate>Wed, 09 Jan 2008 15:15:49 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>0</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>0</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>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><item><title>showModalDialog/showModelessDialog实例,父窗口向子窗口传递值,子窗口设置父窗口的值,子窗口关闭的时候返回值到父窗口.关闭刷新父窗口</title><link>http://www.blogjava.net/feingto/archive/2007/12/29/171522.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Sat, 29 Dec 2007 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2007/12/29/171522.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/171522.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2007/12/29/171522.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/171522.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/171522.html</trackback:ping><description><![CDATA[<div class="postTitle">下面是showModalDialog/showModelessDialog使用例子,父窗口向子窗口传递值,子窗口设置父窗口的值,子窗口关闭的时候返回值到父窗口.关闭刷新父窗口,希望对象我这样的WEB开发的菜鸟有所帮助.<br />
<span style="color: red"><strong><br />
(一)showModalDialog使用例子,父窗口向子窗口传递值,子窗口设置父窗口的值,子窗口关闭的时候返回值到父窗口.</strong></span> <br />
<br />
<span style="color: red">farther.html</span> <br />
--------------------------- <br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />
&lt;HTML&gt; <br />
&lt;HEAD&gt; <br />
&lt;TITLE&gt; New Document &lt;/TITLE&gt; <br />
&lt;META NAME="Generator" CONTENT="EditPlus"&gt; <br />
&lt;META NAME="Author" CONTENT=""&gt; <br />
&lt;META NAME="Keywords" CONTENT=""&gt; <br />
&lt;META NAME="Description" CONTENT=""&gt; <br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
function openChild(){ </div>
<div class="postText">
<p>var k = window.showModalDialog("child.html",window,"dialogWidth:335px;status:no;dialogHeight:300px"); <br />
if(k != null) <br />
document.getElementById("txt11").value = k; <br />
} <br />
//--&gt; <br />
&lt;/script&gt; <br />
&lt;/HEAD&gt; </p>
<p>&lt;BODY&gt; <br />
&lt;br&gt;传递到父窗口的值:&lt;input id="txt9" type="text" value="3333333333333"&gt;&lt;br&gt; <br />
返回的值:&lt;input id="txt11" type="text"&gt;&lt;br&gt; <br />
子窗口设置的值:&lt;input id="txt10" type="text"&gt;&lt;br&gt; </p>
<p><br />
&lt;input type ="button" value="openChild" onclick="openChild()"&gt; <br />
&lt;/BODY&gt; <br />
&lt;/HTML&gt; <br />
--------------------------------------------------------------- <br />
<span style="color: red">child.html</span> <br />
-------- <br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />
&lt;HTML&gt; <br />
&lt;HEAD&gt; <br />
&lt;TITLE&gt; New Document &lt;/TITLE&gt; <br />
&lt;META NAME="Generator" CONTENT="EditPlus"&gt; <br />
&lt;META NAME="Author" CONTENT=""&gt; <br />
&lt;META NAME="Keywords" CONTENT=""&gt; <br />
&lt;META NAME="Description" CONTENT=""&gt; <br />
&lt;meta http-equiv="Expires" CONTENT="0"&gt; <br />
&lt;meta http-equiv="Cache-Control" CONTENT="no-cache"&gt; <br />
&lt;meta http-equiv="Pragma" CONTENT="no-cache"&gt; </p>
<p>&lt;/HEAD&gt;</p>
<p>&lt;BODY&gt; <br />
&lt;br&gt;父窗口传递来的值:&lt;input id="txt0" type="text"&gt;&lt;br&gt; <br />
输入要设置父窗口的值:&lt;input id="txt1" type="text"&gt;&lt;input type ="button" value="设置父窗口的值" onclick="setFather()"&gt;&lt;br&gt; <br />
输入返回的值:&lt;input id="txt2" type="text"&gt;&lt;input type ="button" value="关闭切返回值" onclick="retrunValue()"&gt; <br />
&lt;input type ="button" value="关闭刷新父窗口" onclick=""&gt; </p>
<p>&lt;/BODY&gt; <br />
&lt;/HTML&gt; </p>
<p>&lt;script language=javascript&gt; <br />
&lt;!-- <br />
var k=window.dialogArguments; <br />
//获得父窗口传递来的值 <br />
if(k!=null) <br />
&nbsp;{ <br />
&nbsp;document.getElementById("txt0").value = k.document.getElementById("txt9").value; <br />
&nbsp;} <br />
&nbsp;//设置父窗口的值 <br />
function setFather() <br />
{ <br />
&nbsp;k.document.getElementById("txt10").value = document.getElementById("txt1").value <br />
} <br />
//设置返回到父窗口的值 <br />
function retrunValue() <br />
{ <br />
var s = document.getElementById("txt2").value; <br />
window.returnValue=s; <br />
window.close(); <br />
} <br />
//--&gt; <br />
&lt;/script&gt; <br />
<br />
---------------------------- <br />
<span style="color: red">说明:</span> <br />
由于showModalDialog缓存严重,下面是在子窗口取消客户端缓存的设置.也可以在服务器端取消缓存,参考: <br />
<a href="http://adandelion.cnblogs.com/articles/252137.html"><font color="#000080">http://adandelion.cnblogs.com/articles/252137.html</font></a> <br />
&lt;meta http-equiv="Expires" CONTENT="0"&gt; <br />
&lt;meta http-equiv="Cache-Control" CONTENT="no-cache"&gt; <br />
&lt;meta http-equiv="Pragma" CONTENT="no-cache"&gt; <br />
------------------------------------------------------------------------------------------------------------------------ <br />
<span style="color: #000000"><span style="color: #ff0000"><span style="color: #ff0000"><strong>(<span style="color: #ff0000">二)下面是关闭刷新父窗口的例</span>子</strong></span></span> <br />
<br />
<span style="color: #ff0000">farther.html</span> <br />
--------------------------- <br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />
&lt;HTML&gt; <br />
&lt;HEAD&gt; <br />
&lt;TITLE&gt; New Document &lt;/TITLE&gt; <br />
&lt;META NAME="Generator" CONTENT="EditPlus"&gt; <br />
&lt;META NAME="Author" CONTENT=""&gt; <br />
&lt;META NAME="Keywords" CONTENT=""&gt; <br />
&lt;META NAME="Description" CONTENT=""&gt; <br />
&lt;script language="javascript"&gt; <br />
&lt;!-- <br />
function openChild() <br />
{</span> </p>
<p><span style="color: #000000">&nbsp;var k = window.showModalDialog("child.html",window,"dialogWidth:335px;status:no;dialogHeight:300px"); <br />
&nbsp;if(k == 1)//判断是否刷新 <br />
&nbsp;{ <br />
&nbsp;&nbsp;alert('刷新'); <br />
&nbsp;&nbsp;window.location.reload(); <br />
&nbsp;} <br />
} <br />
//--&gt; <br />
&lt;/script&gt; <br />
&lt;/HEAD&gt;</span> </p>
<p><span style="color: #000000">&lt;BODY&gt; <br />
&lt;br&gt;传递到父窗口的值:&lt;input id="txt9" type="text" value="3333333333333"&gt;&lt;br&gt; <br />
&lt;input type ="button" value="openChild" onclick="openChild()"&gt; <br />
&lt;/BODY&gt; <br />
&lt;/HTML&gt; <br />
---------------------------------------------------- <br />
<span style="color: #ff0000">child.html</span> <br />
-------- <br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; <br />
&lt;HTML&gt; <br />
&lt;HEAD&gt; <br />
&lt;TITLE&gt; New Document &lt;/TITLE&gt; <br />
&lt;META NAME="Generator" CONTENT="EditPlus"&gt; <br />
&lt;META NAME="Author" CONTENT=""&gt; <br />
&lt;META NAME="Keywords" CONTENT=""&gt; <br />
&lt;META NAME="Description" CONTENT=""&gt; <br />
&lt;meta http-equiv="Expires" CONTENT="0"&gt; <br />
&lt;meta http-equiv="Cache-Control" CONTENT="no-cache"&gt; <br />
&lt;meta http-equiv="Pragma" CONTENT="no-cache"&gt; </span></p>
<p><span style="color: #000000">&lt;/HEAD&gt;</span> </p>
<p><span style="color: #000000">&lt;BODY&gt; <br />
&lt;br&gt;父窗口传递来的值:&lt;input id="txt0" type="text"&gt;&lt;br&gt;</span> </p>
<p><span style="color: #000000">&lt;input type ="button" value="关闭刷新父窗口" onclick="winClose(1)"&gt; <br />
&lt;input type ="button" value="关闭不刷新父窗口" onclick="winClose(0)"&gt;</span> </p>
<p><span style="color: #000000">&lt;/BODY&gt; <br />
&lt;/HTML&gt;</span> </p>
<p><span style="color: #000000">&lt;script language=javascript&gt; <br />
&lt;!-- <br />
var k=window.dialogArguments; <br />
//获得父窗口传递来的值 <br />
if(k!=null) <br />
&nbsp;{ <br />
&nbsp;document.getElementById("txt0").value = k.document.getElementById("txt9").value; <br />
&nbsp;}</span> </p>
<span style="color: #000000">
<p>//关闭窗口返回是否刷新的参数. <br />
function winClose(isRefrash) <br />
{ </p>
<p>window.returnValue=isRefrash; <br />
window.close(); <br />
} <br />
//--&gt; <br />
&lt;/script&gt; </p>
<p>-------------------------- <br />
<span style="color: red">说明</span> <br />
1.下面是取消客户端缓存的: <br />
&lt;meta http-equiv="Expires" CONTENT="0"&gt; <br />
&lt;meta http-equiv="Cache-Control" CONTENT="no-cache"&gt; <br />
&lt;meta http-equiv="Pragma" CONTENT="no-cache"&gt; <br />
也可以在服务器端取消缓存,参考: <br />
<a href="http://adandelion.cnblogs.com/articles/252137.html"><font color="#000080">http://adandelion.cnblogs.com/articles/252137.html</font></a> </p>
<p>2.向父窗口传递阐述在ASP.NET中也可以是用aaa.aspx?id=1的方式传递. <br />
<br />
3.不刷新父窗口的话在父窗口中直接这样一来设置可以. <br />
&lt;script&gt; <br />
window.showModalDialog("child.html",window,"dialogWidth:335px;status:no;dialogHeight:300px"); <br />
&lt;/script&gt; <br />
4.在子窗口中若要提交页面的话要加入:,这样就不会打开新窗口了.<br />
&lt;head&gt;<br />
&lt;base target="_self"&gt;<br />
&lt;/HEAD&gt;<br />
<br />
<span style="color: red">本文参考了:<a href="http://dev.csdn.net/develop/article/15/15113.shtm"><font color="#000080">http://dev.csdn.net/develop/article/15/15113.shtm</font></a>&nbsp;,里面有showModalDialog/showModelessDialog的详细使用说明</span></p>
</span></div>
 <img src ="http://www.blogjava.net/feingto/aggbug/171522.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:33 <a href="http://www.blogjava.net/feingto/archive/2007/12/29/171522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>制作Javascript弹出窗口技巧九则 </title><link>http://www.blogjava.net/feingto/archive/2007/12/29/171516.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Sat, 29 Dec 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/feingto/archive/2007/12/29/171516.html</guid><wfw:comment>http://www.blogjava.net/feingto/comments/171516.html</wfw:comment><comments>http://www.blogjava.net/feingto/archive/2007/12/29/171516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feingto/comments/commentRss/171516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feingto/services/trackbacks/171516.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;经常上网的朋友可能会到过这样一些网站，一进入首页立刻会弹出一个窗口，或者按一个连接或按钮弹出，通常在这个窗口里会显示一些注意事项、版权信 息、警告、欢迎光顾之类的话或者作者想要特别提示的信息。其实制作这样的页面效果非常的容易，只要往该页面的HTML里加入几段Javascript代码 即可实现。下面俺就带您剖析它的奥秘。
<p><strong>　　1、最基本的弹出窗口代码 <br />
</strong>　　其实代码非常简单： <br />
　　&lt; SCRIPT LANGUAGE="javascript"&gt;<br />
　　&lt; !--<br />
　　window.open ("page.html")<br />
　　--&gt;<br />
　　&lt; /SCRIPT&gt; <br />
　　因为这是一段Javascript代码，所以它们应该放在&lt; SCRIPT LANGUAGE="javascript"&gt;之间。 &lt; !-- 和 --&gt;是对一些版本低的浏览器起作用，在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。 <br />
　　window.open ("page.html") 用于控制弹出新的窗口page.html，如果page.html不与主窗口在同一路径下，前面应写明路径，绝对路径(http://)和相对路径(../)均可。 <br />
　　用单引号和双引号都可以，只是不要混用。 <br />
　　这一段代码可以加入HTML的任意位置，&lt; head&gt;和&lt; /head&gt;之间可以，&lt; body&gt;间&lt; /body&gt;也可以，越前越早执行，尤其是页面代码长，又想使页面早点弹出就尽量往前放。 也可以，越前越早执行，尤其是页面代码长，又想使页面早点弹出就尽量往前放。 </p>
<p><strong>　　2、经过设置后的弹出窗口</strong> <br />
　　下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。我们来定制这个弹出的窗口的外观，尺寸大小，弹出的位置以适应该页面的具体情况。 <br />
　　&lt; SCRIPT LANGUAGE="javascript"&gt;<br />
　　&lt; !--<br />
　　window.open ("page.html", "newwindow", "height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no")<br />
　　//写成一行<br />
　　--&gt;<br />
　　&lt; /SCRIPT&gt; <br />
　　参数解释： <br />
　　&lt; SCRIPT LANGUAGE="javascript"&gt; js脚本开始；<br />
　　window.open 弹出新窗口的命令；<br />
　　"page.html" 弹出窗口的文件名；<br />
　　"newwindow" 弹出窗口的名字（不是文件名），非必须，可用空"代替；<br />
　　height=100 窗口高度；<br />
　　width=400 窗口宽度；<br />
　　top=0 窗口距离屏幕上方的象素值；<br />
　　left=0 窗口距离屏幕左侧的象素值；<br />
　　toolbar=no 是否显示工具栏，yes为显示；<br />
　　menubar，scrollbars 表示菜单栏和滚动栏。<br />
　　resizable=no 是否允许改变窗口大小，yes为允许；<br />
　　location=no 是否显示地址栏，yes为允许；<br />
　　status=no 是否显示状态栏内的信息（通常是文件已经打开），yes为允许；<br />
　　&lt; /SCRIPT&gt; js脚本结束 </p>
<p><strong>　　3、用函数控制弹出窗口</strong> <br />
　　下面是一个完整的代码： <br />
　　&lt; html&gt;<br />
　　&lt; head&gt;<br />
　　&lt; script LANGUAGE="JavaScript"&gt;<br />
　　&lt; !--<br />
　　function openwin() {<br />
　　window.open ("page.html", "newwindow", "height=100, width=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")<br />
　　//写成一行<br />
　　}<br />
　　//--&gt;<br />
　　&lt; /script&gt;<br />
　　&lt; /head&gt;<br />
　　&lt; body onload="openwin()"&gt; <br />
　　...任意的页面内容... <br />
　　&lt; /body&gt;<br />
　　&lt; /html&gt;<br />
　　这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。<br />
　　怎么调用呢？<br />
　　方法一：&lt; body onload="openwin()"&gt; 浏览器读页面时弹出窗口；<br />
　　方法二：&lt; body onunload="openwin()"&gt; 浏览器离开页面时弹出窗口；<br />
　　方法三：用一个连接调用：&lt; a href="#" onclick="openwin()"&gt;打开一个窗口&lt; /a&gt;<br />
　　注意：使用的"#"是虚连接。<br />
　　方法四：用一个按钮调用：&lt; input type="button" onclick="openwin()" value="打开窗口"&gt; </p>
<p><strong>　　4、同时弹出2个窗口</strong> <br />
　　对源代码稍微改动一下：<br />
　　&lt; script LANGUAGE="JavaScript"&gt;<br />
　　&lt; !--<br />
　　function openwin() {<br />
　　window.open ("page.html", "newwindow", "height=100, width=100, top=0, left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")<br />
　　//写成一行<br />
　　window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")<br />
　　//写成一行<br />
　　}<br />
　　//--&gt;<br />
　　&lt; /script&gt;<br />
　　为避免弹出的2个窗口覆盖，用top和left控制一下弹出的位置不要相互覆盖即可。最后用上面说过的四种方法调用即可。<br />
　　注意：2个窗口的name(newwindows和newwindow2)不要相同，或者干脆全部为空。OK？</p>
<p><strong>　　5、主窗口打开文件1.htm，同时弹出小窗口page.html</strong><br />
　　如下代码加入主窗口&lt; head&gt;区：<br />
　　&lt; script language="javascript"&gt;<br />
　　&lt; !--<br />
　　function openwin() {<br />
　　window.open("page.html","","width=200,height=200")<br />
　　}<br />
　　//--&gt;<br />
　　&lt; /script&gt;<br />
　　加入&lt; body&gt;区：<br />
　　&lt; a href="1.htm" onclick="openwin()"&gt;open&lt; /a&gt;即可</p>
<p><strong>　　6、弹出的窗口之定时关闭控制</strong> <br />
　　下面我们再对弹出的窗口进行一些控制，效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中，可不是主页面中，否则...)，让它10秒后自动关闭是不是更酷了？ <br />
　　首先，将如下代码加入page.html文件的&lt; head&gt;区：<br />
　　&lt; script language="JavaScript"&gt;<br />
　　function closeit() {<br />
　　setTimeout("self.close()",10000) //毫秒<br />
　　}<br />
　　&lt; /script&gt;<br />
　　然后，再用&lt; body onload="closeit()"&gt; 这一句话代替page.html中原有的&lt; BODY&gt;这一句就可以了。(这一句话千万不要忘记写啊！这一句的作用是调用关闭窗口的代码，10秒钟后就自行关闭该窗口。) </p>
<p><strong>　　7、在弹出窗口中加上一个关闭按钮</strong> <br />
　　&lt; FORM&gt;<br />
　　&lt; INPUT TYPE="BUTTON" VALUE="关闭" onClick="window.close()"&gt;<br />
　　&lt; /FORM&gt; <br />
　　呵呵，现在更加完美了！ </p>
<p><strong>　　8、内包含的弹出窗口-－－一个页面两个窗口</strong> <br />
　　上面的例子都包含两个窗口，一个是主窗口，另一个是弹出的小窗口。通过下面的例子，你可以在一个页面内完成上面的效果。 <br />
　　&lt; html&gt;<br />
　　&lt; head&gt;<br />
　　&lt; SCRIPT LANGUAGE="JavaScript"&gt;<br />
　　function openwin()<br />
　　{<br />
　　OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no");<br />
　　//写成一行<br />
　　OpenWindow.document.write("&lt; TITLE&gt;例子&lt; /TITLE&gt;")<br />
　　OpenWindow.document.write("&lt; BODY BGCOLOR=#ffffff&gt;")<br />
　　OpenWindow.document.write("&lt; h1&gt;Hello!&lt; /h1&gt;")<br />
　　OpenWindow.document.write("New window opened!")<br />
　　OpenWindow.document.write("&lt; /BODY&gt;")<br />
　　OpenWindow.document.write("&lt; /HTML&gt;")<br />
　　OpenWindow.document.close()<br />
　　}<br />
　　&lt; /SCRIPT&gt;<br />
　　&lt; /head&gt;<br />
　　&lt; body&gt;<br />
　　&lt; a href="#" onclick="openwin()"&gt;打开一个窗口&lt; /a&gt;<br />
　　&lt; input type="button" onclick="openwin()" value="打开窗口"&gt;<br />
　　&lt; /body&gt;<br />
　　&lt; /html&gt;<br />
　　看看OpenWindow.document.write()里面的代码不就是标准的HTML吗？只要按照格式写更多的行即可。千万注意多一个标签或少一个标签就会出现错误。记得用OpenWindow.document.close()结束啊。 </p>
<p><strong>　　9、终极应用--弹出的窗口之Cookie控制</strong> <br />
　　回想一下，上面的弹出窗口虽然酷，但是有一点小毛病(沉浸在喜悦之中，一定没有发现吧？)比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页)，那么每次刷新这个页面，窗口都会弹出一次，是不是非常烦人？:-( <br />
　　有解决的办法吗？当然有！我们使用cookie来控制一下就可以了。首先，将如下代码加入主页面HTML的&lt; HEAD&gt;区：<br />
　　&lt; script&gt;<br />
　　function openwin(){<br />
　　window.open("page.html","","width=200,height=200")<br />
　　}<br />
　　function get_cookie(Name) {<br />
　　var search = Name + "=" var returnvalue = "";<br />
　　if (document.cookie.length &gt; 0) {<br />
　　offset = document.cookie.indexOf(search)<br />
　　if (offset != -1) {<br />
　　offset += search.length<br />
　　end = document.cookie.indexOf(";", offset);<br />
　　if (end == -1)<br />
　　end = document.cookie.length;<br />
　　returnvalue=unescape(document.cookie.substring(offset, end))<br />
　　}<br />
　　}<br />
　　return returnvalue;<br />
　　}<br />
　　function loadpopup(){<br />
　　if (get_cookie("popped")=="){<br />
　　openwin()<br />
　　document.cookie="popped=yes"<br />
　　}<br />
　　}<br />
　　&lt; /script&gt;<br />
　　然后，用&lt; body onload="loadpopup()"&gt;（注意不是openwin而是loadpop啊！）替换主页面中原有的&lt; BODY&gt;这一句即可。你可以试着刷新一下这个页面或重新进入该页面，窗口再也不会弹出了。真正的Pop-Only-Once！<br />
　　写到这里弹出窗口的制作和应用技巧基本上算是完成了，俺也累坏了，一口气说了这么多，希望对正在制作网页的朋友有所帮助俺就非常欣慰了。 <br />
　　需要注意的是，JS脚本中的的大小写最好前后保持一致。&nbsp;</p>
 <img src ="http://www.blogjava.net/feingto/aggbug/171516.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:24 <a href="http://www.blogjava.net/feingto/archive/2007/12/29/171516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>