﻿<?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>IT博客网-CoffeeCat's IT Blog</title><link>http://www.cnitblog.com/CoffeeCat/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 20 Nov 2008 20:44:18 GMT</lastBuildDate><pubDate>Thu, 20 Nov 2008 20:44:18 GMT</pubDate><ttl>60</ttl><item><title>我的千千静听网页版发布了</title><link>http://www.cnitblog.com/CoffeeCat/archive/2008/09/14/49090.html</link><dc:creator>CoffeeCat</dc:creator><author>CoffeeCat</author><pubDate>Sun, 14 Sep 2008 14:26:00 GMT</pubDate><guid>http://www.cnitblog.com/CoffeeCat/archive/2008/09/14/49090.html</guid><wfw:comment>http://www.cnitblog.com/CoffeeCat/comments/49090.html</wfw:comment><comments>http://www.cnitblog.com/CoffeeCat/archive/2008/09/14/49090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/CoffeeCat/comments/commentRss/49090.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/CoffeeCat/services/trackbacks/49090.html</trackback:ping><description><![CDATA[<h4>千千静听网页版（FXPlayer 0.4 测试版）</h4>
<br><span style="font-weight: bold;">版本信息</span><br>&nbsp;&nbsp;&nbsp; * 作者 - Ferris Xu<br>&nbsp;&nbsp;&nbsp; * 版本号 - 0.4 测试版<br>&nbsp;&nbsp;&nbsp; * 更新时间 - 2008年02月01日<br>&nbsp;&nbsp;&nbsp; * 兼容的浏览器：IE,Firefox 2.x<br><br><span style="font-weight: bold;">特点</span><br>&nbsp;&nbsp;&nbsp; * 纯Javascript的实现，无需任何第3方的JS框架）<br>&nbsp;&nbsp;&nbsp; * 面向对象的架构设计，自定义播放器事件<br>&nbsp;&nbsp;&nbsp; * 自定义UI组件，可拖动，缩放窗口<br>&nbsp;&nbsp;&nbsp; * 兼容IE和Firefox2.x<br>&nbsp;&nbsp;&nbsp; * 提供了音量，进度等控制，界面和千千静听完全一致<br>&nbsp;&nbsp;&nbsp; * 兼容千千静听5.0的播放列表，基本兼容千千静听的皮肤，能在播放时切换皮肤<br>&nbsp;&nbsp;&nbsp; * 播放时动态歌词的显示<br><br><span style="font-weight: bold;">说明</span><br>&nbsp;&nbsp;&nbsp; * <span style="font-weight: bold;">本程序仅用于演示，以及Javascript技术的学习和交流，不会进行任何商业行为。</span><br>&nbsp;&nbsp;&nbsp; * 由于时间的关系，本程序在播放列表功能上没有全部完成。<br>&nbsp;&nbsp;&nbsp; * 由于千千静听的皮肤是一个压缩包，并且里面的图片都是BMP的，在网页上无法使用，所以本程序所兼容的是已经解压缩的，并且将所有图片都转换成网页格式的图片（如gif）。<br>&nbsp;&nbsp;&nbsp; * 由于Firefox3在WMP插件的事件捕捉上存在Bug，因此本程序不能在Firefox3上面正确运行<br>&nbsp;&nbsp;&nbsp; * <span style="font-weight: bold;">处于对千千静听的喜爱，我开发了它的JS版本，并取名为千千静听网页版。若有不妥，请告知，谢谢。</span><br><br><br><span style="font-weight: bold;">效果截图</span><br><img style="width: 629px; height: 456px;" src="http://www.cnitblog.com/images/cnitblog_com/coffeecat/snap.JPG" border="0"><br><br><br><span style="font-weight: bold;">演示地址</span><br><a target="_blank" href="http://www.coffeecat.net.cn/web/fxplayer">http://www.CoffeeCat.net.cn/web/fxplayer</a><br><br><span style="font-weight: bold;">程序下载</span><br><a href="http://www.cnitblog.com/Files/CoffeeCat/fxplayer0.4.rar">http://www.cnitblog.com/Files/CoffeeCat/fxplayer0.4.rar</a><br>       <img src ="http://www.cnitblog.com/CoffeeCat/aggbug/49090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/CoffeeCat/" target="_blank">CoffeeCat</a> 2008-09-14 22:26 <a href="http://www.cnitblog.com/CoffeeCat/archive/2008/09/14/49090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个在IE中报语法错误但在Firefox下却能正常运行的JS范例</title><link>http://www.cnitblog.com/CoffeeCat/archive/2008/09/02/48642.html</link><dc:creator>CoffeeCat</dc:creator><author>CoffeeCat</author><pubDate>Tue, 02 Sep 2008 07:26:00 GMT</pubDate><guid>http://www.cnitblog.com/CoffeeCat/archive/2008/09/02/48642.html</guid><wfw:comment>http://www.cnitblog.com/CoffeeCat/comments/48642.html</wfw:comment><comments>http://www.cnitblog.com/CoffeeCat/archive/2008/09/02/48642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/CoffeeCat/comments/commentRss/48642.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/CoffeeCat/services/trackbacks/48642.html</trackback:ping><description><![CDATA[最近在写一个JS程序，遇到这样一个问题，请看代码：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;myobject&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{};<br>myobject.</span><span style="color: #0000ff;">delete</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;alert&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">call&nbsp;delete</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>};<br>myobject.</span><span style="color: #0000ff;">delete</span><span style="color: #000000;">();</span></div>
<br><br>&nbsp;&nbsp;&nbsp; 这段代码从思想上没有任何问题，定义1个对象myobject，并且给它一个删除的方法名为delete，最后调用delete方法。这段代码在Firefox下能正常运行，但在IE下却报语法错误。原因相信大家也发现了，IE把delete看成是关键字了，而Firefox会把delete看成是myobject对象里的一个方法。所以，把delete方法改名字就对了，以后尽量不要用JS关键字做方法名，如new,delete等<br><br>&nbsp;&nbsp;&nbsp; 因此，如果您在写JS程序时，遇到Firefox正常，但IE报语法错误，通常情况下，都是您使用了delete或者new关键字定义了方法名，您可以从这方面下手debug。<br><br>&nbsp;&nbsp;&nbsp; 最后聊点题外话，介绍一下JS在Firefox以及IE下的调试工具。Firefox下就不说了，有大名鼎鼎的<a  href="https://addons.mozilla.org/zh-CN/firefox/addon/1843">Firebug</a>，这款工具不仅查看DOM结构，JS错误信息等，最重要的它能够监视网络的数据。IE下的调试工具也不少，微软的IE Developer Toolbar和Firebug挺类似的，只是它没有监视网络数据的功能，这对调试Ajax代码比较不好。调试JS的工具我觉得最好的是Companion JS，我觉得它是IE下最好的JS调试工具，它能够准确定位到出错的JS代码，而且它是免费的。如果没有Companion，我可能需要更多的时间才能找到罪魁祸首delete的。另外，Firebug也有IE版的，不过IE版的Firebug是完全用JS写的，处理速度十分缓慢，特别是分析DOM树、分析CSS等，速度奇慢，缺少实用性，而且Firebug for IE不能检测网络数据。<br><br><br><br>Ferris<br>2008-09-02<br><br><img src ="http://www.cnitblog.com/CoffeeCat/aggbug/48642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/CoffeeCat/" target="_blank">CoffeeCat</a> 2008-09-02 15:26 <a href="http://www.cnitblog.com/CoffeeCat/archive/2008/09/02/48642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>讨论Smarty中注释的方法</title><link>http://www.cnitblog.com/CoffeeCat/archive/2008/08/14/47992.html</link><dc:creator>CoffeeCat</dc:creator><author>CoffeeCat</author><pubDate>Thu, 14 Aug 2008 05:10:00 GMT</pubDate><guid>http://www.cnitblog.com/CoffeeCat/archive/2008/08/14/47992.html</guid><wfw:comment>http://www.cnitblog.com/CoffeeCat/comments/47992.html</wfw:comment><comments>http://www.cnitblog.com/CoffeeCat/archive/2008/08/14/47992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/CoffeeCat/comments/commentRss/47992.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/CoffeeCat/services/trackbacks/47992.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; Smarty的注释方式是将注释内容写在成对的星号中，如<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">{</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;这里是注释文本&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">}</span></div>
<br><br>&nbsp;&nbsp;&nbsp; 当然，也可以这样<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">{</span><span style="color: #000000;">*</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;这里是第1行注释文本<br>&nbsp;&nbsp;&nbsp;这里是第2行注释文本<br></span><span style="color: #000000;">*</span><span style="color: #000000;">}</span></div>
<br>&nbsp;&nbsp;&nbsp; 在Smarty手册里将第2种方法称为Multiline smarty comment（多行注释）。这种一般用于说明Smarty程序的含义，而不是起到隐藏客户端代码的功能。<br><br>&nbsp;&nbsp;&nbsp; 下面要讨论一种特殊的多行注释的方法，请先看下面的例子<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&lt;</span><span style="color: #000000;">div</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp; {&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$con</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">&nbsp;}<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一些HTML代码或者是含有Javascript的代码<br>&nbsp;&nbsp;&nbsp; {&nbsp;</span><span style="color: #000000;">/</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;}<br></span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">div</span><span style="color: #000000;">&gt;</span></div>
&nbsp;&nbsp;&nbsp; 这是一段HTML代码，其中使用了Smarty进行了逻辑控制。但是，现在我们暂时不想让客户端显示这段代码，那么最好的方法就是将整个div注释掉。您可能会想到<br><br><span style="color: #000000;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">{&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;}<br></span><span style="color: #000000;">&lt;</span><span style="color: #000000;">div</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$con</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一些HTML代码或者是含有Javascript的代码<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #000000;">/</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;}<br></span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">div</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>{&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;}</span></div>
</span>&nbsp;&nbsp;&nbsp; 可惜，这样做是无效的。因此，Smarty所说的多行注释其实是在不打断Smarty程序分隔符的情况下的多行注释。那我们如何进行这样的注释呢？其实，我们可以巧妙得使用if语句来进行注释，如下：<br><br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">{&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">==</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;}<br></span><span style="color: #000000;">&lt;</span><span style="color: #000000;">div</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$con</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一些HTML代码或者是含有Javascript的代码<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="color: #000000;">/</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;}<br></span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">div</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>{&nbsp;</span><span style="color: #000000;">/</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;}</span></div>
&nbsp;&nbsp;&nbsp; if 0 == 1 这个条件是永远不成立的，因此，中间的代码也就运行不了了，这样就间接起到了一个注释的作用了。当然，为了提高程序的可读性，您可以在if旁边添加一个单行注释，来说明这个if语句的作用是注释。<br><br><br><br>Ferris<br>2008-08-14<br><br><img src ="http://www.cnitblog.com/CoffeeCat/aggbug/47992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/CoffeeCat/" target="_blank">CoffeeCat</a> 2008-08-14 13:10 <a href="http://www.cnitblog.com/CoffeeCat/archive/2008/08/14/47992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP网页导出Word文档的方法</title><link>http://www.cnitblog.com/CoffeeCat/archive/2008/08/07/47753.html</link><dc:creator>CoffeeCat</dc:creator><author>CoffeeCat</author><pubDate>Thu, 07 Aug 2008 10:25:00 GMT</pubDate><guid>http://www.cnitblog.com/CoffeeCat/archive/2008/08/07/47753.html</guid><wfw:comment>http://www.cnitblog.com/CoffeeCat/comments/47753.html</wfw:comment><comments>http://www.cnitblog.com/CoffeeCat/archive/2008/08/07/47753.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/CoffeeCat/comments/commentRss/47753.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/CoffeeCat/services/trackbacks/47753.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 首先，要和大家说声抱歉，因为我有半年没有更新博客了。这半年过得很充实，也很忙碌，以至于没有时间写博客了。今天要探讨的是PHP网页导出Word文档的方法，使用其他语言的朋友也可以参考，因为原理是差不多的。原理&nbsp;&nbsp;&nbsp; 一般，有2种方法可以导出doc文档，一种是使用com，并且作为php的一个扩展库安装到服务器上，然后创建一个com，调用它的方法。安装过office...&nbsp;&nbsp;<a href='http://www.cnitblog.com/CoffeeCat/archive/2008/08/07/47753.html'>阅读全文</a><img src ="http://www.cnitblog.com/CoffeeCat/aggbug/47753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/CoffeeCat/" target="_blank">CoffeeCat</a> 2008-08-07 18:25 <a href="http://www.cnitblog.com/CoffeeCat/archive/2008/08/07/47753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javascript中的类实现</title><link>http://www.cnitblog.com/CoffeeCat/archive/2008/02/25/40138.html</link><dc:creator>CoffeeCat</dc:creator><author>CoffeeCat</author><pubDate>Mon, 25 Feb 2008 13:07:00 GMT</pubDate><guid>http://www.cnitblog.com/CoffeeCat/archive/2008/02/25/40138.html</guid><wfw:comment>http://www.cnitblog.com/CoffeeCat/comments/40138.html</wfw:comment><comments>http://www.cnitblog.com/CoffeeCat/archive/2008/02/25/40138.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/CoffeeCat/comments/commentRss/40138.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/CoffeeCat/services/trackbacks/40138.html</trackback:ping><description><![CDATA[Javascript本身并不支持面向对象，它没有访问控制符，它没有定义类的关键字class，它没有支持继承的extend或冒号，它也没有用来支持虚函数的virtual，不过，Javascript是一门灵活的语言，下面我们就看看没有关键字class的Javascript如何实现类定义，并创建对象。<br><br><span style="font-weight: bold;">一：定义类并创建类的实例对象</span><br>在Javascript中，我们用function来定义类，如下：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;Shape()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>}</span></div>
<br><br>你或许会说，疑？这个不是定义函数吗？没错，这个是定义函数，我们定义了一个Shape函数，并对x和y进行了初始化。不过，如果你换个角度来看，这个就是定义一个Shape类，里面有两个属性x和y，初始值分别是1和2，只不过，我们定义类的关键字是function而不是class。<br><br>然后，我们可以创建Shape类的对象aShape，如下：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;aShape&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Shape();</span></div>
<br><br><br><span style="font-weight: bold;">二：定义公有属性和私有属性</span><br>我们已经创建了aShape对象，但是，当我们试着访问它的属性时，会出错，如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">aShape.x</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span></div>
<br><br>这说明，用var定义的属性是私有的。我们需要使用this关键字来定义公有的属性<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;Shape()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.x</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.y</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>}</span></div>
<br><br>这样，我们就可以访问Shape的属性了，如。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">aShape.x</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">;</span></div>
<br><br>好，我们可以根据上面的代码总结得到：用var可以定义类的private属性，而用this能定义类的public属性。<br><br><span style="font-weight: bold;">三：定义公有方法和私有方法</span><br><br>在Javascript中，函数是Function类的实例，Function间接继承自Object，所以，函数也是一个对象，因此，我们可以用赋值的方法创建函数，当然，我们也可以将一个函数赋给类的一个属性变量，那么，这个属性变量就可以称为方法，因为它是一个可以执行的函数。代码如下：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;Shape()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.draw</span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">print;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;};<br>}</span></div>
<br><br>我们在上面的代码中定义了一个draw，并把一个function赋给它，下面，我们就可以通过aShape调用这个函数，OOP中称为公有方法，如：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">aShape.draw();</span></div>
<br><br>如果用var定义，那么这个draw就变成私有的了，OOP中称为私有方法，如<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;Shape()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;draw</span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">print;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;};<br>}</span></div>
<br>这样就不能使用aShape.draw调用这个函数了。<br><br><br><br><span style="font-weight: bold;">三：构造函数</span><br>Javascript并不支持OOP，当然也就没有构造函数了，不过，我们可以自己模拟一个构造函数，让对象被创建时自动调用，代码如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;Shape()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;init&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">构造函数代码</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;init();<br>}</span></div>
<br><br>在Shape的最后，我们人为的调用了init函数，那么，在创建了一个Shape对象是，init总会被自动调用，可以模拟我们的构造函数了。<br><br><br><span style="font-weight: bold;">四：带参数的构造函数</span><br>如何让构造函数带参数呢？其实很简单，将要传入的参数写入函数的参数列表中即可，如<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;Shape(ax,ay)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;init&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">构造函数</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">ax;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">ay;<br>&nbsp;&nbsp;&nbsp;&nbsp;};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;init();<br>}<br></span></div>
<br><br>这样，我们就可以这样创建对象：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;aShape&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Shape(</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">);</span></div>
<br><br><br><span style="font-weight: bold;">五：静态属性和静态方法</span><br>在Javascript中如何定义静态的属性和方法呢？如下所示<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;Shape(ax,ay)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;init&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">构造函数</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">ax;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">ay;<br>&nbsp;&nbsp;&nbsp;&nbsp;};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;init();<br>}<br>Shape.count</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">定义一个静态属性count，这个属性是属于类的，不是属于对象的。</span><span style="color: #008000;"><br></span><span style="color: #000000;">Shape.staticMethod</span><span style="color: #000000;">=</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){};</span><span style="color: #008000;">//</span><span style="color: #008000;">定义一个静态的方法</span></div>
<br><br>有了静态属性和方法，我们就可以用类名来访问它了，如下<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">alert&nbsp;(&nbsp;aShape.count&nbsp;);<br>aShape.staticMethod();</span></div>
<br>注意：静态属性和方法都是公有的，目前为止，我不知道如何让静态属性和方法变成私有的～<br><br><br><br><span style="font-weight: bold;">六：在方法中访问本类的公有属性和私有属性</span><br><br>在类的方法中访问自己的属性，Javascript对于公有属性和私有属性的访问方法有所不同，请大家看下面的代码<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;Shape(ax,ay)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.gx</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.gy</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;init&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">ax;</span><span style="color: #008000;">//</span><span style="color: #008000;">访问私有属性，直接写变量名即可</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">ay;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.gx</span><span style="color: #000000;">=</span><span style="color: #000000;">ax;</span><span style="color: #008000;">//</span><span style="color: #008000;">访问公有属性，需要在变量名前加上this.</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.gy</span><span style="color: #000000;">=</span><span style="color: #000000;">ay;<br>&nbsp;&nbsp;&nbsp;&nbsp;};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;init();<br>}</span></div>
<br><br><span style="font-weight: bold;">七：this的注意事项</span><br>根据笔者的经验，类中的this并不是一直指向我们的这个对象本身的，主要原因还是因为Javascript并不是OOP语言，而且，函数和类均用function定义，当然会引起一些小问题。<br>this指针指错的场合一般在事件处理上面，我们想让某个对象的成员函数来响应某个事件，当事件被触发以后，系统会调用我们这个成员函数，但是，传入的this指针已经不是我们本身的对象了，当然，这时再在成员函数中调用this当然会出错了。<br>解决方法是我们在定义类的一开始就将this保存到一个私有的属性中，以后，我们可以用这个属性代替this。我用这个方法使用this指针相当安全，而且很是省心～<br>我们修改一下代码，解决this问题。对照第六部分的代码看，你一定就明白了<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;Shape(ax,ay)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;_this</span><span style="color: #000000;">=</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">把this保存下来，以后用_this代替this，这样就不会被this弄晕了</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;_this.gx</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;_this.gy</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;init&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">ax;</span><span style="color: #008000;">//</span><span style="color: #008000;">访问私有属性，直接写变量名即可</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">ay;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_this.gx</span><span style="color: #000000;">=</span><span style="color: #000000;">ax;</span><span style="color: #008000;">//</span><span style="color: #008000;">访问公有属性，需要在变量名前加上this.</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_this.gy</span><span style="color: #000000;">=</span><span style="color: #000000;">ay;<br>&nbsp;&nbsp;&nbsp;&nbsp;};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;init();<br>}</span></div>
<br><br><br>以上我们聊了如何在Javascript中定义类，创建类的对象，创建公有和私有的属性和方法，创建静态属性和方法，模拟构造函数，并且讨论了容易出错的this。<br>关于Javascript中的OOP实现就聊到这里，以上是最实用的内容，一般用Javascript定义类，创建对象用以上的代码已经足够了。当然，你还可以用mootools或prototype来定义类，创建对象。我用过mootools框架，感觉很不错，它对Javascript的类模拟就更完善了，还支持类的继承，有兴趣的读者可以去尝试一下。当然，如果使用了框架，那么在你的网页中就需要包含相关的js头文件，因此我还是希望读者能够在没有框架的情况下创建类，这样，代码效率较高，而且你也可以看到，要创建一个简单的类并不麻烦～<br>在下一个版本的Javascript中，将会加入对OOP的支持，届时，我们将看到class关键字，public、private访问控制符～extend继承。如果大家对下一代Javascript感兴趣，不妨可以先接触一下ActionScript3.0，这是一门相当先进的脚本语言，是Adobe收购Macromedia后的一个力作，它和Javascript一样，都属于ECMAScript，只不过AS3.0是ECMAScript的第4版的实现。要学习ActionScript3.0，我重点推荐孙颖老师的《ActionScript3殿堂之路》，这本书写的绝对好，特别是面向对象这部分，写的特别通俗易懂，例子生动，读完以后感觉很有收获，在赞叹新版的ECMAScript的同时，也给了我极大的动力继续深入学习OOP编程思想，有兴趣的读者不妨去品读一下～<br><br>Ferris<br>2008-2-25 <img src ="http://www.cnitblog.com/CoffeeCat/aggbug/40138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/CoffeeCat/" target="_blank">CoffeeCat</a> 2008-02-25 21:07 <a href="http://www.cnitblog.com/CoffeeCat/archive/2008/02/25/40138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决IE中img.onload失效的方法</title><link>http://www.cnitblog.com/CoffeeCat/archive/2008/02/01/39533.html</link><dc:creator>CoffeeCat</dc:creator><author>CoffeeCat</author><pubDate>Fri, 01 Feb 2008 05:46:00 GMT</pubDate><guid>http://www.cnitblog.com/CoffeeCat/archive/2008/02/01/39533.html</guid><wfw:comment>http://www.cnitblog.com/CoffeeCat/comments/39533.html</wfw:comment><comments>http://www.cnitblog.com/CoffeeCat/archive/2008/02/01/39533.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/CoffeeCat/comments/commentRss/39533.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/CoffeeCat/services/trackbacks/39533.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 最近在做web开发，其中有一个需求：利用Javascript获取要加载的图片的尺寸，所以很自然的，我就想到了img的onload方法，在firefox下开发完成后，我到IE下调试，发现img的onload事件很多情况下都不被调用。<br><br>我最初的代码如下：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;img&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Image;</span><span style="color: #000000;"><br>img.src&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"test</span><span style="color: #000000;">.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br></span><span style="color: #000000;">img.onload&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){<br>&nbsp;&nbsp;&nbsp;&nbsp;alert&nbsp;(&nbsp;img.width&nbsp;);<br>};</span><br></div>
<br>&nbsp;&nbsp;&nbsp; 这段代码看着没什么问题，但是为什么onload没有被IE调用呢？因为IE会缓存图片，第2次加载的图片，不是从服务器上传过来的，而是从缓冲区里加载的。是不是从缓冲区里加载的图片就不触发onload事件呢？我于是我测试了以下代码，成功了～<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;img&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Image;<br>img.onload&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){<br>&nbsp;&nbsp;&nbsp;&nbsp;alert&nbsp;(&nbsp;img.width&nbsp;);<br>};<br>img.src&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">test.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span></div>
<br>&nbsp;&nbsp;&nbsp; 我把onload写到前面去，先告诉浏览器如何处理这张图片，再指定这张图片的源，这样就正常了。所以，不是IE没有触发onload事件，而是因为加载缓冲区的速度太快，以至于没有运行到img.onload的时候，onload事件已经触发了。这让我想到了Ajax，我们在写xmlhttp的时候，都是先指定onstatechange的回调函数，然后再send数据的，道理是一样的。<img src="http://www.cnitblog.com/CuteSoft_Client/CuteEditor/images/emteeth.gif" align="absmiddle" border="0"><br><br>Ferris<br>2008-2-1<br><img src ="http://www.cnitblog.com/CoffeeCat/aggbug/39533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/CoffeeCat/" target="_blank">CoffeeCat</a> 2008-02-01 13:46 <a href="http://www.cnitblog.com/CoffeeCat/archive/2008/02/01/39533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈网页游戏</title><link>http://www.cnitblog.com/CoffeeCat/archive/2008/01/22/39189.html</link><dc:creator>CoffeeCat</dc:creator><author>CoffeeCat</author><pubDate>Tue, 22 Jan 2008 08:10:00 GMT</pubDate><guid>http://www.cnitblog.com/CoffeeCat/archive/2008/01/22/39189.html</guid><wfw:comment>http://www.cnitblog.com/CoffeeCat/comments/39189.html</wfw:comment><comments>http://www.cnitblog.com/CoffeeCat/archive/2008/01/22/39189.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnitblog.com/CoffeeCat/comments/commentRss/39189.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/CoffeeCat/services/trackbacks/39189.html</trackback:ping><description><![CDATA[前阵子我一直在研究基于B/S架构的网络游戏开发（网页网络游戏），并写了一个Web版的盛大富翁客户端Demo。今天看到盛大网络出了一款基于B/S架构的网游：纵横天下，我感到很兴奋，同时，我也想谈一下个人的看法。<br><br>传统的网络游戏是C/S架构的，通俗点说，就是大家在玩游戏之前，先要安装游戏的客户端，然后才能进行游戏，也就是客户端(Client)/服务器(Server)模式。而B/S架构是什么意思呢？B就是Browser，浏览器，也就是说，大家只要打开浏览器，登陆到相关的网站，就可以玩的网游。<br><br>B/S架构的网络游戏，它最大的好处就是大家可以在任何联网的电脑上玩游戏，只要这台电脑上有浏览器。我曾经卸载过Vista，因为在Vista下不能玩盛大富翁。但如果盛大富翁变成B/S架构了，那我就算安装了Linux，我也可以放心的玩了。对于开发者而言，他们开发跨系统的网游代码会更加方便，因为几乎每个操作系统上都有浏览器，他们就不必去关心Linux下创建Socket的代码是怎么样的，他们也不必去考虑到底是用OpenGL还是DirectX。<br><br>当然，B/S架构的网游也有很多不成熟的地方，我下面列举几点<br><br>1：通讯方式有待改善<br>B/S游戏在通讯方面的能力，比C/S要弱很多，主要还是因为浏览器的通讯方式：我们发送一个URL给服务器，然后接收服务器返回的网页信息，连接就结束了，最后浏览器把网页信息显示出来。这样的通讯过程没有持久性可言，而网游的通讯最好是有持续性的，这样才可以有效降低服务器的负荷，提高带宽利用率，并使程序架构更合理，通讯更安全。<br><br>2：客户端技术功能有限<br>按照目前的技术，B/S架构的网游，一般只使用Javascript或Flash Action Script做客户端，Javascript尽管功能强大，但是运行效率能力很低，大家可以用一下Google的记事本，当你处理一篇比较长的文章时，你就会感到很恼火，因为很卡，CPU占用率一直是100%。另外，Javascript的绘图能力不好，不过用Javascript做交互性控件还是不错的选择。Flash的的计算能力也有限，但是Flash有很多比Javascript出色的地方，首先它可以全屏，然后，它的通讯方式要比Ajax好，最后，Flash的2D绘图能力相当出色。用Flash开发B/S架构的网游客户端是最好的选择，纵横天下也是这样做的。不过，我还是会先使用JS进行开发，因为我喜欢JS，而且JS的潜力无限，无需安装插件。我的盛大富翁网页版Demo也完全是用JS写的。个人猜想，以后的B/S架构的网游，可能是JS+Flash的整合，各取所长。<br><br>3：安全性问题<br>Javascript代码是完全公开的（虽然可以加密），Flash也有反编译工具，这样，客户端的代码就很容易被克隆，进而产生外挂程序，破坏游戏的公平性，并对服务器产生危害，不过这个问题目前只能通过增加验证机制，对游戏数据进行加密来解决。<br><br><br><br>我刚刚去体验了一下盛大的纵横天下，感觉做的还不错，是比较优秀的战略网游，不过不是很生动，还是以文字为主，没有很靓丽的视觉效果，上手不太容易。毕竟是第一款网页游戏，我相信今后会越做越好的。<br><br>纵横天下给了我不少动力，我会抓紧研究B/S架构的网络游戏，尽早推出我开发的网页游戏，给大家带来网络游戏的全新体验。<br><br>P.S：我下学期的毕业设计课题正好是&#8220;基于B/S架构的网络游戏开发&#8221;，能选到自己喜欢的课题真是开心。 ^_^<br><br>Ferris<br>2008-1-22<br><br><br><br>
<br>
2007-1-28<br>注：今天我了解到Flash的Actionscript3.0提供了良好的，基于TCP/IP协议的socket支持，这样就可以为网页游戏提供良好的通讯支持，当然，就不会存在我上文中提到的无持久性的问题。而且，Flash可以和Javascript交互，看来，Flash将注定成为网页网络游戏技术
的主角。<br><br><br> <img src ="http://www.cnitblog.com/CoffeeCat/aggbug/39189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/CoffeeCat/" target="_blank">CoffeeCat</a> 2008-01-22 16:10 <a href="http://www.cnitblog.com/CoffeeCat/archive/2008/01/22/39189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在WMP中加载idx sub字幕</title><link>http://www.cnitblog.com/CoffeeCat/archive/2008/01/01/38361.html</link><dc:creator>CoffeeCat</dc:creator><author>CoffeeCat</author><pubDate>Tue, 01 Jan 2008 15:07:00 GMT</pubDate><guid>http://www.cnitblog.com/CoffeeCat/archive/2008/01/01/38361.html</guid><wfw:comment>http://www.cnitblog.com/CoffeeCat/comments/38361.html</wfw:comment><comments>http://www.cnitblog.com/CoffeeCat/archive/2008/01/01/38361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/CoffeeCat/comments/commentRss/38361.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/CoffeeCat/services/trackbacks/38361.html</trackback:ping><description><![CDATA[今天帮同学解决了avi电影加载字幕的问题，简单记录一下，希望对大家有用～<br><br>方法：<br>1：先将idx和sub文件和avi文件放在一起<br>2：将idx和sub文件重命名，名字和avi的文件名一致<br>3：用Windows Media Player打开avi文件，点击播放菜单-&gt;字幕-&gt;开，就可以看到字幕显示出来了。<br><br>CoffeeCat<br>2008-1-1<br><br><img src ="http://www.cnitblog.com/CoffeeCat/aggbug/38361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/CoffeeCat/" target="_blank">CoffeeCat</a> 2008-01-01 23:07 <a href="http://www.cnitblog.com/CoffeeCat/archive/2008/01/01/38361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Javascript写的RSA加密演示程序</title><link>http://www.cnitblog.com/CoffeeCat/archive/2007/12/30/38317.html</link><dc:creator>CoffeeCat</dc:creator><author>CoffeeCat</author><pubDate>Sun, 30 Dec 2007 14:29:00 GMT</pubDate><guid>http://www.cnitblog.com/CoffeeCat/archive/2007/12/30/38317.html</guid><wfw:comment>http://www.cnitblog.com/CoffeeCat/comments/38317.html</wfw:comment><comments>http://www.cnitblog.com/CoffeeCat/archive/2007/12/30/38317.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/CoffeeCat/comments/commentRss/38317.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/CoffeeCat/services/trackbacks/38317.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 这个程序是为我的计算机信息安全课程设计而编写的，实现了基于RSA算法的文本加密功能。<br>&nbsp;&nbsp;&nbsp; 本程序只用于演示，没有实用价值，主要原因是Javascript运算速度太慢，以至于我选用的质数只能小于10000，太大了，生成的密钥也会很大，对加密的时间有着直接影响。<br>&nbsp;&nbsp;&nbsp; 钥匙是程序自动选取两个质数以后，计算得到的，最终的格式如下，数1,数2，其中数2是N，数1是E或者是D，一般，我们把含有E的钥匙叫公钥，含有D的钥匙叫做私钥，当然，如果你想倒过来也没关系～至于E，D，N是什么东东，您查阅一下RSA的资料，看一下计算方法就知道了～<br>&nbsp;&nbsp;&nbsp; 钥匙中的数1的大小和加密或解密的时间成正比，如果你的钥匙用于加密，那么数1越大，加密所需时间也就越长。我测试了一下，选取的数1不应该超过2000，否则要等很长时间（至少能让你失去耐心），其次，要加密的文本也不要太长，建议5个字母以内（所以说没有实用价值 :P）。在加密或解密的时候，浏览器会经常询问您是否终止Javascript的运行，你只有选择继续运行，才能完成整个加密过程。<br><br>&nbsp;&nbsp;&nbsp; 我们学校这学期开了计算机信息安全这门课，更像是科普讲座，介绍了一些常用的加密算法，对称加密，非对称加密，数字签名等等，还有防火墙，病毒防范等，给我们上课的老师叫胡春光，我很喜欢他，他知识渊博，上课语速平和，说话很有逻辑性，能用很通俗易懂的方式为我们讲课，引人入胜，而且他是个很有个性的老师，能成为他的学生真是三生有幸～<br><br>&nbsp;&nbsp;&nbsp; 好了，以下是程序的源代码，供大家学习参考，程序没有经过优化，质量不算高，欢迎大家提出宝贵意见。<br><br>&nbsp;&nbsp;&nbsp; P.S：<br>&nbsp;&nbsp;&nbsp; 1:程序使用了mootools框架进行开发，其实就是用mootools的方法来定义类创建对象～没有用其他的特性～<br>&nbsp;&nbsp;&nbsp; 2:密钥产生页面：Keygen.htm，加密页面：encrypt.htm，解密页面：decrypt.htm<br><br>CoffeeCat<br>2007-12-30<br><br><br><a href="http://www.cnitblog.com/Files/CoffeeCat/rsa/RSA.rar">http://www.cnitblog.com/Files/CoffeeCat/rsa/RSA.rar</a><br><br> <img src ="http://www.cnitblog.com/CoffeeCat/aggbug/38317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/CoffeeCat/" target="_blank">CoffeeCat</a> 2007-12-30 22:29 <a href="http://www.cnitblog.com/CoffeeCat/archive/2007/12/30/38317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>奇妙的数学</title><link>http://www.cnitblog.com/CoffeeCat/archive/2007/12/27/38152.html</link><dc:creator>CoffeeCat</dc:creator><author>CoffeeCat</author><pubDate>Wed, 26 Dec 2007 17:40:00 GMT</pubDate><guid>http://www.cnitblog.com/CoffeeCat/archive/2007/12/27/38152.html</guid><wfw:comment>http://www.cnitblog.com/CoffeeCat/comments/38152.html</wfw:comment><comments>http://www.cnitblog.com/CoffeeCat/archive/2007/12/27/38152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/CoffeeCat/comments/commentRss/38152.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/CoffeeCat/services/trackbacks/38152.html</trackback:ping><description><![CDATA[<p>今天我在编写RSA加密算法的程序，其中，有一个原理性的式子有点看不明白：a=b(mod
c)。于是，我和黄臻开始讨论，然后，黄臻发现，这个叫同余式，表示a除以c的余数是b。</p>
<p>于是，我提出了一个问题，如果a和c的余数是1，那么能不能证明a和c是互质的？。然后，我和黄臻开始了有趣的思考。我尝试着证明几次，都很搞笑的回到了命题本身，最后，黄臻通过反证法，把这个问题解出来了，然后和我说了3遍，才把我说服，呵呵，当时，我和他的思维处于两条平行线上，所以我们的一些对话特别搞笑，当时我们自己都笑翻了～～比如我试图推翻他的结论，于是我开始举反例，举了半天没举出来，后来发现，我如果能举出反例，我也就能推翻我的命题，不需要证明了～～</p>
<p>根据黄臻的反证法，我们总算得出了结论：如果a和c的余数是1，那么a和c就互质了～</p>
<p>然后我继续写程序～写程序的时候，我想起来我程序中用到了欧几里德算法来求最大公约数，就是用除数除以被除数，如果求得的余数不为0，则将被除数作为新的除数，余数作为新的被除数，重复刚才的步骤。如果求得的余数等于0了，那么最后一次的被除数就是两个数的最大公因数。比如，求15和6的公约数，先得到15除以6的余数3，然后得到6和3的余数0，由此得到15和6的最大公因数是3。那我只要求一下a和c的最大公约数不就行了～</p>
<p>于是，我用欧几里德算法来求a和c的最大公约数，由题目可知，a除以c的余数是1，c除以1的余数肯定是0，所以，a和c的最大公因数也就是1，也就是a和c是互质的～</p>
<p>一个反证，一个正证，两种不同的思路，两种不同的方法，却能得到相同的结论～一个简单的命题，可以很简单的证明了，也可能绕了很大圈子也没证明出来～数学真是奇妙啊～</p><img src ="http://www.cnitblog.com/CoffeeCat/aggbug/38152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/CoffeeCat/" target="_blank">CoffeeCat</a> 2007-12-27 01:40 <a href="http://www.cnitblog.com/CoffeeCat/archive/2007/12/27/38152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>