ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品一区在线,日韩在线一区二区三区免费视频,日本久久一区二区http://www.aygfsteel.com/feingto/  æ”? å?/description>zh-cnWed, 09 Jul 2025 14:44:02 GMTWed, 09 Jul 2025 14:44:02 GMT60FckEditor中文配置手册详细说明http://www.aygfsteel.com/feingto/archive/2008/01/09/173964.htmlfeingtofeingtoWed, 09 Jan 2008 04:52:00 GMThttp://www.aygfsteel.com/feingto/archive/2008/01/09/173964.htmlhttp://www.aygfsteel.com/feingto/comments/173964.htmlhttp://www.aygfsteel.com/feingto/archive/2008/01/09/173964.html#Feedback0http://www.aygfsteel.com/feingto/comments/commentRss/173964.htmlhttp://www.aygfsteel.com/feingto/services/trackbacks/173964.html åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
<script. type=”text/javascript” src=”FCKeditor/fckeditor.js”></scrÄ«pt>
<textarea name=”content” cols=”80″ rows=”4″>
</textarea>
<script. type=”text/javascript”>
var FCKeditor = new FCKeditor(”content”);
oFCKeditor.BasePath = “FCKeditor/”;
oFCKeditor.Height = 400;
oFCKeditor.ToolbarSet = “Default”;
oFCKeditor.ReplaceTextarea();
</script>
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
如果惌™¦ä½¿ç”¨ä»Žæ•°æ®åº“è¯ÀL¥çš„æ–‡æœ¬æ•°æ®æˆ–者是后台来自文äšgçš„txt/html文本数据ã€?
只要�
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
<textarea name=”content” cols=”80″ rows=”4″>
</textarea>
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
中加入自å·Þqš„æ˜„¡¤ºå†…容的formbean对应字段卛_¯
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
<textarea name=”content” cols=”80″ rows=”4″>
<c:out value=”${contentData}” />
</textarea>
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
˜q™æ ·å†…容ž®×ƒ¼šè¢«æ˜¾½Cºåœ¨FCKeditor¾~–辑框中了,点击提交按钮以后ž®±å¯ä»¥åœ¨åŽå°çš„相应java action中得到content参数中的内容ž®±æ˜¯™åµé¢ä¸ŠFCKeditor中的内容数据了。可以在struts/jsf中ä‹É用ã€?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
ç”׃ºŽ¾l™FCKeditor瘦èínåQŒæ‰€ä»¥å¸¸ä¼šæŠ¥¾~ºå°‘对象支持½{‰é”™è¯¯ï¼Œåªè¦åœ¨FCKeditor/editor/lang中加上相应的js语言文äšg卛_¯ã€‚如果加载页面失败(FCKeditor未定义)˜q˜æœ‰ä¸€ä¸ªå¯èƒ½å°±æ˜¯å¼•用FCKeditor/fckeditor.jsæ–‡äšg路径不对åQ?
关于FCKeditor瘦èín要点如下åQ?
1.ž®†FCKeditor目录下及子目录下所有以“_”下划¾U¿å¼€å¤´çš„æ–‡äšg夹删é™?
2.FCKeditor根目录下只保留fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xmlåQŒå…¶ä½™å…¨éƒ¨åˆ é™?
3.ž®†editor/filemanager/upload目录下文件及文äšgå¤Òޏ…½I?
4.ž®?editor/filemanager/browser/default/connectors/下的所有文件删é™?
5.˜q˜å¯ä»¥å°†editor/skins目录下的皮肤文äšg删除åQŒåªç•™ä¸‹default一套皮肤(如果你不需要换皮肤的话åQ?
6.˜q˜å¯ä»¥å°†editor/lang目录下文件删除,只保留en.js, fcklanguagemanager.js, zh-cn.js, zh.jsæ–‡äšg
7.如果你是使用javascrÄ«pt来调用加载FCKeditoråQŒé‚£ä¹ˆå°±ä¸éœ€è¦åœ¨web.xml中配¾|®fckeditorçš„tagæ–‡äšgã€?
8.˜q˜æœ‰ä¸€ä¸ªé—®é¢˜åˆšå¼€å§‹ä‹É用FCKeditorçš„äh叿€¼šé‡åˆ°ž®±æ€Žä¹ˆæŽ§åˆ¶å®ƒçš„toolbar的大ž®å’Œå…ƒç´ æŽ’列åQŒå…¶å®žå¾ˆ½Ž€å•ã€?
在fckconfig.js中用˜q™æ ·çš„æ ‡½{¾[]来划分每行的元素的多ž®‘,˜q™æ ·ž®±å¯ä»¥æŽ§åˆ¶toolbar的长短和大小了,具体½CÞZ¾‹å‚看åQšfckconfig.js中的toolbarset[”Default”]
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
用fckconfig.js中的一些选项来控制toolbarset中控件的功能åQŒå®žçŽ°åŠŸèƒ½è£å‰ªï¼š
1)åQšå–消超链接中的‹¹è§ˆæœåŠ¡å™¨å’Œä¸Šä¼ åŠŸèƒ½åQŒæ–¹æ³•如下:
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
FCKConfig.LinkBrowser = true;
FCKConfig.LinkUpload = true;
æ”¹äØ“åQ?
FCKConfig.LinkBrowser = false;
FCKConfig.LinkUpload = false;
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
2)åQšå–消图片链接中的浏览服务器和上传功能,æ–ÒŽ³•如下åQ?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
FCKConfig.ImageUpload = true;
FCKConfig.ImageBrowser = true;
æ”¹äØ“åQ?
FCKConfig.ImageUpload = false;
FCKConfig.ImageBrowser = false;
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
3)åQšDlg Button中取消高¾U§åŠŸèƒ½ï¼Œæ–ÒŽ³•如下åQ?
FCKConfig.LinkDlgHideAdvanced = false ;
FCKConfig.ImageDlgHideAdvanced = false ;
æ”¹äØ“åQ?
FCKConfig.ImageDlgHideAdvanced = true ;
FCKConfig.LinkDlgHideTarget = true ;
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
下一½‹‡ä»‹¾lFCKeditor的上传和‹¹è§ˆæœåŠ¡å™¨åŠŸèƒ½ï¼Œä»¥åŠå¦‚ä½•åœ¨é‡Œé¢å®žçŽ°åŠ¨æ€?
­‘…连接,转发到servlet¾lè¿‡filter以后去调用服务器的action
如何实现对应用户‹¹è§ˆè‡ªå·±çš„图片的列表实现åQ?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
FCKeditor集成java servlet可以实现文äšg的上传和服务器端列表è¯Õd–功能FCKeditor自己提供了两个servlet来分别实çŽîC¸Šä¼ æ–‡ä»¶åŠŸèƒ½ï¼Œå’Œè¯»å–æœåŠ¡å™¨ç«¯æ–‡ä»¶åˆ—è¡¨åŠŸèƒ½ï¼Œ˜q™ä¸¤ä¸ªservlet分别为:
com.fredck.FCKeditor.connector.ConnectorServletåQˆè¯»å–文件列表)
com.fredck.FCKeditor.uploader.SimpleUploaderServletåQˆå®žçŽ°æ–‡ä»¶ä¸Šä¼ ï¼‰
1.‹¹è§ˆæœåŠ¡å™¨ç«¯æ–‡äšg列表
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
web.xmlæ–‡äšg中,比如åQšConnectorServlet中的配置选项åQ?
<init-param>
<param-name>baseDir</param-name>
<param-value>/UserFiles/</param-value>
</init-param>
意思是在浏览服务器上的baseDir配置指定里面的所有文件及其目录结构列表�
如果你的baseDir没有配置åQŒConnectorž®†ä¼šè‡ªåŠ¨åˆ›å¾ä¸€ä¸ªé»˜è®¤çš„æ–‡äšgå¤?
UserFilesåQŒå¯¹åº”çš„ConnectorServlet中init()æ–ÒŽ³•中代码如下:
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
baseDir = getInitParameter(”baseDir”);
if (baseDir == null)
baseDir = “/UserFiles/”;
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
˜q˜æƒ³è¯´ä¸€ä¸‹çš„æ˜¯ï¼ŒFCKeditorçš„client调用serverçš„servletæ–ÒŽ³•采用的是Ajax思想来实现。当你点å‡ÀLµè§ˆæœåС噍(browser server)的时候就会触发一个异步的javascrÄ«pt + xmlhttp的调用响应,后台的servlet会去完成你要è¯äh±‚的事ä»Óž¼Œç„¶åŽæ•°æ®ä»¥xml方式˜q”回¾l™client来解析。很明显åQŒä½ è¦å®žçŽ°åŽ»æ•°æ®åº“æˆ–è€…å…¶ä»–çš„æ–‡äšg¾pȝ»Ÿè¯äh±‚列表åQŒä½ åªè¦ä¿®æ”¹
ConnectorServlet中两个私有方法:getFolders �getFiles
让它åŽÖM½ æŒ‡å®šçš„地方得到文件列表即可,˜q™æ ·ä½ çš„æ–‡äšg可以攑֜¨ä»ÖM½•你指定目录下。多说一句,很多人都想知道个人blog¾pȝ»Ÿä¸­æ€Žä¹ˆå®žçŽ°ä¸Šä¼ æ–‡äšg以后对应用户‹¹è§ˆè‡ªå·±çš„列表的åQŒæˆ‘的做法很½Ž€å•,建立你用户名的文件夹åQŒä½ ä¸Šä¼ åªèƒ½ä¸Šä¼ åˆîC½ çš„目录夹åQŒæµè§ˆå¯ä»¥é€šè¿‡½E‹åºæŒ‡å®š‹¹è§ˆå¯¹åº”用户下的文äšg夹即可,˜q™ä¸ªæ—¶å€™ä½ è¦ä¿®æ”¹Connectorservlet中的路径卛_¯åQ?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
2.­‘…连接重定位问题
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
FCKeditor可以插入­‘…连接,实现å¯ÒŽ–‡ä»¶çš„预览功能åQŒåªè¦æˆ‘们稍微改变我们可以ä‹ÉFCKeditor¾~–辑器支持对ä»ÀL„æ–‡äšg¾pȝ»Ÿä¸‹çš„ä»ÀL„æ–‡äšg的客æˆïL«¯‹¹è§ˆå’Œä¸‹è½½ä¿å­˜ï¼FCKeditor本来提供的是相对URL­‘…链接,只要我们修改ConnectorServlet中传递给客户端的地址的时候,把它改写成绝对URL然后再通过我们自己的filterçš„servlet实现重定向去一个下è½?‹¹è§ˆæ–‡äšgçš„strutsçš„actionæ–ÒŽ³•ž®±å¯ä»¥å®žçŽ°åœ¨å®¢æˆ·ç«¯å¯¹­‘…连接文件的下蝲和浏览!说一下具体做法吧åQ?
1)åQšä¿®æ”¹ConnectorServlet传递给客户端javascrÄ«ptçš„èµ\径,代码如下åQ?
String currentUrl = “http://” + request.getserver +request.getServerPort + request.getContextPath + resourcePath;
以上代码请在ConnectorServletçš„doGet()é‡Œé¢æ‹ÆD£…åQåœ¨è°ƒç”¨CreateCommonXml()¿Uæœ‰æ–ÒŽ³•的时候参æ•îC¼ å…¥ï¼š
myEl.setAttribute(”path”,currentPath);
myEl.setAttribute(”url”,currentUrl);
提醒一下resourcePath为在web.xml配置文äšg中ConnectorServlet中的一个初始化参数配置åQŒç­‰ä¸€ä¸‹åˆ©ç”¨filter实现对超˜qžæŽ¥çš„重定位ž®±æå–URL中的˜q™ä¸ªé…ç½®å‚数来判断,配置如下åQ?
<init-param>
<param-name>resourcePath</param-name>
<param-value>/fileSystem/</param-value>
</init-param>
2)åQšå¾ç«‹ä½ çš„filter servletåQŒå®žçް坹URLçš„æˆªèŽøP¼Œå¯¹ç¬¦åˆè¦æ±‚çš„URL˜q›è¡Œé‡å®šä½åˆ°ä½ çš„对应action中去卛_¯
3)åQšå®žçŽîC½ çš„对应action来实现文件的上传和下载功能即可!
4)åQšæ‰©å±•åŠŸèƒ½ï¼å®žçŽ°å¯¹URL的加密,对连接的URL中加上一串字½W¦ï¼Œæœ€åŽå‡ ä½ä½œä¸ºç®—法校验,对不½W¦åˆè¦æ±‚çš„URL˜qžæŽ¥,filterž®†ä¼šæ‹’绝重定位到指定action。此外利用自己写的扩展类˜q˜å¯ä»¥å®žçް坹­‘…连接的文äšg¾cÕdž‹˜q›è¡Œé™åˆ¶åQŒæ¯”如你只能­‘…连接JPG|GIF|DOC|TXT|HTML½{‰å‡ ¿UåŽ¾~€åçš„æ–‡äšgåQŒå¯¹å…¶ä»–æ–‡äšg即ä‹É你指定超˜qžæŽ¥ä¹Ÿè®©ä½ æµè§ˆå’Œä¸‹è²åQŒè¿™äº›éƒ½å¯ä»¥åœ¨web.xml中通过修改对应servlet的配¾|®æ–‡ä»¶çš„初始化参数实现ã€?
3.™åµé¢javascrÄ«pt修改
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
‹¹è§ˆæœåŠ¡å™¨çš„åŠŸèƒ½å¯¹åº”çš„html/javascrÄ«ptç›¸å…³çš„æ–‡ä»¶äØ“åQšbrowser.htmlå’Œfrmresourcelist.html对应你想传递的信息你可以append在文件名的字½W¦ä¸²åŽé¢åQŒåœ¨GetFileRowHtmlåQˆï¼‰çš„javascrÄ«pt函数中实现对文äšg名的截取åQŒè¿™æ ·client只会昄¡¤ºæ–‡äšg名,而你可以得到文äšg的数据库唯一标识åQŒä“Q何你惌™¦çš„信息你都可以通过修改ConnectorServlet中的¿Uæœ‰æ–ÒŽ³•getFiles()来实玎ͼŒåªè¦ä¿®æ”¹™åµé¢frmresurcelist.html中的GetFileRowHtmlåQˆï¼‰ä¸­ä¼ å…¥å˜é‡fileName卛_¯ã€‚ä½ ˜q˜å¯ä»¥åœ¨ç‚¹å‡»é€‰ä¸­æ–‡äšg的时候实çŽîC¸€ä¸ªä½ è‡ªå·±çš„Ajax调用åQŒä¸€åˆ‡å–决你的项目需要!
4.我不是一个javascrÄ«pt高手åQŒå…¶å®žå¦‚果我对javascrÄ«pt了解多一些也许对客户端的代码修改以后做出更眩的功能。可以更好的完成对FCKeditor裁剪ã€?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?
5.注意�
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?
无论怎么修改别äh的东西,请一定尊重开源精¼œžï¼
很多人配¾|®å¥½äº†FCKeditor的上传功能以后常会遇到xmlhttp request 404 error,后面是一串èµ\径,其实ž®±æ˜¯ä½ çš„servlet-mapping中的路径不对åQŒä½ åªè¦æŠŠxmlhttp request errot 404 后面跟的路径åQŒcopyåˆîC½ çš„web.xml中对应红色文字的位置åQŒå¦‚下:
<servlet-mapping>
<servlet-name>Connector</servlet-name>
<url-pattern>/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector</url-pattern>
</servlet-mapping>
别忘了SimpleUploaderçš„servletåQmapping也要做同æ ïLš„修改åQ?
˜q˜æœ‰ä¸€ä¸ªé”™è¯¯å°±æ˜¯http 500错误åQŒè¿™ä¸ªå¯èƒ½æ˜¯ä½ çš„URLè¯äh±‚不对åQŒåº”该和FCKeditor没关¾pȝš„!
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
fckconfig.js总配¾|®æ–‡ä»Óž¼Œå¯ç”¨è®°å½•本打开åQŒä¿®æ”¹åŽž®†æ–‡ä»¶å­˜ä¸ºutf-8 ¾~–码格式。找刎ͼš
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
FCKConfig.TabSpaces = 0;
æ”¹äØ“åQ?
FCKConfig.TabSpaces = 1;
卛_œ¨¾~–辑器域内可以ä‹É用Tabé”®ã€?
如果你的¾~–辑器还用在¾|‘站前台的话åQŒæ¯”如说用于留言本或是日记回复时åQŒé‚£ž®×ƒ¸å¾—不考虑安全了,
在前台千万不要ä‹É用Defaultçš„toolbaråQŒè¦ä¹ˆè‡ªå®šä¹‰ä¸€ä¸‹åŠŸèƒ½ï¼Œè¦ä¹ˆž®Þq”¨¾pȝ»Ÿå·²ç»å®šä¹‰å¥½çš„BasicåQ?
也就是基本的toolbaråQŒæ‰¾åˆŽÍ¼š
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
FCKConfig.ToolbarSets[”Basic”] = [
[’Bold’,'Italic’,'-’,'OrderedList’,'UnorderedList’,'-’,/*’Link’,*/’Unlink’,'-’,'Style’,'FontSize’,'TextColor’,'BGColor’,'-’,
‘Smiley’,'SpecialChar’,'Replace’,'Preview’] ];
˜q™æ˜¯æ”¹è¿‡çš„BasicåQŒæŠŠå›‘ÖƒåŠŸèƒ½åŽÀLމåQŒæŠŠæ·ÕdŠ é“¾æŽ¥åŠŸèƒ½åŽÀLމåQŒå› ä¸ºå›¾åƒå’Œé“¾æŽ¥å’Œflash和图像按钮添加功能都能让前台™å늛´æŽ¥è®¿é—®å’Œä¸Šä¼ æ–‡äšgåQ?fckeditor˜q˜æ”¯æŒç¼–辑域内的鼠标右键功能ã€?
FCKConfig.ContextMenu = [’Generic’,/*’Link’,*/’Anchor’,/*’Image’,*/’Flash’,'Select’,'Textarea’,'Checkbox’,'Radio’,'TextField’,'HiddenField’,
/*’ImageButton’,*/’Button’,'BulletedList’,'NumberedList’,'TableCell’,'Table’,'Form’];
˜q™ä¹Ÿæ˜¯æ”¹˜q‡çš„æŠŠé¼ æ ‡å³é”®çš„“链接、图像,FLASHåQŒå›¾åƒæŒ‰é’?#8221;功能都去掉ã€?
扑ֈ°åQ?
FCKConfig.FontNames = ‘Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana’;
加上几种我们常用的字�
FCKConfig.FontNames = ‘宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana’;
æ·ÕdŠ æ–‡äšg /TestFCKeditor/test.jsp:
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
<%@ page language=”java” import=”com.fredck.FCKeditor.*” %>
<%@ taglib uri=”/TestFCKeditor” prefix=”FCK” %>
<script. type=”text/javascript” src=”/TestFCKeditor/FCKeditor/fckeditor.js”></script>
<%–
三种æ–ÒŽ³•调用FCKeditor
1.FCKeditor自定义标½{?(必须加头文äšg <%@ taglib uri=”/TestFCKeditor” prefix=”FCK” %> )
2.script脚本语言调用 (必须引用 脚本文äšg <script. type=”text/javascript” src=”/TestFCKeditor/FCKeditor/fckeditor.js”></script> )
3.FCKeditor API 调用 (必须加头文äšg <%@ page language=”java” import=”com.fredck.FCKeditor.*” %> )
–%>
<%–
<form. action=”show.jsp” method=”post” target=”_blank”>
<FCK:editor id=”content” basePath=”/TestFCKeditor/FCKeditor/”
width=”700″ height=”500″ skinPath=”/TestFCKeditor/FCKeditor/editor/skins/silver/”
toolbarSet = “Default”>
内容
</FCK:editor>
<input type=”submit” value=”Submit”>
</form>
–%>
<form. action=”show.jsp” method=”post” target=”_blank”>
<table border=”0″ width=”700″>
<tr>
<td>
<textarea id=”content” name=”content” style=”WIDTH: 100%; HEIGHT: 400px”>input</textarea>
<script. type=”text/javascript”>
var FCKeditor = new FCKeditor(’content? ;
oFCKeditor.BasePath = “/TestFCKeditor/FCKeditor/” ;
oFCKeditor.Height = 400;
oFCKeditor.ToolbarSet = “Default” ;
oFCKeditor.ReplaceTextarea();
</script>
<input type=”submit” value=”Submit”>
</td>
</tr>
</table>
</form>
<%–
<form. action=”show.jsp” method=”post” target=”_blank”>
<%
FCKeditor oFCKeditor ;
oFCKeditor = new FCKeditor( request, “content” ) ;
oFCKeditor.setBasePath( “/TestFCKeditor/FCKeditor/” ) ;
oFCKeditor.setValue( “input” );
out.println( oFCKeditor.create() ) ;
%>
<br>
<input type=”submit” value=”Submit”>
</form>
–%>
æ·ÕdŠ æ–‡äšg/TestFCKeditor/show.jsp:
<%
String content = request.getParameter(”content”);
out.print(content);
%>
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
1、适时打开¾~–辑å™?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
很多时候,我们在打开™åµé¢çš„æ—¶å€™ä¸éœ€è¦ç›´æŽ¥æ‰“å¼€¾~–辑器,而在用到的时候才打开åQŒè¿™æ ·ä¸€æ¥æœ‰å¾ˆå¥½çš„用户体验,另一斚w¢å¯ä»¥æ¶ˆé™¤FCK在加载时寚w¡µé¢æ‰“开速度的媄响,点击“Open Editor”按钮后才打开¾~–辑器界面ã€?
实现原理åQ?
使用JAVASCRIPT版的FCKåQŒåœ¨™åµé¢åŠ è²æ—Óž¼ˆæœªæ‰“å¼€FCKåQ‰ï¼Œåˆ›å¾ä¸€ä¸ªéšè—çš„TextArea域,˜q™ä¸ªTextArea
çš„nameå’ŒID要和创徏的FCK实例名称一è‡ß_¼Œç„¶åŽç‚¹å‡»”Open Editor”按钮æ—Óž¼Œé€šè¿‡è°ƒç”¨ä¸€ŒDµå‡½æ•ŽÍ¼Œä½¿ç”¨
FCKçš„ReplaceTextarea()æ–ÒŽ³•来创建FCKeditoråQŒä»£ç å¦‚下:
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
<script. type=”text/javascript”>
<!–
function showFCK(){
var FCKeditor = new FCKeditor( ‘fbContent’ ) ;
oFCKeditor.BasePath = ‘/FCKeditor/’ ;
oFCKeditor.ToolbarSet = ‘Basic’ ;
oFCKeditor.Width = ‘100%’ ;
oFCKeditor.Height = ‘200′ ;
oFCKeditor.ReplaceTextarea() ;
}
//–>
</script>
<textarea name=”fbContent” id=”fbContent”></textarea>
2、ä‹É用FCKeditor çš?API
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?
FCKeditor¾~–è¾‘å™¨ï¼Œæä¾›äº†éžå¸æ€¸°å¯Œçš„APIåQŒç”¨äºŽç»™End User实现很多惌™¦å®šåˆ¶çš„功能,比如最基本的数据验证,如何在提交的时候用JS判断当前¾~–辑器区域内是否有内容,FCKçš„API提供了GetLength()æ–ÒŽ³•åQ?
再比如如何通过脚本向FCK里插入内容,使用InsertHTML()½{‰ï¼›
˜q˜æœ‰åQŒåœ¨ç”¨æˆ·å®šåˆ¶åŠŸèƒ½æ—Óž¼Œä¸­é—´æ­¥éª¤å¯èƒ½è¦æ‰§è¡ŒFCK的一些内嵌操作,那就用ExecuteCommand()æ–ÒŽ³•ã€?
详细的API列表åQŒè¯·æŸ¥çœ‹FCKeditorçš„Wiki。而常用的APIåQŒè¯·æŸ¥çœ‹FCK压羃包里的_samples/html/sample08.html。此处就不脓代码了ã€?
3、外联编辑条åQˆå¤šä¸ªç¼–辑域å…Þq”¨ä¸€ä¸ªç¼–辑条åQ?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
˜q™ä¸ªåŠŸèƒ½æ˜?.3版本才开始提供的åQŒä»¥å‰ç‰ˆæœ¬çš„FCKeditor要在同一个页面里用多个编辑器的话åQŒå¾—一个个创徏åQŒçŽ°åœ¨æœ‰äº†è¿™ä¸ªå¤–è”åŠŸèƒ½ï¼Œž®×ƒ¸ç”¨é‚£ä¹ˆéº»çƒ¦äº†åQŒåªéœ€è¦æŠŠå·¥å…·æ¡æ”¾åœ¨ä¸€ä¸ªé€‚当的位¾|®ï¼ŒåŽé¢ž®±å¯ä»¥æ— é™åˆ¶çš„创建编辑域了ã€?
要实现这¿UåŠŸèƒ½å‘¢åQŒéœ€è¦å…ˆåœ¨é¡µé¢ä¸­å®šä¹‰ä¸€ä¸ªå·¥å…äh¡çš„容器:<div id=”xToolbar”></div>åQŒç„¶åŽå†æ ÒŽ®˜q™ä¸ªå®¹å™¨çš„id属性进行设¾|®ã€?
JAVASCRIPT实现代码åQ?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
<div id=”xToolbar”></div>
FCKeditor 1:
<script. type=”text/javascript”>
<!–
// Automatically calculates the editor base path based on the _samples directory.
// This is usefull only for these samples. A real application should use something like this:
// oFCKeditor.BasePath = ‘/fckeditor/’; // ‘/fckeditor/’ is the default value.
var sBasePath = document.location.pathname.substring(0,document.location.pathname.lastIndexOf(’_samples’));
var FCKeditor = new FCKeditor( ‘FCKeditor_1′ );
oFCKeditor.BasePath = sBasePath;
oFCKeditor.Height = 100;
oFCKeditor.Config[ ‘ToolbarLocation’ ] = ‘Out:parent(xToolbar)’;
oFCKeditor.Value = ‘This is some <strong>sample text</strong>. You are using FCKeditor.’;
oFCKeditor.Create();
//–>
</script>
<br />
FCKeditor 2:
<script. type=”text/javascript”>
<!–
FCKeditor = new FCKeditor( ‘FCKeditor_2′ );
oFCKeditor.BasePath = sBasePath;
oFCKeditor.Height = 100;
oFCKeditor.Config[ ‘ToolbarLocation’ ] = ‘Out:parent(xToolbar)’;
oFCKeditor.Value = ‘This is some <strong>sample text</strong>. You are using FCKeditor.’;
oFCKeditor.Create();
//–>
</script>
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?
此部分的详细DEMO请参照_samples/html/sample11.htmlåQŒ_samples/html/sample11_frame.html
4、文件管理功能、文件上传的权限问题
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?
一直以来FCKeditor的文件管理部分的安全是个值得注意åQŒä½†å¾ˆå¤šäººæ²¡æ³¨æ„åˆ°çš„地方åQŒè™½ç„¶FCKeditor在各个Release版本中一直存在的一个功能就是对上传文äšg¾cÕdž‹˜q›è¡Œ˜q‡æ×oåQŒä½†æ˜¯å¥¹æ²¡è€ƒè™‘˜q‡å¦ä¸€ä¸ªé—®é¢˜ï¼šåˆ°åº•允许谁能上传åQŸåˆ°åº•谁能浏览服务器文äšgåQ?
之前刚开始用FCKeditoræ—Óž¼Œæˆ‘就出现˜q‡è¿™ä¸ªé—®é¢˜ï¼Œ˜q˜å¥½NetRubeåQˆFCKeditor中文化以及FCKeditor ASP版上传程序的作者)及时提醒了我åQŒåšæ³•是åŽÖM¿®æ”¹FCK上传½E‹åºåQŒåœ¨é‡Œé¢˜q›è¡Œæƒé™åˆ¤æ–­åQŒåƈ且再在fckconfig.js里把相应的一些功能去掉。但随之FCK版本的不断升¾U§ï¼Œæ¯å‡ä¸€‹Æ¡éƒ½è¦åŽ»æ”¹ä¸€‹Æ¡é…¾|®ç¨‹åºfckconfig.jsåQŒæˆ‘发觉厌烦了,ž®±æ²¡ä»€ä¹ˆåŠžæ³•èƒ½æ›´å¥½çš„æŽ§åˆ¶è¿™¿Ué…¾|®ä¹ˆåQŸäº‹å®žä¸ŠåQŒæ˜¯æœ‰çš„ã€?
在fckconfig.js里面åQŒæœ‰å…³äºŽæ˜¯å¦æ‰“开上传和浏览服务器的设¾|®ï¼Œåœ¨åˆ›å»ºFCKeditoræ—Óž¼Œé€šè¿‡½E‹åºæ¥åˆ¤æ–­æ˜¯å¦åˆ›å»ºæœ‰ä¸Šä¼ ‹¹è§ˆåŠŸèƒ½çš„ç¼–è¾‘å™¨ã€‚é¦–å…ˆï¼Œæˆ‘å…ˆåœ¨fckconfig.js里面把所有的上传和浏览设¾|®å…¨è®¾äØ“falseåQŒæŽ¥ç€æˆ‘ä‹É用的代码如下åQ?
JAVASCRIPT版本åQ?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?
<script. type=”text/javascript”>
var FCKeditor = new FCKeditor( ‘fbContent’ );
<% if power = powercode then %>
oFCKeditor.Config[’LinkBrowser’] = true;
oFCKeditor.Config[’ImageBrowser’] = true;
oFCKeditor.Config[’FlashBrowser’] = true;
oFCKeditor.Config[’LinkUpload’] = true;
oFCKeditor.Config[’ImageUpload’] = true;
oFCKeditor.Config[’FlashUpload’] = true;
<% end if %>
oFCKeditor.ToolbarSet = ‘Basic’;
oFCKeditor.Width = ‘100%’;
oFCKeditor.Height = ‘200′;
oFCKeditor.Value = ‘’;
oFCKeditor.Create();
</script>
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?
在按钮旁边加文字
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?
打开 editor/js/ 两个jsæ–‡äšg
fckeditorcode_gecko.js
fckeditorcode_ie.js
½W¬ä¸€ä¸ªæ˜¯æ”¯æŒéžie‹¹è§ˆå™¨çš„
½W¬äºŒä¸ªæ–‡ä»¶æ˜¯æ”¯æŒie‹¹è§ˆå™¨çš„
搜烦 FCKToolbarButtonåQŒå¯ä»¥çœ‹åˆ°è®¸å¤šç±»ä¼ÆD¿™æ ïLš„语句åQ?
case ‘Save’:B = new FCKToolbarButton(’Save’, FCKLang.Save, null, null, true, null, 3); break;
‘Save’是按钮英文名å­?
FCKToolbarButton 的四个参数分别是åQ?
按钮命ä×o名称åQŒæŒ‰é’®æ ‡½{¾æ–‡å­—,按钮工具提示åQŒæŒ‰é’®æ ·å¼ï¼ŒæŒ‰é’®æ˜¯å¦åœ¨æºä»£ç æ¨¡å¼å¯è§åQŒæŒ‰é’®ä¸‹æ‹‰èœå•其中将½W?™å¹å‚数设¾|®äØ“ FCK_TOOLBARITEM_ICONTEXT 卛_¯ä½¿æŒ‰é’®æ—è¾¹å‡ºçŽ°æ–‡å­—ï¼Œæ³¨æ„æ²¡æœ‰å¼•å·ã€?
例如åQ?
case ‘Preview’:B = new FCKToolbarButton(’Preview’, FCKLang.Preview, null, FCK_TOOLBARITEM_ICONTEXT, true, null, 5);
˜q™æ ·æˆ‘们ž®±å¯ä»¥å°† 我们¾lå¸¸ç”¨çš„3¿Uæ¨¡å¼æºä»£ç ã€é¢„览、全屏编辑按钮都加上文字了ã€?
解释fck样式的工作原�
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?
fck的样式设¾|®æ¶‰åŠåˆ°äº†ä¸¤ä¸ªæ–‡ä»Óž¼Œä¸€ä¸ªæ˜¯ä½ å®šä¹‰å¥½çš„æ ·å¼è¡¨æ–‡äšg.cssåQŒå¦ä¸€ä¸ªæ˜¯å‘Šè¯‰fck样式表如何ä‹É用的xmlæ–‡äšgåQŒä¸¤ä¸ªæ–‡ä»¶ç¡®ä¸€ä¸å¯ã€?
cssæ–‡äšg的位¾|®æ˜¯ä¸åšè¦æ±‚的,但是需要你在应用的¾~–辑器的™åµé¢ä¸Šæ’入样式表文äšg的链接。这æ äh‰èƒ½æ˜¾½Cºå‡ºæ¥æ ·å¼ã€?
fckstyles.xml 在与editor目录同çñ”的目录下。该文äšg定义了那些样式可以ä‹É用在那些标签里面ã€?
˜q™å°±æ˜¯fck自带的样式xml定义åQ?
<?xml version=”1.0″ encoding=”utf-8″ ?>
<Styles>
<Style name=”Image on Left” element=”img”>
<Attribute name=”style” value=”padding: 5px; margin-right: 5px” />
<Attribute name=”border” value=”2″ />
<Attribute name=”align” value=”left” />
</Style>
<Style name=”Image on Right” element=”img”>
<Attribute name=”style” value=”padding: 5px; margin-left: 5px” />
<Attribute name=”border” value=”2″ />
<Attribute name=”align” value=”right” />
</Style>
<Style name=”Custom Bold” element=”span”>
<Attribute name=”style” value=”font-weight: bold;” />
</Style>
<Style name=”Custom Italic” element=”em” />
<Style name=”Title” element=”span”>
<Attribute name=”class” value=”Title” />
</Style>
<Style name=”Code” element=”span”>
<Attribute name=”class” value=”Code” />
</Style>
<Style name=”Title H3″ element=”h3″ />
<Style name=”Custom Ruler” element=”hr”>
<Attribute name=”size” value=”1″ />
<Attribute name=”color” value=”#ff0000″ />
</Style>
</Styles>
每一ä¸?lt;style>ž®†æ¥ä¼šç”Ÿæˆä¸€ä¸ªæ ·å¼çš„菜单™åV€‚name名称ž®±æ˜¯æ˜„¡¤ºåœ¨èœå•里的文字;element定义了该样式可以应用在那¿Uhtml标签上,<Attribute>çš?name 指定了将会修æ”ÒŽ ‡½{„¡š„哪个属性来应用样式åQŒvalue则是修改成的倹{€?
看这个:
<Style name=”Title” element=”span”>
<Attribute name=”class” value=”Title” />
</Style>
如果你在fck选定了文å­?“¾lå…¸è®ºå› ã€?前台制作与脚本专æ ?ã€?FCKeditor 实战技å·?- 1 ã€?¾~–辑帖子” 应用该样å¼?则原来文字就会变æˆ?lt;span class=”Title”>¾lå…¸è®ºå› ã€?前台制作与脚本专æ ?ã€?FCKeditor 实战技å·?- 1 ã€?¾~–辑帖子</span>
注意åQšå¦‚果编辑器呈整™å늼–辑状态,那么整页里面也需要插入样式表链接才能昄¡¤ºå‡ºæ¥æ ·å¼ã€?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
FCKeditor JavaScript. APIåQˆç¿»è¯‘整理)
原文地址åQ?a target="_new">http://wiki.fckeditor.net/Developer%27s_Guide/Javascript_API
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
FCK ¾~–辑器加载后åQŒå°†ä¼šæ³¨å†Œä¸€ä¸ªå…¨å±€çš?FCKeditorAPI 对象ã€?
FCKeditorAPI 对象在页面加载期间是无效的,直到™åµé¢åŠ è²å®Œæˆã€‚å¦‚æžœéœ€è¦äº¤äº’å¼åœ°çŸ¥é?FCK ¾~–辑器已¾låŠ è½½å®Œæˆï¼Œå¯ä‹Éç”?#8220;FCKeditor_OnComplete”函数ã€?
<script. type=”text/javascript”>
function FCKeditor_OnComplete(editorInstance) {
FCKeditorAPI.GetInstance(’FCKeditor1′).Commands.GetCommand(’FitWindow’).Execute();
}
</script>
在当前页获得 FCK ¾~–辑器实例:
var Editor = FCKeditorAPI.GetInstance(’InstanceName’);
ä»?FCK ¾~–辑器的弹出½H—口中获å¾?FCK ¾~–辑器实例:
var Editor = window.parent.InnerDialogLoaded().FCK;
从框枉™¡µé¢çš„子框架中获得其它子框架的 FCK ¾~–辑器实例:
var Editor = window.FrameName.FCKeditorAPI.GetInstance(’InstanceName’);
从页面弹出窗口中获得父窗口的 FCK ¾~–辑器实例:
var Editor = opener.FCKeditorAPI.GetInstance(’InstanceName’);
获得 FCK ¾~–辑器的内容åQ?
oEditor.GetXHTML(formatted); // formatted 为:true|falseåQŒè¡¨½Cºæ˜¯å¦æŒ‰HTML格式取出
也可用:
oEditor.GetXHTML();
讄¡½® FCK ¾~–辑器的内容åQ?
oEditor.SetHTML(”content”, false); // ½W¬äºŒä¸ªå‚æ•îCØ“åQštrue|falseåQŒæ˜¯å¦ä»¥æ‰€è§å³æ‰€å¾—方式设¾|®å…¶å†…容。此æ–ÒŽ³•常用äº?#8220;讄¡½®åˆå§‹å€?#8221;æˆ?#8220;表单重置”操作ã€?
插入内容åˆ?FCK ¾~–辑器:
oEditor.InsertHtml(”html”); // “html”为HTML文本
‹‚€æŸ?FCK ¾~–辑器内å®ÒŽ˜¯å¦å‘生变化:
oEditor.IsDirty();
åœ?FCK ¾~–辑器之外调ç”?FCK ¾~–辑器工å…äh¡å‘½ä×oåQ?
命ä×o列表如下åQ?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
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
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
使用æ–ÒŽ³•如下åQ?
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
oEditor.Commands.GetCommand(’FitWindow’).Execute();
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼

]]>
FCKEditor的赋值和取值操�http://www.aygfsteel.com/feingto/archive/2008/01/09/173963.htmlfeingtofeingtoWed, 09 Jan 2008 04:51:00 GMThttp://www.aygfsteel.com/feingto/archive/2008/01/09/173963.htmlhttp://www.aygfsteel.com/feingto/comments/173963.htmlhttp://www.aygfsteel.com/feingto/archive/2008/01/09/173963.html#Feedback1http://www.aygfsteel.com/feingto/comments/commentRss/173963.htmlhttp://www.aygfsteel.com/feingto/services/trackbacks/173963.html1、获取编辑器中HTML内容

function getEditorHTMLContents(EditorName)

    
var oEditor = FCKeditorAPI.GetInstance(EditorName); 
    
return(oEditor.GetXHTML(true)); 
}


2、获取编辑器中文字内容(在博客发布时获取无html代码摘要使用åQ?/p>

function getEditorTextContents(EditorName)

    
var oEditor = FCKeditorAPI.GetInstance(EditorName); 
    
return(oEditor.EditorDocument.body.innerText); 
}


3、设¾|®ç¼–辑器中内å®?/p>

function SetEditorContents(EditorName, ContentStr)

    
var oEditor = FCKeditorAPI.GetInstance(EditorName) ; 
    oEditor.SetHTML(ContentStr) ; 
}



]]>
Script.aculo.us开发系åˆ?å…?:使用DropDragå®šä¹‰æ‹–æ‹½è¡ŒäØ“http://www.aygfsteel.com/feingto/archive/2008/01/05/172962.htmlfeingtofeingtoSat, 05 Jan 2008 06:14:00 GMThttp://www.aygfsteel.com/feingto/archive/2008/01/05/172962.htmlhttp://www.aygfsteel.com/feingto/comments/172962.htmlhttp://www.aygfsteel.com/feingto/archive/2008/01/05/172962.html#Feedback0http://www.aygfsteel.com/feingto/comments/commentRss/172962.htmlhttp://www.aygfsteel.com/feingto/services/trackbacks/172962.html

在不同的‹¹è§ˆå™¨ä¸Šé»˜è®¤çš„æ‹–拽能解决的问题相当少,所以有很多的框枉™ƒ½èƒ½å®žçŽ°è¿™ä¹ˆä¸ªåŠŸèƒ½.ä½¿ç”¨æ‹–æ‹½è¡ŒäØ“èƒ½å¾ˆå¥½çš„æ”¹å–„ç”¨æˆ·ä½“éªŒ,ž®¤å…¶æ˜¯åœ¨è´­ç‰©çš„æ—¶å€™èƒ½è®©ç”¨æˆäh„Ÿåˆ°å¾ˆæ–°å¥‡å’Œä½“é?Script.aculo.us使用了三个类实现拖拽和排åº?它们是Draggable,Droppable,Sortable.要实çŽîC¸€ä¸ªå®Œæ•´çš„æ‹–æ‹½è¡ŒäØ“,需要Draggable,å’ŒDroppable的配合ä‹Éç”?ç”׃ºŽ˜q™è¿žä¸ªç±»çš„æ–¹æ³•比较多,我只选取比较实用的几个方法进行介¾l?˜q˜æ˜¯è€è§„çŸ?先看看Demo:http://www1.qcxy.hb.cn/qphy/Script_Aculo_Us/DragDrop.html

Draggable

new Draggable("DraggableId"[,options])

主要选项

  • snap:推拽的最ž®å•ä½?默认为false,可以是数¾l„或者函æ•?ž®†è¿™ä¸ªå±žæ€§è®¾¾|®äØ“[50,50],意味着最ž®çš„位移单位æ˜?0px,50px,如果讄¡½®ä¸ÞZ¸€ä¸ªå‡½æ•?˜q™ä¸ªå‡½æ•°çš„参æ•îCØ“(x,y),˜q™ä¸ªx,y指示当前的绝对坐æ ?函数应该˜q”回二维数组,上面的例子中的Drag(UnAcceptable)推拽到页面的左上角是ž®×ƒ¼š"吔R™„"上去,ž®±æ˜¯å› äؓ函数的作ç”?详细见源ç ?
  • revert:推拽完毕之后是否回到原来的位¾|?默认为false,也可以是一个函æ•?˜q™ä¸ªå‡½æ•°å¿…é¡»˜q”回true/false
  • handle:"提手",¿UÕdŠ¨æ•´ä¸ªå—çš„æ—¶å€™é€šå¸¸ä¸éœ€è¦åœ¨æ•´ä¸ªå—çš„åŒºåŸŸéƒ½å¯ä»¥æ‹–æ‹?比如¿UÕdŠ¨ä¸€ä¸ªæ ç›?通常只需要拖拽标é¢?比如Google的个性化主页),ž®†è¯¥å±žæ€§è®¾¾|®äؓ标题的Id
  • ghosting:推拽的过½E‹ä¸­æ˜¯å¦æ˜„¡¤º"影子",默认为false
  • constraint:限制能拖动的方向,默认的两个方向都可以,可以讄¡½®ä¸?vertical","horizontal"çš„ä“Qæ„?
  • zindex:"影子"çš„z-Index属æ€?
  • scroll:æ‹–æ‹½å‡ø™§†å›¾èŒƒå›´æ˜¯å¦æ˜¾½Cø™‡ªåŠ¨æ»šåŠ?
  • scrollSensitivity/scrollSpeed:默认值分ä¸ÞZØ“20/15,控制滚动的敏感度和滚动速度
  • delay:拖拽前的延时,开始拖拽后¾lè¿‡˜q™ä¸ªæ—‰™—´æ‰?回过¼œžæ¥"

˜q™é‡Œéœ€è¦è¯´æ˜Žçš„æ˜¯åÆˆéžæ‰€æœ‰çš„æ ‡ç­¾éƒ½æ”¯æŒè¯¥è¡ŒäØ“,详细的情况请参阅官方文档

API

  • onStart:开始拖拽调用该函数,接受两个参数(obj,oEvent)前者是$(DraggableId),后者是当前事äšgçš„event对象
  • onDrag:在拖拽过½E‹ä¸­åå¤çš„调用该函数,同样接受两个参数(obj,oEvent)
  • change:在onDrag后调ç”?也会反复调用
  • onEnd:æ‹–æ‹½è¡ŒäØ“¾l“束调用,即鼠标弹èµäh—¶‹È€å?
  • destroy():è¯¥æ–¹æ³•é”€æ¯å…ƒç´ çš„æ‹–æ‹½è¡ŒäØ“

Droppables

Droppables(注意是复数åÅžå¼?是一个抽象类,不能被实例化,只有一些静态方æ³?常用的方法有addå’Œmove,分别增加可放¾|®å…ƒç´?和去除可攄¡½®å…ƒç´ 

addæ–ÒŽ³•:Dropables.add("ContainerId"[,options]),常用的选项

  • accept: 数组或者字½W¦ä¸²,表示该容器接受的元素的className的集å?默认的ä“Q何元素都接收
  • hoverclass:当符合接受要求的元素拖至容器上时,å…¶className
  • onDrop():被拖拽的½W¦åˆè¦æ±‚的元素在˜q™é‡Œæ”„¡½®æ—¶è°ƒç”¨è¯¥å‡½æ•°,接受三个参数(draggable,droppable,oEvent),draggable是被拖拽元素,droppable是被攄¡½®å…ƒç´ ,oEvent当前事äšg对象

remove("ContainerId"),该方法去除容器的攄¡½®è¡ŒäØ“

(上面例子的源代码)

Sortable

Sortable是一¾l„可以通过拖拽交换位置的元ç´?可以先看看实ä¾?

serialize(sortable)æ–ÒŽ³•:该方法返回当前容器内元素的次åº?但是要求子元素的idå¿…é¡»ä»?item_"å¼€å¤?且返回格式有讲究,看下面的例子

<div id="horizontalSortable" class="item" style="margin-top:20px; height:40px;">
      <div id="item_5">IE</div>
      <div id="item_6">FireFox</div>
      <div id="item_7">Safari</div>
      <div id="item_8">Opera</div>
</div>

Sortable.create("horizontalSortable",
{
     ghosting:true,
     tag:'div',
     constraint:'horizontal',
     hoverclass:'hoverClass2'
});

Sortable.serialize('horizontalSortable')
//-->horizontalSortable[]=5&horizontalSortable[]=6&horizontalSortable[]=7&horizontalSortable[]=8

最后看一个例å­?前面提到的containment选项在某些情况下很有ç”?比如要实çŽîC¸¤ä¸ªå®¹å™¨é‡Œçš„å…ƒç´ å¯ä»¥äº’ç›æ€º¤æ¢å­å…ƒç´ ,即从一个容器拖至ä×o一个容器中.来看下面的例å­?/p>

<script type="text/javascript">
  Sortable.create('sortUlLeft',{containment:['sortUlLeft','sortUlRight'], dropOnEmpty:
true,ghosting:true,constraint:false,hoverclass:'hoverClass'});
  Sortable.create('sortUlRight',{containment:['sortUlLeft','sortUlRight'], dropOnEmpty:
true,ghosting:true,constraint:false,hoverclass:'hoverClass'});

</script>

上面的例子可以实现sortUlLeft,和sortUlRight的子元素互相交换



]]>
用script.aculo.us实现像google suggest自动完成功能http://www.aygfsteel.com/feingto/archive/2008/01/03/172358.htmlfeingtofeingtoThu, 03 Jan 2008 01:20:00 GMThttp://www.aygfsteel.com/feingto/archive/2008/01/03/172358.htmlhttp://www.aygfsteel.com/feingto/comments/172358.htmlhttp://www.aygfsteel.com/feingto/archive/2008/01/03/172358.html#Feedback3http://www.aygfsteel.com/feingto/comments/commentRss/172358.htmlhttp://www.aygfsteel.com/feingto/services/trackbacks/172358.html实现像google suggest自动完成功能

首先创徏一个jsp

<%@ page language="java" pageEncoding="UTF-8"%>

<html>
<head>
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/effects.js"></script>
<script type="text/javascript" src="js/controls.js"></script>
<style>
div.auto_complete {
  width: 350px;
  background: #fff;
}
div.auto_complete ul {
  border:1px solid #888;
  margin:0;
  padding:0;
  width:100%;
  list-style-type:none;
}
div.auto_complete ul li {
  margin:0;
  padding:3px;
}
div.auto_complete ul li.selected {
  background-color: #ffb;
}
div.auto_complete ul strong.highlight {
  color: #800;
  margin:0;
  padding:0;
}
</style>

</head>
<body>
<input type="text" id="autocomplete"/>
<div id="results" class="auto_complete"></div>
<script type="text/javascript">
 new Ajax.Autocompleter(
  "autocomplete",
  "results",
  "list.html", {
   method: "GET"
  }
 );
</script>
</body>
</html>

 

list.html

<ul>
<li>Aria</li>
<li>Aaaa</li>
<li>Afdsa</li>
<li>bsa</li>
</ul>

上面list.html采用静态页面返回列表,读者可以ä‹É用动态页面返回结果ã€?



]]>
怎么避免‹¹è§ˆå™¨ç¼“存静态文ä»?/title><link>http://www.aygfsteel.com/feingto/archive/2008/01/03/172357.html</link><dc:creator>feingto</dc:creator><author>feingto</author><pubDate>Thu, 03 Jan 2008 01:19:00 GMT</pubDate><guid>http://www.aygfsteel.com/feingto/archive/2008/01/03/172357.html</guid><wfw:comment>http://www.aygfsteel.com/feingto/comments/172357.html</wfw:comment><comments>http://www.aygfsteel.com/feingto/archive/2008/01/03/172357.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/feingto/comments/commentRss/172357.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/feingto/services/trackbacks/172357.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class="postbody"> <p>对于动态文ä»?比如 index.asp?id=...  或è€?index.aspx?id=... ç›æ€¿¡æœ‰ç»éªŒçš„½E‹åºå‘˜éƒ½çŸ¥é“怎样¼›æ­¢‹¹è§ˆå™¨ç¼“存数据了.<br /> 但是对于静态文ä»?css,jpg,gif½{‰ç­‰), 在什么场合下面我们需要禁止浏览器¾~“存他们,怎么å?<br /> <br /> 本文讨论的主题是如何防缓å­? ž®¤å…¶æ˜¯å¦‚何防止静态文件被¾~“å­˜..<br /> <br /> <br /> åœ?nbsp; <a target="_blank">RE:对博客园URL的一些调整徏è®? 二çñ”域名不利于客æˆïL«¯‹¹è§ˆå™¨ç¼“å­?/a> 一文中,我提åˆîCº†æ€Žä¹ˆæœ€å¤§åŒ–çš?br /> 利用‹¹è§ˆå™¨ç¼“存功èƒ?来提高客æˆïL«¯‹¹è§ˆé€Ÿåº¦, 减轻服务器负担的.<br /> <br /> 但是事物æ€ÀL˜¯ä¸€åˆ†äؓ二的,òq¶ä¸æ˜¯æ‰€æœ‰çš„场合都要使用¾~“å­˜çš? 有时候我们的数据被缓存了反而会¾l™æˆ‘们带来麻çƒ?<br /> <br /> 对于动态数据(从数据库è¯Õd–生成的那些)åQŒæˆ‘们可以通过以下æ–ÒŽ³•来禁止浏览器¾~“å­˜ã€?/p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">'</span><span style="color: #008000">asp ä¸ÞZ¾‹ ¼›æ­¢¾~“å­˜</span><span style="color: #008000"><br /> </span><span style="color: #000000"><br /> Response.Buffer </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">True</span><span style="color: #000000"> <br /> Response.ExpiresAbsolute </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">Now</span><span style="color: #000000">() </span><span style="color: #000000">-</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000"> <br /> Response.Expires </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000"> <br /> Response.CacheControl </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span><span style="color: #000000"> <br /> Response.AddHeader </span><span style="color: #000000">"</span><span style="color: #000000">Pragma</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">No-Cache</span><span style="color: #000000">"</span><span style="color: #000000"> </span></div> <p>对于Ajax 的请求(不管是静态数据还是动态数据):</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">//</span><span style="color: #008000">以下三种æ–ÒŽ³•使用其中ä»ÖM½•一¿Uæ–¹æ³•都可以</span><span style="color: #008000"><br /> </span><span style="color: #000000">xmlhttp.setRequestHeader(</span><span style="color: #000000">"</span><span style="color: #000000">Cache-Control</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span><span style="color: #000000">);  <br /> </span><span style="color: #008000">//</span><span style="color: #008000">或è€?/span><span style="color: #008000"><br /> </span><span style="color: #000000">xmlhttp.setRequestHeader(</span><span style="color: #000000">"</span><span style="color: #000000">If-Modified-Since</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008000">//</span><span style="color: #008000">或è€?/span><span style="color: #008000"><br /> </span><span style="color: #000000">xmlhttp.Open(url</span><span style="color: #000000">+</span><span style="color: #000000">'</span><span style="color: #000000">?</span><span style="color: #000000">rnd</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">+</span><span style="color: #000000">Math.random(),....)<br /> </span></div> <p>如果使用 prototype.js  , ç”¨ç±»ä¼ÆD¿™æ ïLš„代码 <br /> new Ajax.Request(url,{method:"get",requestHeaders:[<span style="color: #000000">"</span><span style="color: #000000">Cache-Control</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">no-cache</span><span style="color: #000000">"</span>]})<br /> 或è€?br /> new Ajax.Request(url,{method:"get",requestHeaders:[<span style="color: #000000"><span style="color: #000000">"</span><span style="color: #000000">If-Modified-Since</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span></span>]})<br />  <br /> <br /> 什么情况下åQŒè¦¼›æ­¢é™æ€æ–‡ä»¶ç¼“存:<br /> 1、经常可能要改动çš?js, css.<br />        比如 一个html æ–‡äšgåQ?test.html åœ?1.0版本中。可能是˜q™æ ·<br />      <script src="common.js"></script><br />      修改å?nbsp; v1.1版本åQ?br />  <script src="common.js"></script><br />  <script src="foo.js"></script><br />    新增加了一个foo.js  同时åQŒä¹Ÿæ”¹åŠ¨äº†common.js , 在common.js 中定义了新的¾c»ï¼Œòq¶åœ¨foo.js 中ä‹É用了common.js.  <br /> <br /> 在这¿Uæƒ…况下如果以前用户‹¹è§ˆ˜q?1.0版本çš?html æ–‡äšgåQŒé‚£ä¹ˆä»–的浏览器自动¾~“å­˜äº?common.js<br /> 当他‹¹è§ˆæ–°ç‰ˆæœ¬çš„æ—¶å€™ï¼Œå› äؓ使用的是 v1.1çš?foo.js å’?v1.0çš?common.js åQŒè¿™æ ·å°†å¯ÆD‡´è„šæœ¬å‡ºé”™ã€?br /> <br /> <br /> 解决æ–ÒŽ³•探讨åQ?br />   å› äØ“css,js 是通过 <script src=....> ˜q™ç§æ–¹å¼åŠ è²çš„ï¼Œæ‰€ä»¥ï¼Œå¾ˆéš¾ä½¿ç”¨ asp 的那¿UæœåŠ¡å™¨ç«¯ç¦æ­¢ç¼“å­˜çš„åŠžæ³•ã€‚ä¹Ÿå¾ˆéš¾ä½¿ç”¨ajax的通过讄¡½® httpè¯äh±‚头的办法¼›æ­¢ä½¿ç”¨¾~“å­˜ã€?br /> <br /> 看来随机数是个好办法ã€?/p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">//</span><span style="color: #008000">æ–ÒŽ³•一åQ?/span><span style="color: #008000"><br /> </span><span style="color: #000000">document.write(</span><span style="color: #000000">"</span><span style="color: #000000"><script src='test.js?rnd=</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Math.random()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">'></s</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">cript></span><span style="color: #000000">"</span><span style="color: #000000">)<br /> <br /> </span><span style="color: #008000">//</span><span style="color: #008000">æ–ÒŽ³•二:</span><span style="color: #008000"><br /> </span><span style="color: #0000ff">var</span><span style="color: #000000"> js</span><span style="color: #000000">=</span><span style="color: #000000">document.createElement(</span><span style="color: #000000">"</span><span style="color: #000000">script</span><span style="color: #000000">"</span><span style="color: #000000">)<br /> js.src</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">test.js</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Math.random()<br /> document.body.appendChild(js)</span></div> <p><br /> 但是åQŒå¦‚果采用随机数的话åQ?jsæ–‡äšgž®†æ°¸˜qœå¾—不到¾~“å­˜åQŒæ¯‹Æ¡éƒ½å¿…须重新从服务器加蝲åQŒå³ä½¿æ²¡æœ‰ä“Q何更攏V€?br /> 大家如果¾lå¸¸ä¸Šå›½å¤–网站的话,可以看到他们通常采用˜q™æ ·çš„æ–¹å¼æ¥è§£å†³åQ?br /> <script src="test.js?ver=113"></script><br /> 其中 ver=113 çš?113ž®±æ˜¯ç‰ˆæœ¬åøP¼Œä¸€èˆ¬éƒ½æ˜¯é‡‡ç”?CVS 或其他工å…ïL”Ÿæˆçš„开发版本号ã€?br /> <br /> ˜q™æ ·çœŸæ­£åšåˆ°äº†åº”该缓存的时候缓存静态文ä»Óž¼Œå½“版本有更新的时候从获取最新的版本åQŒåƈ更新¾~“å­˜ã€?br /> 对于囑փ <img src="test.jps?ver=在CVS的版本号"> 来有效利用和更新¾~“å­˜.<br /> <br /> <br /> 唉,现在在CSDNçš„Web版,不知道有多少人在重复问着同一个问题ã€?#8220;怎么通过½E‹åºåˆ é™¤æ¸…空客户端的‹¹è§ˆå™¨ç¼“å­?#8221;.........</p> <p> </p> <p>未完待箋åQ?<br /> <br /> 下一½‹‡ï¼š  利用‹¹è§ˆå™¨ç¼“存来改善用户体验。。。。Ajax模式之预先加è½?br /> <br /> 敬请å…Ïx³¨åQŒç­‰æˆ‘写完再加上链接<br /> </p> </div> <img src ="http://www.aygfsteel.com/feingto/aggbug/172357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/feingto/" target="_blank">feingto</a> 2008-01-03 09:19 <a href="http://www.aygfsteel.com/feingto/archive/2008/01/03/172357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX框架/库比较和选择åQšECHO2, GWT, DOJO, PROTOTYPE, JQUERYhttp://www.aygfsteel.com/feingto/archive/2007/12/30/171750.htmlfeingtofeingtoSun, 30 Dec 2007 12:37:00 GMThttp://www.aygfsteel.com/feingto/archive/2007/12/30/171750.htmlhttp://www.aygfsteel.com/feingto/comments/171750.htmlhttp://www.aygfsteel.com/feingto/archive/2007/12/30/171750.html#Feedback0http://www.aygfsteel.com/feingto/comments/commentRss/171750.htmlhttp://www.aygfsteel.com/feingto/services/trackbacks/171750.html 首先åQŒè¦åœ¨ä¸¤ä¸ªç±»åˆ«ä¸­é€‰æ‹©åQŒä¸€ä¸ªæ˜¯¾~–译¾c»ï¼Œä¸€ä¸ªæ˜¯éžç¼–译类别ã€?br /> Echo2/GWT是将JAVA代码¾~–译成JAVASCRIPTåQŒä¹çœ‹å¾ˆæ–¹ä¾¿åQŒä¸ç”¨æŽŒæ¡JS也能做出炫目界面。但˜q™åªé€‚于不会或者不想了解JS的情况,对于˜q˜æ˜¯æƒ›_®Œå…¨æŽ§åˆ¶å’Œå®šåˆ¶ç•Œé¢çš„项目就不适合ã€?br /> 另外åQŒæœ‰ä¸€¿Uè§‚点认为JAVA->JS转换是一¿Uä½Ž¾U§è¯­­a€å‘高¾U§è¯­­a€è½¬æ¢åQŒæœ¬íw«æ²¡æœ‰æ„ä¹‰ã€‚有点像åŽÕd­¦æ±‡ç¼–åQŒç„¶åŽå†æ‰¾ä¸ªå·¥å…·æŠŠæ±‡¾~–语­a€ä»£ç è½¬æ¢æˆC代码来用。我虽然没完全想通这个观点,不过åQŒæˆ‘一直用C/C++åQŒè¿™å‡ å¹´æ‰é€æ¸å‘现JAVA¼‹®å®žæ˜¯ä¸€¿Uè¿›åŒ–ã€‚æ²¡å‡†åˆ«äºø™¯´çš„æ˜¯å¯¹çš„呢?
在Echo2å’ŒGWT中,GWT大部分工作是在客æˆïL«¯åQŒå°½é‡å°‘è·ŸSERVER打交道,适合大型¾|‘ç«™˜qç”¨åQ›ECHO2信奉“用到才加è½?#8221;的信条,所以会有大量向SERVER的访问,适合企业应用。另外,个äh觉得ECHO2是个更全面的的一站式框架åQŒç•Œé¢ä¹Ÿéžå¸¸ç‚«ã€‚但它的开发工兯‚¦æ”¶è´¹ã€?br /> 再谈非编译类别,它们包括DOJO、PROTOTYPE、JQEURYåQŒä¸‹é¢ä¸€ä¸€ä»‹ç»åQ?br /> 先说PROTOTYPEåQŒå®ƒæ¯”较轻量极,能让你的代码更加½Ž€åŒ–。最¾lå…¸èŽ«è¿‡äº?#8220;¾ŸŽåœ†å‡½æ•°”åQ?br /> document.getElementById(’elementid’) 变成$(’elementid’)
它加å¼ÞZº†JS语言的可开发性,降低了学习JS的门槛ã€?br /> DOJO最吸引人的是它的事件系¾lŸå’Œä¸°å¯Œçš„可定制¾l„äšg。它可以用åŞ如下面的语句为各¿UHTML元素加入事äšgåQ?br /> dojo.event.connect(someNode, "onclick", doStuff);
正由于DOJO提供了强大功能,它分成了许多包,可以分别包含使用ã€?br /> JQUERY也提供了¾ŸŽåœ†å‡½æ•°åQŒå®ƒçš„æ’ä»¶ç³»¾lŸä¹Ÿæä¾›è±¡DOJO的组ä»Óž¼Œä½†å®ƒæ²¡æœ‰PROTOTYPE那样½Ž€‹zï¼Œä¹Ÿæ²¡æœ‰DOJO˜q™ä¹ˆå¤šçš„¾l„äšgä¾›ä‹É用,但它兼收两家优点åQŒåƈ且个头不大,文档也算完整åQŒæ‰€ä»¥è¯´å®ƒä»‹ä¹ŽäºŽå‰è¿°ä¸¤è€…之间ã€?
所以,如果你需要非常完整的工具¾l„äšgè¯ïL”¨DOJOåQŒå¦‚果你想优化你的JS代码åQŒæé«˜ä¹¦å†™æŠ€å·§è¯·ç”¨PROTOTYPEåQŒå¦‚果你想两者兼™å‘Ö°±ç”¨JQUERYã€?

]]>
prototype.js开发笔è®?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/feingto/archive/2007/12/30/171739.html</guid><wfw:comment>http://www.aygfsteel.com/feingto/comments/171739.html</wfw:comment><comments>http://www.aygfsteel.com/feingto/archive/2007/12/30/171739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/feingto/comments/commentRss/171739.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/feingto/services/trackbacks/171739.html</trackback:ping><description><![CDATA[     摘要: 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()æ–?..  <a href='http://www.aygfsteel.com/feingto/archive/2007/12/30/171739.html'>阅读全文</a><img src ="http://www.aygfsteel.com/feingto/aggbug/171739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/feingto/" target="_blank">feingto</a> 2007-12-30 18:07 <a href="http://www.aygfsteel.com/feingto/archive/2007/12/30/171739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Prototype 1.5 Ajax 使用教程 http://www.aygfsteel.com/feingto/archive/2007/12/30/171737.htmlfeingtofeingtoSun, 30 Dec 2007 10:03:00 GMThttp://www.aygfsteel.com/feingto/archive/2007/12/30/171737.htmlhttp://www.aygfsteel.com/feingto/comments/171737.htmlhttp://www.aygfsteel.com/feingto/archive/2007/12/30/171737.html#Feedback0http://www.aygfsteel.com/feingto/comments/commentRss/171737.htmlhttp://www.aygfsteel.com/feingto/services/trackbacks/171737.html2.3  Prototype对Ajax的支æŒ?/h3>

ä½œäØ“ä¸€ä¸ªAjax开发框æžÓž¼ŒPrototype对Ajax开发提供了有力的支持。在Prototype中,与Ajax相关的类和对象包括:Ajax、Ajax.Responsders、Ajax.Base、Ajax.Request、Ajax. PeriodicalUpdaterå’ŒAjax.UpdateråQŒå›¾2-3所½CÞZØ“˜q™äº›¾cÕd’Œå¯¹è±¡ä¹‹é—´çš„å…³¾pÕdŠå…¶å¸¸ç”¨å±žæ€§å’Œæ–ÒŽ³•åQŒä¸‹é¢åˆ†åˆ«å¯¹˜q™äº›¾cÕd’Œå¯¹è±¡˜q›è¡Œä»‹ç»ã€?/p>

å›?-3  Prototype中Ajax相关¾cÕd’Œå¯¹è±¡å…³ç³»½Cºæ„å›?/p>

2.3.1  Ajax对象

Ajax对象为其他的Ajax功能¾cÀLä¾›äº†æœ€åŸºæœ¬çš„æ”¯æŒï¼Œå®ƒçš„实现å¦?.2.7节中ä¾?-10所½Cºï¼Œå…¶ä¸­åŒ…括一个方法getTransport和一个属性activeRequestCount。getTransportæ–ÒŽ³•˜q”回一个XMLHttpRequest对象åQŒactiveRequestCount属性代表正在处理中的Ajaxè¯äh±‚的个数ã€?/p>

2.3.2  Ajax.Base¾c?/h3>

Ajax.Base¾cÀL˜¯Ajax.Request¾cÕd’ŒAjax.PeriodicalUpdater¾cȝš„基类。它提供äº?个方法:

l  setOptionsåQšè®¾¾|®Ajax操作所使用的选项ã€?/p>

l  responseIsSuccessåQšåˆ¤æ–­Ajax操作是否成功ã€?/p>

l  responseIsFailureåQšåˆ¤æ–­Ajax操作是否å¤ÞpÓ|åQˆä¸ŽresponseIsSuccess相反åQ‰ã€?/p>

Ajax.Base¾cȝš„主要作用是提取出一些公用的æ–ÒŽ³•åQŒå…¶ä»–类通过¾l§æ‰¿çš„æ–¹å¼ä‹É用这些方法,实现代码复用ã€?/p>

2.3.3  Ajax.Request¾c?/h3>

˜q™æ˜¯Prototype中最¾lå¸¸ä½¿ç”¨çš„一个Ajax相关¾c…R€‚Ajax.Request¾cÈš„æ–ÒŽ³•通常是内部ä‹É用的åQŒå› æ­¤è¿™é‡Œå°±ä¸ä¸€ä¸€åˆ—ä‹DåQŒæœ‰å…´è¶£çš„读者可以参考Prototype的源代码。这里重点讲讲如何ä‹É用Ajax.Request¾c»ï¼Œé¦–å…ˆ¾l™å‡ºä¸€ä¸ªæœ€½Ž€å•çš„Ajax.Request¾cȝš„应用½CÞZ¾‹åQŒå¦‚ä¾?-11所½Cºï¼Œæ³¨æ„½CÞZ¾‹ä¸­çš„黑体字ã€?/p>

ä¾?-11  Ajax.Request¾cÕdº”用示ä¾?/p>

Ajax.Request‹¹‹è¯•™åµé¢åQ?/strong>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

    <head>

        <title>chapter 3</title>

        <script type="text/javascript" language="javascript"

         src="prototype.js" ></script>

        <script type="text/javascript" language="javascript">

        function test() {

            // 创徏Ajax.Request对象åQŒå‘起一个Ajaxè¯äh±‚

            var myAjax = new Ajax.Request(

                'data.html', // è¯äh±‚çš„URL

                {

                    method: 'get',  // 使用GET方式发送HTTPè¯äh±‚

                    onComplete: showResponse // 指定è¯äh±‚成功完成旉™œ€è¦æ‰§è¡Œçš„æ–ÒŽ³•

                }

            );

        }

        function showResponse(response) {

            $('divResult').innerHTML = response.responseText;

        }

        </script>

    </head>

    <body>

    <input type="button" value="click" onclick="test()" />

    <div id="divResult" />

    </body>

</html>

data.htmlåQ?/strong>

<input type="text" id="name" />

<input type="button" value="Click Me" onclick="sayHi()">

Ajax.Request对象在初始化旉™œ€è¦æä¾›ä¸¤ä¸ªå‚敎ͼš½W?个参数是ž®†è¦è¯äh±‚™åµé¢çš„URLåQŒè¿™é‡Œä‹É用的data.html是一个普通的HTML静态页面;½W?个参数是Ajax操作的选项åQŒåœ¨Prototypeä¸­åÆˆæ²¡æœ‰ä¸“é—¨ä¸ºAjax操作选项定义一个类åQŒé€šå¸¸éƒ½æ˜¯åƒä¾‹2-11˜q™æ ·åQŒé€šè¿‡åŒ¿åå¯¹è±¡çš„æ–¹å¼è®¾¾|®Ajax操作的参数。在ä¾?-11中,Ajax操作选项å…ähœ‰ä¸¤ä¸ªå±žæ€§ï¼šmethod表示HTTPè¯äh±‚方式åQŒé»˜è®¤æ˜¯POST方式åQ›onComplete指定了Ajax操作完成以后åQˆå³XMLHttpRequest对象的statuså±žæ€§äØ“4æ—Óž¼‰åQŒé¡µé¢å°†è¦æ‰§è¡Œçš„函数。当ç„Óž¼ŒAjax操作˜q˜åŒ…括很多其他选项åQŒå¦‚è¡?-1所½Cºã€?/p>

è¡?-1  Ajax操作选项属性含ä¹?/p>

属性名¿U?/p>

含义

method

HTTPè¯äh±‚方式åQˆPOST/GET/HEADåQ‰ã€?/p>

parameters

在HTTPè¯äh±‚中传入的URL格式的值列表,即URL串中问号之后的部分ã€?/p>

asynchronous

是否做异步XMLHttpRequestè¯äh±‚ã€?/p>

postBody

在POSTè¯äh±‚方式下,传入è¯äh±‚体中的内宏V€?/p>

requestHeaders

和请求一赯‚¢«ä¼ å…¥çš„HTTP头部列表åQŒè¿™ä¸ªåˆ—表必™åÕd«æœ‰å¶æ•îC¸ª™å¹ç›®åQŒå› ä¸ºåˆ—表中每两™å¹äؓ一¾l„,分别代表自定义部分的名称和与之对应的字符串倹{€?/p>

onXXXXXXXX

在HTTPè¯äh±‚、响应的˜q‡ç¨‹ä¸­ï¼Œå½“XMLHttpRequest对象状态发生变化时调用的响应函数。响应函数有5个:onUninitialized、onLoading、onLoaded、onInteractiveå’ŒonComplete。传入这些函数的参数可以æœ?个,其中½W?个参数是执行HTTPè¯äh±‚çš„XMLHttpRequest对象åQŒç¬¬2个参数是包含被执行的X-JSON响应的HTTP头ã€?/p>

onSuccess

Ajax操作成功完成时调用的响应函数åQŒä¼ å…¥çš„参数与onXXXXXXXX相同ã€?/p>

onFailure

Ajax操作è¯äh±‚完成但出现错误时调用的响应函敎ͼŒä¼ å…¥çš„参æ•îC¸ŽonXXXXXXXX相同ã€?/p>

onException

Ajax操作发生异常情况时调用的响应函数åQŒå®ƒå¯ä»¥æŽ¥æ”¶2个参敎ͼŒå…¶ä¸­½W?个参数是执行HTTPè¯äh±‚çš„XMLHttpRequest对象åQŒç¬¬2个参数是异常对象ã€?/p>

2.3.4  Ajax.Updater¾c?/h3>

ä¾?-11使用Ajax.Request¾cÕd®žçŽîCº†™åµé¢çš„局部刷新效果,而这æ ïL±»ä¼¼çš„功能在Ajax应用中是¾lå¸¸ä½¿ç”¨çš„。因此,ä¸ÞZº†½Ž€åŒ–è¿™¿Uå·¥ä½œï¼ŒPrototype框架从Ajax.Requet¾cÖM¸­‹z„¡”Ÿå‡ÞZ¸€ä¸ªå­¾c Z€”—Ajax.Updater。与Ajax.Request相比åQŒAjax.Updater的初始化多了一个container参数åQŒè¯¥å‚数代表ž®†è¦æ›´æ–°çš„页面元素的id。例2-11的功能通过Ajax.Updater的实玎ͼŒä¼šå˜å¾—更加简单,如例2-12所½Cºã€?/p>

ä¾?-12  Ajax.Updater¾cȝš„应用½CÞZ¾‹

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

    <head>

        <title>chapter 3</title>

        <script type="text/javascript" language="javascript"

         src="prototype.js" ></script>

        <script type="text/javascript" language="javascript">

        function test() {

            var myAjax = new Ajax.Updater(

                'divResult', // 更新的页面元ç´?/strong>

                'data.html', // è¯äh±‚çš„URL

                {

                    method: 'get'

                }

            );

        }

        </script>

    </head>

    <body>

    <input type="button" value="click" onclick="test()" />

    <div id="divResult" />

    </body>

</html>

此外åQŒAjax.Updater¾c»è¿˜æœ‰å¦å¤–一个功能,如果è¯äh±‚的页面内容中包括JavaScript脚本åQŒAjax.Updater¾cÕd¯ä»¥æ‰§è¡Œå…¶ä¸­çš„脚本åQŒåªéœ€è¦åœ¨Ajax操作选项中增加属æ€?#8220;evalScripts: true”卛_¯ã€‚对ä¾?-11中的data.html˜q›è¡Œä¿®æ”¹åQŒåœ¨å…¶ä¸­åŠ å…¥JavaScript脚本åQŒå¦‚ä¾?-13所½Cºã€?/p>

ä¾?-13  data.html

<script language="javascript" type="text/javascript">

sayHi = function() {

    alert("Hello, " + $F('name') + "!");

}

</script>

<input type="text" id="name" />

<input type="button" value="Click Me" onclick="sayHi()">

调用Ajax.Updater的JavaScript脚本修改为:

function test() {

    var myAjax = new Ajax.Updater(

        'divResult', // 更新的页面元ç´?/p>

        'data.html', // è¯äh±‚çš„URL

        {

            method: 'get',

            evalScripts: true

        }

    );

}

˜q™æ ·ž®±å¯ä»¥ä‹É用data.html™åµé¢çš„内å®ÒŽ›´æ–°å½“前页面中çš?lt;div>元素divResultåQŒåƈ且执行data.html™åµé¢ä¸­åŒ…含的JavaScript脚本ã€?/p>

˜q™é‡Œéœ€è¦æ³¨æ„çš„æ˜¯ä¾‹2-13中sayHi函数的写法,如果写成

function sayHi() {

    alert("Hello, " + $F('name') + "!");

}

或�/p>

var sayHi = function() {

    alert("Hello, " + $F('name') + "!");

}

½E‹åºæ˜¯ä¸èƒ½æ­£å¸¸è¿è¡Œçš„。这是因为Ajax.Updater执行脚本是通过eval的方式,而不是将脚本内容引入到当前页面,直接声明的function sayHi或者用var声明的sayHi函数åQŒå…¶ä½œç”¨åŸŸåªæ˜¯åœ¨˜q™æ®µè„šæœ¬å†…éƒ¨åQŒå¤–部的其他脚本不能讉K—®sayHi函数。而按照例2-13的方式声明的函数åQŒå…¶ä½œç”¨åŸŸæ˜¯æ•´ä¸ªwindowã€?/p>

2.3.5  Ajax.PeriodicalUpdater¾c?/h3>

å’ŒAjax.Request¾cȝ›¸ä¼û|¼ŒAjax.PeriodicalUpdater¾cÖM¹Ÿ¾l§æ‰¿è‡ªAjax.Base¾c…R€‚在一些Ajax应用中,需要周期性地更新某些™åµé¢å…ƒç´ åQŒä¾‹å¦‚天气预报、即时新é—ȝ­‰½{‰ã€‚实现这æ ïLš„功能通常要ä‹É用JavaScript中的定时器函数setTimeout、clearTimeout½{‰ï¼Œè€Œæœ‰äº†Ajax.PeriodicalUpdater¾cÕd¯ä»¥å¾ˆå¥½åœ°½Ž€åŒ–è¿™¾cȝ¼–码工作ã€?/p>

新徏一个Ajax. PeriodicalUpdater¾cȝš„实例需要指å®?个参敎ͼš

l  containeråQšå°†è¦æ›´æ–°çš„™åµé¢å…ƒç´ idåQ?/p>

l  urlåQšè¯·æ±‚çš„URL地址åQ?/p>

l  optionsåQšAjax操作选项ã€?/p>

å’ŒAjax.Updater¾cȝ›¸ä¼û|¼ŒAjax.PeriodicalUpdater¾cÖM¹Ÿæ”¯æŒåŠ¨æ€æ‰§è¡ŒJavaScript脚本åQŒåªéœ€åœ¨Ajax操作选项中增加(evalScripts: trueåQ‰å±žæ€§å€¼å³å¯ã€?/p>

Ajax.PeriodicalUpdater¾cÀL”¯æŒä¸¤ä¸ªç‰¹ŒDŠçš„Ajax操作选项åQšfrequencyå’Œdecay。frequency参数很容易理解,既然是定时更新页面元素,或者定时执行脚本,那么多长旉™—´æ›´æ–°æˆ–者执行一‹Æ¡å‘¢åQŸfrequency指的ž®±æ˜¯ä¸¤æ¬¡Ajax操作之间的时间间隔,单位是秒åQŒé»˜è®¤å€égØ“2¿U’ã€?/p>

如果仅指定frequency参数åQŒç¨‹åºä¼šæŒ‰ç…§å›ºå®šçš„æ—¶é—´é—´é𔿉§è¡ŒAjax操作。这æ ïLš„æ›´æ–°½{–略合理吗?½{”案取决于请求URL中数据的更新频率。如果请求的数据会很有规律地按照固定频率改变åQŒé‚£ä¹ˆåªè¦è®¾¾|®ä¸€ä¸ªåˆé€‚çš„frequencyå€û|¼Œž®±å¯ä»¥å¾ˆæœ‰æ•ˆåœ°å®žçŽ°é¡µé¢çš„å®šæ—¶æ›´æ–°ã€‚ç„¶è€Œå®žé™…åº”ç”¨ä¸­çš„æ•°æ®å¾€å¾€ä¸ä¼šé‚£ä¹ˆç†æƒ³åQŒä¾‹å¦‚新闻,可能在一天中只有特定的一ŒD‰|—¶é—´æ›´æ–°é¢‘率会很高åQŒè€Œåœ¨å…¶ä»–æ—‰™—´åˆ™å‡ ä¹Žæ²¡æœ‰å˜åŒ–。经帔R‡åˆ°è¿™æ ïLš„æƒ…况该怎么办呢åQŸAjax.PeriodicalUpdater¾cÀL”¯æŒçš„decayå±žæ€§å°±æ˜¯äØ“äº†è§£å†Œ™¿™ä¸ªé—®é¢˜è€Œäñ”生的。当option中带有decay属性时åQŒå¦‚果请求返回的数据与上‹Æ¡ç›¸åŒï¼Œé‚£ä¹ˆä¸‹æ¬¡˜q›è¡ŒAjax操作的时间间隔会乘以一个decay的系数ã€?/p>

ä¸ÞZº†æ¯”较明显地看到decay属性的效果åQŒåœ¨è¯äh±‚的测试页面中加入记录旉™—´çš„脚本,代码如例2-14所½Cºã€?/p>

ä¾?-14  Ajax.PeriodicalUpdater¾cÕdº”用示ä¾?/p>

ex10.htmlåQ?/strong>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

    <head>

        <title>chapter 3</title>

        <script type="text/javascript" language="javascript"

         src="prototype.js" ></script>

        <script type="text/javascript" language="javascript">

        var str='';

        var intcount=0;

        function test() {

            var myAjax = new Ajax.PeriodicalUpdater(

                'divResult', // 定时更新的页面元ç´?/p>

                'script1.html', // è¯äh±‚çš„URL

                {

                    method: 'get', // HTTPè¯äh±‚çš„æ–¹å¼äØ“GET

                    evalScripts: true, // 是否执行è¯äh±‚™åµé¢ä¸­çš„脚本

                    frequency: 1, // 更新的频çŽ?/p>

                    decay: 1 // 衰减¾pÀL•°

                }

            );

        }

        </script>

    </head>

    <body>

    <input type="button" value="click" onclick="test()" />

    <div id="divResult" ></div>

    <div id="divResult2" ></div>

    </body>

</html>

script1.html:

<script language="javascript" type="text/javascript">

// Ajax.PeriodicalUpdater调用函数计数

// åœ?lt;div>元素divResult2中增加一行结果,òq¶è®°å½•当前时间和

// Ajax.PeriodicalUpdater的调用次�/p>

intcount++;

str = $('divResult2').innerHTML;

$('divResult2').innerHTML = str + "count = " + intcount+ ": " + new Date() + "<br>";

</script>

ä¾?-14的运行结果如å›?-4所½Cºã€?/p>

å›?-4  Ajax.PeriodicalUpdater¾cÕdº”用示ä¾?/p>

可以看到åQŒç”±äºŽè¯·æ±‚返回的数据一直没有发生变化,每次è¯äh±‚æ—‰™—´çš„间隔是上一‹Æ¡çš„2倍(decay=2åQ‰ã€‚如果某一‹Æ¡è¯·æ±‚返回的数据发生了变化,那么执行è¯äh±‚的时间间隔则恢复到初始倹{€?/p>

2.3.6  Ajax.Responders对象

Ajax.Responders对象¾l´æŠ¤äº†ä¸€ä¸ªæ­£åœ¨è¿è¡Œçš„Ajax对象列表åQŒåœ¨éœ€è¦å®žçŽîC¸€äº›å…¨å±€çš„功能时ž®±å¯ä»¥ä‹É用它。例如,在Ajaxè¯äh±‚发出以后需要提½Cºç”¨æˆäh“ä½œæ­£åœ¨æ‰§è¡Œä¸­åQŒè€Œæ“ä½œè¿”回以后则取消提示。利用Ajax.Responders对象ž®±å¯ä»¥å®žçŽ°è¿™æ ïLš„功能åQŒå¦‚ä¾?-15所½Cºã€?/p>

ä¾?-15  Ajax.Responders对象应用½CÞZ¾‹

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

    <head>

        <title>chapter 3</title>

        <script type="text/javascript" language="javascript"

         src="prototype.js" ></script>

        <script type="text/javascript" language="javascript">

        function test() {

            var myAjax = new Ajax.Request(

                'data.html',

                {

                    method: 'get',

                    onComplete: showResponse

                }

            );

        }

        function showResponse(response) {

            $('divResult').innerHTML = response.responseText;

        }      

        var handle = {

            onCreate: function() {

                Element.show('loading'); // 当创建Ajaxè¯äh±‚æ—Óž¼Œæ˜„¡¤ºloading

            },

            onComplete: function() {

                // 当请求成功返回时åQŒå¦‚果当前没有其他正在运行中的Ajaxè¯äh±‚åQŒéšè—loading

                if (Ajax.activeRequestCount == 0) {

                    Element.hide('loading');

                }

            }

        };

        // ž®†handle注册到全局的Ajax.Responders对象中,使其生效

        Ajax.Responders.register(handle);

        </script>

    </head>

    <body>

    <input type="button" value="click" onclick="test()" />

    <div id="divResult" ></div>

    <div id='loading' style="display:none">

        <img src="loading.gif">Loading...

    </div>

    </body>

</html>

ä¾?-15中定义了一个handle对象åQŒå…¶ä¸­åŒ…含onCreateå’ŒonComplete函数。页面中发出ä»ÖM½•一个Ajaxè¯äh±‚æ—‰™ƒ½ä¼šè°ƒç”¨onCreateæ–ÒŽ³•åQŒè€Œè¯·æ±‚完成时都会调用onCompleteæ–ÒŽ³•。例2-15的运行结果如å›?-5所½Cºã€?br />



]]>对xml˜q›è¡Œå¢žã€åˆ ã€æ”¹çš„很好例å­?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/feingto/archive/2007/12/29/171559.html</guid><wfw:comment>http://www.aygfsteel.com/feingto/comments/171559.html</wfw:comment><comments>http://www.aygfsteel.com/feingto/archive/2007/12/29/171559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/feingto/comments/commentRss/171559.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/feingto/services/trackbacks/171559.html</trackback:ping><description><![CDATA[rule.hta<br /> ================<br /> <br /> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><br /> <HTML><br /> <HEAD><br /> <TITLE>XML Editer</TITLE><br /> <HTA:APPLICATION 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 /> ><br /> <br /> <style type="text/css"><br /> </style><br /> </HEAD><br /> <br /> <script language="javascript"><br /> <br /> // load the xml file<br /> var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");<br /> xmlDoc.async = false;<br /> xmlDoc.resolveExternals = false;<br /> xmlDoc.load("rule.xml");<br /> <br /> // load the xsl file<br /> var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");<br /> xslDoc.async = false;<br /> xslDoc.resolveExternals = false;<br /> xslDoc.load("rule.xsl");<br /> <br /> // create the xslt object<br /> var xslt = new ActiveXObject("Msxml2.XSLTemplate");<br /> xslt.stylesheet = xslDoc;<br /> var xslProc = xslt.createProcessor();<br /> xslProc.input = xmlDoc;<br /> <br /> var checked_count = 0;<br /> var cur_page = 1;<br /> var total_page = 1;<br /> <br /> function OutputDocument(number){<br /> xslProc.addParameter("ename", number);<br /> xslProc.addParameter("startno", (cur_page - 1)*10);<br /> xslProc.addParameter("endno", cur_page*10);<br /> xslProc.transform();<br /> <br /> return xslProc.output;<br /> }<br /> <br /> function delete_node(node){<br /> if( node.hasChildNodes() ) { <br /> var kids = node.childNodes; <br /> for(var i=0;i<kids.length;i++) { <br /> delete_node(kids);<br /> }<br /> }<br /> node.parentNode.removeChild(node);<br /> }<br /> <br /> function delete_rule(id){<br /> var node = xmlDoc.selectSingleNode("/rules/rule[event/id="+id+"]");<br /> delete_node(node);<br /> }<br /> <br /> function modify_node(node){<br /> node.selectSingleNode("event/id").text = modify_id.value;<br /> node.selectSingleNode("event/name").text = modify_name.value;<br /> if( modify_state.checked ) {<br /> node.selectSingleNode("enable").text = "true";<br /> } else {<br /> node.selectSingleNode("enable").text = "false";<br /> }<br /> }<br /> <br /> function modify_rule(id){<br /> var node = xmlDoc.selectSingleNode("/rules/rule[event/id="+id+"]");<br /> modify_node(node);<br /> }<br /> <br /> function add_rule(){<br /> var id = xmlDoc.createElement("id");<br /> id.appendChild(xmlDoc.createTextNode(add_id.value));<br /> var name = xmlDoc.createElement("name");<br /> name.appendChild(xmlDoc.createTextNode(add_name.value));<br /> <br /> var event = xmlDoc.createElement("event");<br /> event.appendChild(id);<br /> event.appendChild(name);<br /> <br /> var enable = xmlDoc.createElement("enable");<br /> if( add_state.checked ) {<br /> enable.appendChild(xmlDoc.createTextNode("true"));<br /> } else {<br /> enable.appendChild(xmlDoc.createTextNode("false"));<br /> }<br /> <br /> var rule = xmlDoc.createElement("rule");<br /> rule.appendChild(event);<br /> rule.appendChild(enable);<br /> <br /> var parent = xmlDoc.selectSingleNode("/rules");<br /> if( parent.hasChildNodes() ) {<br /> parent.insertBefore(rule, parent.firstChild);<br /> } else {<br /> parent.appendChild(rule);<br /> }<br /> }<br /> <br /> function gotoPage(pageno){<br /> if( pageno < 1 ) {<br /> cur_page = 1;<br /> } else if( pageno >= total_page ) {<br /> cur_page = total_page;<br /> } else {<br /> cur_page = pageno;<br /> }<br /> Transform();<br /> }<br /> <br /> function saveXML(){<br /> xmlDoc.save("rule.xml");<br /> }<br /> <br /> function protectsubmit(val){<br /> if( val == 1 ) { //add<br /> if( add_id.value < 10000 || add_name.value == "" ) {<br /> window.alert("事äšg号必™åÀL˜¯5位整æ•îC¸”事äšgåä¸èƒ½äØ“½I?);<br /> } else if( xmlDoc.selectSingleNode("/rules/rule/event/id[. = " + add_id.value + "]") ) {<br /> window.alert("事äšgå? + add_id.value + "已经存在");<br /> } else {<br /> add_rule();<br /> saveXML();<br /> Transform();<br /> }<br /> } else if( val == 2 ) { //modify<br /> var id = viewTable.rows[getFirstCheckedLine()].cells[2].innerText;<br /> if( modify_id.value < 10000 || modify_name.value == "" ) {<br /> window.alert("事äšg号必™åÀL˜¯5位整æ•îC¸”事äšgåä¸èƒ½äØ“½I?);<br /> } else if( id != modify_id.value && xmlDoc.selectSingleNode("/rules/rule/event/id[. = " + modify_id.value + "]") ) {<br /> window.alert("事äšgå? + modify_id.value + "已经存在");<br /> } else {<br /> if( confirm("¼‹®è®¤ä¿®æ”¹åQ?) ) {<br /> modify_rule(id);<br /> saveXML();<br /> Transform();<br /> }<br /> }<br /> } else if( val == 3 ) { //delete<br /> if( !confirm("¼‹®è®¤åˆ é™¤åQ?) ) {<br /> return;<br /> }<br /> for( var i = 1; i < viewTable.rows.length; i++ ) {<br /> var id = viewTable.rows.cells[2].innerText;<br /> if( eval("viewchk_" + id + ".checked") == true ) {<br /> delete_rule(id)<br /> }<br /> }<br /> saveXML();<br /> Transform();<br /> } else if( val == 4 ) { //select all<br /> checked_count = viewTable.rows.length - 1;<br /> for( var i = 1; i < viewTable.rows.length; i++ ) {<br /> var id = viewTable.rows.cells[2].innerText;<br /> eval("viewchk_" + id + ".checked = true");<br /> }<br /> changeState();<br /> } else if( val == 5 ) { //cancel all<br /> checked_count = 0;<br /> for( var i = 1; i < viewTable.rows.length; i++ ) {<br /> var id = viewTable.rows.cells[2].innerText;<br /> eval("viewchk_" + id + ".checked = false");<br /> }<br /> changeState();<br /> }<br /> }<br /> <br /> function getFirstCheckedLine(){<br /> for( var i = 1; i < viewTable.rows.length; i++ ) {<br /> var id = viewTable.rows.cells[2].innerText;<br /> if( eval("viewchk_" + id + ".checked") == true ) {<br /> return i;<br /> }<br /> }<br /> return 0;<br /> }<br /> <br /> function checkOVItem(val){<br /> if( eval("viewchk_" + val+".checked") == true ) {<br /> checked_count++;<br /> } else {<br /> checked_count--;<br /> }<br /> changeState();<br /> }<br /> <br /> function changeState(){<br /> if( checked_count ) {<br /> delete_btn.disabled = false;<br /> cancel_all_btn.disabled = false;<br /> } else {<br /> delete_btn.disabled = true;<br /> cancel_all_btn.disabled = true;<br /> }<br /> if( (checked_count + 1) == viewTable.rows.length ) {<br /> select_all_btn.disabled = true;<br /> } else {<br /> select_all_btn.disabled = false;<br /> }<br /> <br /> if( checked_count == 1 ) {<br /> modify_btn.disabled = false;<br /> modify_id.disabled = false;<br /> modify_name.disabled = false;<br /> modify_state.disabled = false;<br /> var id = getFirstCheckedLine();<br /> modify_id.value = viewTable.rows(id).cells(2).innerText;<br /> modify_name.value = viewTable.rows(id).cells(3).innerText;<br /> if( viewTable.rows(id).cells(1).innerText == "有效" ) {<br /> modify_state.checked = true;<br /> } else {<br /> modify_state.checked = false;<br /> }<br /> } else {<br /> modify_btn.disabled = true;<br /> modify_id.disabled = true;<br /> modify_name.disabled = true;<br /> modify_state.disabled = true;<br /> modify_id.value="请选择一条规åˆ?;<br /> modify_name.value="请选择一条规åˆ?;<br /> }<br /> }<br /> <br /> function showPageInfo(){<br /> if( total_item.value == 0 ) {<br /> total_page = 1;<br /> } else {<br /> total_page = Math.floor((9 + parseInt(total_item.value)) / 10);<br /> }<br /> var txt = " å…?+total_item.value+"条记å½?;<br /> var prev_page = cur_page - 1;<br /> var next_page = parseInt(cur_page) + 1;<br /> if( cur_page > 1 ) {<br /> txt += " <input type='button' value='<' onClick='gotoPage(" + prev_page + ")'/>"<br /> } else {<br /> txt += " <input type='button' value='<' onClick='gotoPage(" + prev_page + ")' disabled/>"<br /> }<br /> if( cur_page < total_page ) {<br /> txt += " <input type='button' value='>' onClick='gotoPage(" + next_page + ")'/>"<br /> } else {<br /> txt += " <input type='button' value='>' onClick='gotoPage(" + next_page + ")' disabled/>"<br /> }<br /> <br /> txt += " ½W?lt;input type='text' id='page_number' size='4' maxlength='4' value='" + cur_page + "' onBlur='gotoPage(this.value)'/>™å?nbsp;å…? + total_page + "™å?;<br /> page_info.innerHTML = txt;<br /> // window.alert(txt);<br /> }<br /> <br /> function Transform(){<br /> var txt = document.getElementById("ename").value;<br /> var str = OutputDocument(txt);<br /> rule_list.innerHTML = str;<br /> checked_count = 0;<br /> showPageInfo();<br /> changeState();<br /> // window.alert(str);<br /> }<br /> </script><br /> <br /> <BODY onLoad="Transform()"><br /> <br /> <table width="550" border="1" cellpadding="0" cellspacing="0" style="border-collapse:collapse;"><br /> <tr><br /> <td><br /> <table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-collapse:collapse;"><br /> <TR height=5><td colspan=10 style="font-size:0px;"></td></TR><br /> <TR height=25><br /> <td colspan=3 align=center>事äšg名包å?</td><br /> <td colspan=3 align=center><input type="text" value="" id="ename" size="35" maxlength="16"/></td><br /> <td colspan=4><input type="button" value="搜烦" onClick="Transform()"/></td><br /> </TR><br /> <TR height=1><td colspan=10 bgcolor=#2b7297></td></TR><br /> <TR height=30><br /> <td width=45 align=center><b>æ·ÕdŠ </b></td><br /> <td width=5 align=center><font color=gray>|</font></td><br /> <td width=50 align=center>事äšgå?lt;/td><br /> <td width=55 align=center><input type="text" name="add_id" value="" size="5" maxlength="5" onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')"></td><br /> <td width=55 align=center>事äšgå?lt;/td><br /> <td width=* align=center><input type="text" name="add_name" maxlength="48" value=""></td><br /> <td width=70 align=center>是否使用</td><br /> <td width=30 align=center><br /> <input type='checkbox' name='add_state' checked><br /> </td> <br /> <td width=5 align=center><font color=gray>|</font></td><br /> <td width=70 align=center><input type="button" name="add_btn" value="¼‹®å®š" onClick="protectsubmit(1)"></td><br /> </TR><br /> <TR height=1><td colspan=10 bgcolor=#2b7297></td></TR><br /> <TR height=30><br /> <td width=45 align=center><b>修改</b></td><br /> <td width=5 align=center><font color=gray>|</font></td><br /> <td width=50 align=center>事äšgå?lt;/td><br /> <td width=55 align=center><br /> <input type="text" name="modify_id" value="<请选择一条规åˆ?gt;" size="5" maxlength="5" onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')" disabled></td><br /> <td width=55 align=center>事äšgå?lt;/td><br /> <td width=* align=center><br /> <input type="text" name="modify_name" maxlength="48" value="<请选择一条规åˆ?gt;" disabled></td><br /> <td width=70 align=center>是否使用</td><br /> <td width=30 align=center><br /> <input type='checkbox' name='modify_state' disabled><br /> </td> <br /> <td width=5 align=center><font color=gray>|</font></td><br /> <td width=70 align=center><input type="button" name="modify_btn" value="¼‹®å®š" onClick="protectsubmit(2)"></td><br /> </TR><br /> <TR height=1><td colspan=10 bgcolor=#2b7297></td></TR><br /> <TR height=30><br /> <td colspan=5 align=left class=tablefont></td><br /> <td align=right><input type="button" name="select_all_btn" value="全部选择" onClick="protectsubmit(4)"></td><br /> <td colspan=2 align=right><input type="button" name="cancel_all_btn" value="全部不é€? onClick="protectsubmit(5)" disabled></td><br /> <td align=center></td><br /> <td align=center><input type="button" name="delete_btn" value="删除" onClick="protectsubmit(3)" disabled></td><br /> </TR><br /> <TR height=30><td colspan=4>规则列表</td><TD colspan=6 align=right><div id="page_info" name="page_info"/></TR><br /> <TR><br /> <TD colspan=10><div id="rule_list" name="rule_list"/></TD><br /> </TR><br /> <TR height=5><td colspan=10></td></TR><br /> </table><br /> </td><br /> </tr><br /> <tr><br /> </tr><br /> </table><br /> <br /> </BODY><br /> </HTML><br /> <br /> <br /> rule.xml<br /> ============<br /> <?xml version="1.0" encoding="GB2312"?><br /> <?xml:stylesheet type="text/xsl" href="rule.xsl"?><br /> <rules><br /> <rule><br /> <event><br /> <id>10001</id><br /> <name>TFTP下蝲文äšg</name><br /> </event><br /> <enable>false</enable><br /> </rule><br /> <rule><br /> <event><br /> <id>10002</id><br /> <name>TFTP上传文äšg</name><br /> </event><br /> <enable>false</enable><br /> </rule><br /> <rule><br /> <event><br /> <id>10003</id><br /> <name>telnetç™Õd½•成功</name><br /> </event><br /> <enable>false</enable><br /> </rule><br /> <br /> </rules><br /> <br /> rule.xsl<br /> =============<br /> <?xml version="1.0" encoding="GB2312"?><br /> <xsl:stylesheet version="1.0" xmlns:xsl="<a target="_blank">http://www.w3.org/1999/XSL/Transform</a>"><br /> <xsl:strip-space elements="*"/><br /> <xsl:output method= "html"/><br /> <xsl:param name="ename">undefined</xsl:param><br /> <xsl:param name="startno">undefined</xsl:param><br /> <xsl:param name="endno">undefined</xsl:param><br /> <br /> <xsl:template match="/"><br /> <html><br /> <body><br /> <xsl:apply-templates select="rules"/><br /> </body><br /> </html><br /> </xsl:template><br /> <br /> <xsl:template match="rules"><br /> <input type="hidden" name="total_item"><br /> <xsl:attribute name="value"><xsl:value-of select="count(rule[contains(event/name, $ename)])"/></xsl:attribute><br /> </input><br /> <TABLE id="viewTable" name="viewTable" width="100%" border="1" bordercolor="#85979f" cellSpacing="0" cellPadding="0" style="border-collapse:collapse;"><br /> <tr height="25"><br /> <TD width="10%" align="center">选择</TD><br /> <TD width="10%" align="center">状æ€?lt;/TD><br /> <TD width="10%" align="center">事äšgå?lt;/TD><br /> <TD width="*" align="center">事äšgå?lt;/TD><br /> </tr><br /> <br /> <xsl:for-each select='rule[contains(event/name, $ename)]'><br /> <xsl:sort select="event/id"/><br /> <xsl:if test="position()> $startno and position()<= $endno"><br /> <tr><br /> <td align="center"><br /> <input type='checkbox'><br /> <xsl:attribute name="name">viewchk_<xsl:value-of select="event/id"/></xsl:attribute><br /> <xsl:attribute name="value"><xsl:value-of select="event/id"/></xsl:attribute><br /> <xsl:attribute name="onClick">checkOVItem(<xsl:value-of select="event/id"/>)</xsl:attribute><br /> </input><br /> </td><br /> <xsl:choose><br /> <xsl:when test="enable[. = 'true']"><br /> <td align="center">有效</td><br /> </xsl:when><br /> <xsl:otherwise><br /> <td align="center">¼›ç”¨</td><br /> </xsl:otherwise><br /> </xsl:choose><br /> <td align="center"><xsl:value-of select="event/id"/></td><br /> <td><xsl:value-of select="event/name"/></td><br /> </tr><br /> </xsl:if><br /> </xsl:for-each><br /> </TABLE><br /> </xsl:template><br /> <br /> </xsl:stylesheet><br /> <img src ="http://www.aygfsteel.com/feingto/aggbug/171559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/feingto/" target="_blank">feingto</a> 2007-12-29 15:44 <a href="http://www.aygfsteel.com/feingto/archive/2007/12/29/171559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js 1.4版开发者手å†?强烈推荐) http://www.aygfsteel.com/feingto/archive/2007/12/29/171538.htmlfeingtofeingtoSat, 29 Dec 2007 06:59:00 GMThttp://www.aygfsteel.com/feingto/archive/2007/12/29/171538.htmlhttp://www.aygfsteel.com/feingto/comments/171538.htmlhttp://www.aygfsteel.com/feingto/archive/2007/12/29/171538.html#Feedback0http://www.aygfsteel.com/feingto/comments/commentRss/171538.htmlhttp://www.aygfsteel.com/feingto/services/trackbacks/171538.html阅读全文

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ³¤´ºÊÐ| »ôÖÝÊÐ| ±£¿µÏØ| ÇúËÉÏØ| Çø¡£| ͨ³ÇÏØ| ÐÂÃñÊÐ| Î÷ÏçÏØ| Å©°²ÏØ| ÁéèµÏØ| °¢°ÓÏØ| ÅîÏªÏØ| ÐÂç­ÏØ| ÁúȪÊÐ| ·ïÑôÏØ| ¹®ÒåÊÐ| ´ÈϪÊÐ| ´óÌïÏØ| ÍòÈ«ÏØ| ºø¹ØÏØ| °ºÈÊÏØ| ¡»ØÏØ| ƽ¶ÈÊÐ| ξÊÏÏØ| ¶«¹âÏØ| ¿µ¶¨ÏØ| ·Ê¶«ÏØ| ºìºÓÏØ| ±¦·áÏØ| ÒËÀ¼ÏØ| ß®ÑôÏØ| °²¿µÊÐ| ËÄ×ÓÍõÆì| ÑǶ«ÏØ| ÇåºÓÏØ| ²ÔÉ½ÏØ| ³£µÂÊÐ| Èʲ¼ÏØ| »ª³ØÏØ| ºÍÁÖ¸ñ¶ûÏØ| À¥É½ÊÐ|