<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[AJAXBBS.NET]]></title> 
<link>http://www.ajaxbbs.net/index.php</link> 
<description><![CDATA[Ajaxbbs博客以Ajax,JavaScript,xhtml,ajax/WEBUI框架及用户体验等相关技术为主，致力于前端技术的学习研究和分享。希望能与更多的前端技术开发者及RIA技术研究者交流学习]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[AJAXBBS.NET]]></copyright>
<item>
<link>http://www.ajaxbbs.net/post/354/</link>
<title><![CDATA[Date()与new Date()的区别]]></title> 
<author>yemoo &lt;admin@yourname.com&gt;</author>
<category><![CDATA[JS经验技巧]]></category>
<pubDate>Sun, 28 Sep 2008 05:13:10 +0000</pubDate> 
<guid>http://www.ajaxbbs.net/post/354/</guid> 
<description>
<![CDATA[ 
	今日一同时问我，new Date(Date(str))这段代码什么意思？我一看就晕了，一个new Date 一个Date这是什么意思？<br/>这函数结果会是什么？这么牛x的写法还是第一次见到，莫非有高人？<br/><br/>百思不解于是自己写了个测试函数。<br/><div class="code"><br/>document.write(new Date(Date())+&#039;&lt;br&gt;&#039;)<br/>document.write(new Date()+&#039;&lt;br&gt;&#039;)<br/>document.write(Date()+&#039;&lt;br&gt;&#039;)<br/></div><br/><br/>结果发现结果如下：<br/>Sun Sep 28 12:23:58 UTC+0800 2008<br/>Sun Sep 28 12:23:58 UTC+0800 2008<br/>Sun Sep 28 12:23:58 2008<br/><br/>不用new的结果不含UTC+0800。而且前两种写法的结果相同。<br/>于是做下面尝试：<br/><div class="code"><br/>document.write(new Date(Date(&#039;2008/08/08&#039;))+&#039;&lt;br&gt;&#039;)<br/>document.write(new Date(&#039;2008/08/08&#039;)+&#039;&lt;br&gt;&#039;)<br/>document.write(Date(&#039;2008/08/08&#039;)+&#039;&lt;br&gt;&#039;)<br/></div><br/><br/>运行结果：<br/>Sun Sep 28 12:25:48 UTC+0800 2008<br/>Fri Aug 8 00:00:00 UTC+0800 2008<br/>Sun Sep 28 12:25:48 2008<br/>看来为Date()传参数并没有意义，Date(str)本来就是一种错误的写法。
]]>
</description>
</item><item>
<link>http://www.ajaxbbs.net/post/353/</link>
<title><![CDATA[如何用正确的方法管理高效率的开发团队[转]]]></title> 
<author>yemoo &lt;admin@yourname.com&gt;</author>
<category><![CDATA[其它技术文章]]></category>
<pubDate>Fri, 26 Sep 2008 08:50:46 +0000</pubDate> 
<guid>http://www.ajaxbbs.net/post/353/</guid> 
<description>
<![CDATA[ 
	或许这篇文章已经是一篇很老的文章了，但现在看了感觉是很实在很实用的文章。文章采用问答式，看起来也比较舒服，收藏到本站，以后没事多看。================================1. 你们的项目组使用源代码管理工具了么？MVM：应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。2. 你们的项目组使用缺陷管理系统了么？MVM：应该用。ClearQuest太复杂，我的推荐是BugZilla。3. 你们的测试组还在用Word写测试用例么？MVM：不要用Word写测试用例（Test Case）。应该用一个专门的系统，可以是Test Manager，也可以是自己开发一个ASP.NET的小网站。主要目的是Track和Browse。<br/>............<br/><br/>Tags - <a href="http://www.ajaxbbs.net/tags/%25E9%25A1%25B9%25E7%259B%25AE%25E7%25AE%25A1%25E7%2590%2586/" rel="tag">项目管理</a> , <a href="http://www.ajaxbbs.net/tags/%25E5%259B%25A2%25E9%2598%259F%25E7%25AE%25A1%25E7%2590%2586/" rel="tag">团队管理</a> , <a href="http://www.ajaxbbs.net/tags/%25E5%2590%2588%25E4%25BD%259C/" rel="tag">合作</a>
]]>
</description>
</item><item>
<link>http://www.ajaxbbs.net/post/352/</link>
<title><![CDATA[烦恼,糟糕,状况怎会如此？]]></title> 
<author>yemoo &lt;admin@yourname.com&gt;</author>
<category><![CDATA[生活&amp;&amp;娱乐&amp;&amp;网摘]]></category>
<pubDate>Thu, 21 Aug 2008 03:32:43 +0000</pubDate> 
<guid>http://www.ajaxbbs.net/post/352/</guid> 
<description>
<![CDATA[ 
	好久没有更新博客了，一段时间过来自己一直是一种很糟糕的状态，发现什么都是这么不顺利。<br/><br/>也许完全是因为本身存在的一些无法改变的事实，就决定了我必定要承受各种苦难，必须要有这些不顺利的事情。在很多事情面前发现自己真的是很无力，无力回天，不知道该怎么去做。一次次的鼓励自己，一次次的鼓起信心，可是总是好景不长，就像一个魔咒一般，烦恼甚至是灾难必定会大驾光临。<br/><br/>而自己的难处又不好表达，甚至不能对她表达。因为在外人看来，甚至于她都会觉得，男人就应该承受所有的一切，所有的困难都应该自己来解决，是的，很多时候我埋下了，我接受了，可是越是这样，时间越久，觉得这些东西似乎并不会消失，全积压在了一起，仍然留在心里，甚至有种想要爆发的感觉。<br/><br/>于是很多时候我很不冷静，做事也越来越烦躁，状态也越来越糟糕，不知道该如何去解脱。忍，承受，难道只能这样？只能装着坚强？突然发现，越是外表坚强，越是内心脆弱。<br/><br/>从工作开始，一些事情就逐渐开始缠身，压力，也许这真的是一种压力，但我觉得自己甚至也不知道什么是压力。只觉得很累。我不是一个很冷静很成熟的人，很多时候跟玩一样。很多时候并不认真，但很多时候这正好帮我减小压力。但仍然觉得很累。<br/>一次次的希望，一次次的失望，一次次的打击，不知道自己能承受多久，不知道头顶的天什么时候会塌下。活着，就必须要坚强。男人更要坚强，否则就会是别人的耻笑和不屑。<br/><br/>有话，却说不出来，找不到一个可以说的人。这种感觉会让自己心里总觉得有一个疙瘩。有些话真的不能说，我根本没有勇气说，害怕一些事情。<br/><br/>我自己的事情，我很无奈，我只能鼓励自己，让自己坚强。我们的事情很不顺利，有时心情很差劲，有些事情做的有些过分。我希望她能理解，可有时她却真的是神经大条，根本不会理解，觉得我甚至是无理取闹，甚至会怀疑我，有时真的很无可奈何。有些东西也许根本就不能去期望。可我仍不想放弃，我也许真的不是一个可以放得下什么的人。<br/><br/>有些事情被说的多了，自己都开始怀疑，自己都开始害怕，害怕我真的放下自己的信念，害怕自己真的会崩溃。<br/>真的怕了，已经没办法让自己去相信，连自己都没有办法说服自己。<br/><br/>觉得眼前很迷茫，不知道自己在做什么，不知道以后该做什么，信心越来越不坚定，对事情越来越没有把握。<br/><br/>今天坐在公司，一切心情全无，看在电脑想吐，昨天休息了一天可是状态仍然很差。<br/><br/>但愿说出这些会好一些，但愿以后的事情能顺利，但愿我们能有一个好的结果，但愿所有的努力不会白费，但愿我的人生不会有太多的遗憾。
]]>
</description>
</item><item>
<link>http://www.ajaxbbs.net/ymPrompt2.0/</link>
<title><![CDATA[ymPrompt消息提示组件 2.0版发布(07-21更新)]]></title> 
<author>yemoo &lt;admin@yourname.com&gt;</author>
<category><![CDATA[个人小作]]></category>
<pubDate>Sat, 19 Jul 2008 06:41:24 +0000</pubDate> 
<guid>http://www.ajaxbbs.net/ymPrompt2.0/</guid> 
<description>
<![CDATA[ 
	<strong>更新日志：</strong><br/><span style="color: #FF0000;">2008-07-21：</span><br/>1、解决了与页面window.onload事件冲突的bug。<br/>2、更新css，解决消息字体在部分浏览器下字体难看的问题。<br/>3、修改了组件按钮生成方式、按钮点击事件的回调方式及tab/方向键切换按钮焦点部分代码的实现，准备下个版本支持多按钮/用户自定义按钮/不显示按钮。<br/>4、修改了DEMO，增加换肤演示。<br/>================================<br/>上个版本距今有一年多了，一直承诺发布2.0版，但由于自己的种种原因，一直拖延到今天才发布，之前可能让不少网友失望，对此我深表抱歉！呵呵~废话不多说了，本来这个早就完成了，但由于存在很多细节的问题没有处理，今天周末，大早上8点多爬起来一直拼搏到现在自己才觉得比较满意，可以发布了，可能还会有不少的问题，如果大家在使用中遇到可以即时在博客中反馈给我。<br/><br/><strong>组件名称：</strong><br/>ymPrompt消息提示组件 2.0<br/><br/><strong>组件说明：</strong><br/>在web开发中，对于浏览器默认的消息提示框（如alert,confirm等）外观无法控制，为了实现更好的界面效果，于是模拟系统的消息提示框实现了该组件。在外观上可以通过css进行完全的控制。<br/><br/><strong>组件功能介绍：</strong><br/>1、调用方式简单，直接使用ymPrompt.alert()的方式调用，传入相应的参数即可。<br/>2、兼容IE6.0+、FF1.5+、Opear9+（在Opear下显示有一个小缺陷），兼容HTML4/XHTML1.0页面渲染模式。<br/>3、完全的CSS皮肤定制功能，所有外观包括显示图标/关闭按钮等都可以通过css设置。目前提供了五种皮肤，Vista、QQ、dmm-green、ExtBlue和BlackColl。有兴趣可以修改样式表文件定义新的皮肤。<br/>4、提供四种消息类型。分别为消息提示、成功信息、错误信息、询问信息。<br/>5、弹出消息框时屏蔽页面其它元素的操作，自动隐藏页面select及iframe下select（无限级select隐藏），并遮罩iframe等元素。<br/>6、页面select控件状态还原时保持原状态，即如果原来select就是隐藏的，则消息框弹出并关闭后该select仍保持隐藏状态，而只显示原本显示的select。<br/>7、消息组件弹出时屏蔽除Tab和回车外的几乎所有键盘操作（包括F5），“消息确认框”支持“tab键/左右方向键”切换确定/取消焦点。<br/>8、可以页面加载的任意时间调用，如页面初始化时调用，页面加载完成后调用。<br/>9、支持通过JSON和传统的参数传入方式。如ymprompt.alert(&#039;消息内容&#039;,300,200,&#039;消息标题&#039;,handler)和ymprompt.alert(&#123;message:&#039;消息内容&#039;,width:300,height:200,title:&#039;消息标题&#039;,handler:handler&#125;)，这两种写法是等价的。<br/>10、只需要一个回调函数，可捕获确定、取消及关键按钮的点击事件。函数改变了1.0版需要对确定和取消按钮分别写回调函数及不支持关闭事件的缺陷，<br/>11、完全的封装，对外只暴露一个ymPrompt变量，有效防止与使用者程序变量的冲突。<br/>12、程序(js)与样式(css)的完全分离，取消了1.0中自动加载css的功能，用户可根据需要加载对应css样式表单，降低了对样式配置的复杂度。<br/><br/><strong><span style="color: #008000;">ymPrompt2.0下载地址：</span></strong> <a href="attachment.php?fid=27">点击这里下载文件</a><br/><strong>演示地址：</strong><a href="http://www.ajaxbbs.net/test/ymPrompt2.0/demo.html" target="_blank">http://www.ajaxbbs.net/test/ymPrompt2.0/demo.html</a><br/><br/><strong>1.0版链接地址：</strong><a href="http://www.ajaxbbs.net/post/100/" target="_blank">http://www.ajaxbbs.net/post/100/</a><br/><br/><strong>2.0与1.0改进和差异：</strong><br/>1、2.0中程序不再自动加载样式表，由用户将样式表引入到页面中，相比1.0对样式的控制更加简单，且降低了程序实现的复杂性。<br/>2、2.0除了支持传统的参数传入外，还支持JSON，通过json方式，不用再记忆参数顺序。<br/>3、2.0解决了1.0在IE和FF下显示高度不一致的问题。<br/>4、2.0代码封装程度更高，进对外公开一个变量ymPrompt，更好的防止变量冲突问题。<br/>5、2.0代码更加简洁，文件更小，压缩版的由7k减为5k，未压缩的由16k减为11k。2.0中程序实现方式的改变也使性能相比1.0有所提升。<br/>6、2.0回调函数变为一个，1.0中需要分别对确定和取消/关闭分别写回调函数，2.0中只需要一个回调函数，组件会为回调函数传入点击类型，如&#039;ok&#039;,&#039;cancel&#039;,&#039;close&#039;，解决了1.0无法区分取消与关闭的问题。<br/>7、调用方法及参数的一些小改变，如Alert改为ymprompt.alert(),当然你可以在你的程序中通过Alert=ymprompt.alert保留Alert的调用方式。<br/>8、2.0提供了对遮罩的样式控制（颜色及透明度）。<br/><br/><strong>调用方法及参数说明：</strong><br/>1、在页面中引入ymPrompt.js。如：&lt;script type=&quot;text/javascript&quot; src=&quot;ymPrompt.js&quot;&gt;&lt;/script&gt; <br/>2、在页面中引入对应的皮肤文件的CSS，如：&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;skin/default/ymPrompt.css&quot; /&gt; <br/>3、根据您的需要调用相应的消息函数： <br/>&nbsp;&nbsp;&nbsp;&nbsp;ymPrompt.alert(message,width,height,title,handler,maskAlphaColor,maskAlpha) //消息提示类型 <br/>&nbsp;&nbsp;&nbsp;&nbsp;ymPrompt.succeedInfo(....) //成功信息类型 <br/>&nbsp;&nbsp;&nbsp;&nbsp;ymPrompt.errorInfo(...) //错误信息类型 <br/>&nbsp;&nbsp;&nbsp;&nbsp;ymPrompt.confirmInfo(....) //询问消息类型 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<strong>四个方法的参数个数及意义完全相同：</strong> <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">message：</span>消息组件要显示的内容，默认为“内容”。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">width：</span>消息框的宽度，默认为300。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">height：</span>消息框的高度，默认为185。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">title：</span>消息组件标题，默认为“标题” <br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">handler：</span>回调函数。当确定/取消/关闭按钮被点击时会触发该函数并传入点击的按钮标识。如ok代表确定，cancel代表取消，close代表关闭 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">maskAlphaColor：</span>遮罩的颜色，默认为黑色。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF;">maskAlpha：</span>遮罩的透明度，默认为0.1。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<strong>参数传入方式包含两种：</strong> <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;第一种即传统的参数传入，按照顺序传入相应的参数值即可，对于不需要设定的值请传入null。如ymPrompt.alert(&#039;内容&#039;,null,null,&#039;标题&#039;) <br/>&nbsp;&nbsp;&nbsp;&nbsp;第二种即JSON的传入方式，需要指定字段名。如ymPrompt(&#123;title:&#039;标题&#039;,message:&#039;内容&#039;&#125;) <br/><br/>4、其他说明：如果觉得“对象.方法”的调用方式比较麻烦，可以采用如下方式简化调用： <br/>在调用之前设定var Alert=ymPrompt.alert。之后就可以使用Alert()的方式进行调用。&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>Tags - <a href="http://www.ajaxbbs.net/tags/ymprompt/" rel="tag">ymprompt</a> , <a href="http://www.ajaxbbs.net/tags/%25E6%25B6%2588%25E6%2581%25AF%25E6%258F%2590%25E7%25A4%25BA/" rel="tag">消息提示</a> , <a href="http://www.ajaxbbs.net/tags/%25E7%25BB%2584%25E4%25BB%25B6/" rel="tag">组件</a> , <a href="http://www.ajaxbbs.net/tags/alert/" rel="tag">alert</a>
]]>
</description>
</item><item>
<link>http://www.ajaxbbs.net/post/350/</link>
<title><![CDATA[个人搞的一个flash游戏站]]></title> 
<author>yemoo &lt;admin@yourname.com&gt;</author>
<category><![CDATA[生活&amp;&amp;娱乐&amp;&amp;网摘]]></category>
<pubDate>Fri, 18 Jul 2008 02:36:53 +0000</pubDate> 
<guid>http://www.ajaxbbs.net/post/350/</guid> 
<description>
<![CDATA[ 
	前段时间搞了份程序，flash小游戏网，感觉挺不错。<br/>这两天加班加点，自己把页面&quot;div+css&quot;了一把，都通过w3c的xhtml验证了。昨天晚上终于正式上线。<br/>纯粹的娱乐网站，很多好玩的flash小游戏，大家可以看看，觉得好玩了别忘了帮忙宣传下。<br/><strong>网址：</strong><a href="http://www.52flashgame.com" target="_blank">http://www.52flashgame.com</a><br/>Tags - <a href="http://www.ajaxbbs.net/tags/flash/" rel="tag">flash</a> , <a href="http://www.ajaxbbs.net/tags/%25E5%25B0%258F%25E6%25B8%25B8%25E6%2588%258F/" rel="tag">小游戏</a> , <a href="http://www.ajaxbbs.net/tags/%25E5%25A8%25B1%25E4%25B9%2590/" rel="tag">娱乐</a>
]]>
</description>
</item><item>
<link>http://www.ajaxbbs.net/post/349/</link>
<title><![CDATA[非主流男街头吓死群众]]></title> 
<author>yemoo &lt;admin@yourname.com&gt;</author>
<category><![CDATA[非技术类日志]]></category>
<pubDate>Thu, 17 Jul 2008 14:26:56 +0000</pubDate> 
<guid>http://www.ajaxbbs.net/post/349/</guid> 
<description>
<![CDATA[ 
	在优酷看到的一非主流牛人，可以说其他的所谓非主流在此牛人面前就显得很主流了。<br/>废话不多说了，大家自己看把。<br/><br/>此处包含一个多媒体文件，请用网页方式查看。<br/><br/>Tags - <a href="http://www.ajaxbbs.net/tags/%25E9%259D%259E%25E4%25B8%25BB%25E6%25B5%2581/" rel="tag">非主流</a> , <a href="http://www.ajaxbbs.net/tags/%25E8%25A7%2586%25E9%25A2%2591/" rel="tag">视频</a>
]]>
</description>
</item><item>
<link>http://www.ajaxbbs.net/post/348/</link>
<title><![CDATA[解决Img下部的3px空白]]></title> 
<author>yemoo &lt;admin@yourname.com&gt;</author>
<category><![CDATA[(X)HTML/CSS]]></category>
<pubDate>Mon, 14 Jul 2008 09:04:19 +0000</pubDate> 
<guid>http://www.ajaxbbs.net/post/348/</guid> 
<description>
<![CDATA[ 
	有时在编写网页代码时发现，img底部莫名奇妙多出大约3px的空白，无论怎么调节css都不可以，今天再次遇到此问题，网上看了一下，总结出两种方法：<br/>1、使用CSS设定img的display属性为block。<br/>2、为img标记的align=&quot;center&quot;属性。<br/>Tags - <a href="http://www.ajaxbbs.net/tags/img%25E7%25A9%25BA%25E7%2599%25BDcss/" rel="tag">img空白css</a>
]]>
</description>
</item><item>
<link>http://www.ajaxbbs.net/Sumopaint/</link>
<title><![CDATA[Sumopaint:强大的在线图片编辑工具【转】]]></title> 
<author>yemoo &lt;admin@yourname.com&gt;</author>
<category><![CDATA[产品&amp;趋势&amp;创业]]></category>
<pubDate>Thu, 10 Jul 2008 02:32:00 +0000</pubDate> 
<guid>http://www.ajaxbbs.net/Sumopaint/</guid> 
<description>
<![CDATA[ 
	<br/><img src="http://www.ajaxbbs.net/template/default/images/viewimage.gif" alt=""/><a href="http://pic.yupoo.com/daodao/732405cae9ca/v2lbsnbb.jpg" target="_blank">点击在新窗口中浏览此图片</a><br/><a href="http://pic.yupoo.com/daodao/732405cae9ca/v2lbsnbb.jpg" target="_blank">http://pic.yupoo.com/daodao/732405cae9ca/v2lbsnbb.jpg</a><br/><br/><a href="http://www.sumopaint.com/" target="_blank">Sumopaint</a>，一款功能强大、界面酷似Adobe&nbsp;&nbsp;Photoshop的在线图片编辑利器于近日正式上线运营！<br/><br/><a href="http://www.sumopaint.com/" target="_blank">Sumopaint</a> 是一款近日刚刚浮出水面、基于 Web 端开发的图片编辑软件，它提供了若干处理图片的基本功能：裁剪、翻转、滤镜、红颜、曝光、蒙版、色调等等等等。可以这么说，你所能想到的一款轻量级图片处理软件所该有的功能，在 Sumopaint 中都能够找到！<br/><br/><img src="http://www.ajaxbbs.net/template/default/images/viewimage.gif" alt=""/><a href="http://pic.yupoo.com/daodao/156535cae9c9/04pgq9uu.jpg" target="_blank">点击在新窗口中浏览此图片</a><br/><a href="http://pic.yupoo.com/daodao/156535cae9c9/04pgq9uu.jpg" target="_blank">http://pic.yupoo.com/daodao/156535cae9c9/04pgq9uu.jpg</a><br/><br/><br/>充满无限想象力的互联网永远都不缺乏类似于Photoshop的Web 软件： <a href="http://www.showeb20.com/?p=803" target="_blank">Splashup</a> , <a href="https://www.photoshop.com/express/landing.html" target="_blank">Photoshop Express</a> , <a href="http://www.showeb20.com/?p=153" target="_blank">Picnik </a>,&nbsp;&nbsp;<a href="http://www.showeb20.com/?p=597" target="_blank">FotoFlexer </a>等等。我将会在下一篇日志中做一次集中的汇总 <br/>Tags - <a href="http://www.ajaxbbs.net/tags/sumopaintweb2.0/" rel="tag">sumopaintweb2.0</a> , <a href="http://www.ajaxbbs.net/tags/%25E5%259C%25A8%25E7%25BA%25BF%25E5%259B%25BE%25E7%2589%2587%25E7%25BC%2596%25E8%25BE%2591/" rel="tag">在线图片编辑</a>
]]>
</description>
</item><item>
<link>http://www.ajaxbbs.net/a-eval-wonderful-usage/</link>
<title><![CDATA[有关eval的一点妙用]]></title> 
<author>yemoo &lt;admin@yourname.com&gt;</author>
<category><![CDATA[JS经验技巧]]></category>
<pubDate>Fri, 04 Jul 2008 01:37:53 +0000</pubDate> 
<guid>http://www.ajaxbbs.net/a-eval-wonderful-usage/</guid> 
<description>
<![CDATA[ 
	本以为自己对eval的认识已经非常到位，但昨天遇到的一个有关eval的问题确痛苦了我半天，用了一个我认识是非常蹩脚的办法解决了，但我感觉一定有好的办法，然后在<a href="http://bbs.51js.com" target="_blank">无忧脚本</a>找高手求助，最后很多做了解答，顿时令我觉得对eval的认识又有了不同。<br/><br/>我的问题是这样的：<br/>我需要动态执行一个函数，这个函数是在一个html元素上定义的。如<br/><br/><div class="code">&lt;div fn=&quot;click:function()&#123;alert(1)&#125;;mouseover:overfn&quot;&gt;&lt;/div&gt;</div><br/><br/>注意fn中的内容正是我需要操作的内容，该写法表示，click时执行function()&#123;alert(1)&#125;这个函数,mouseover时执行overfn这个函数。<br/>第一种是匿名函数，第二种是由函数名的。<br/><br/>我们来简化这个问题，我们的核心是如何动态执行这些函数。<br/>如<br/><div class="code"><br/>function testFn()&#123;alert(1);&#125;<br/>var str=&quot;testFn&quot;;<br/>document.onclick=eval(str);<br/></div><br/>对于有函数名的函数我们直接eval就可以使用了。<br/><br/>但对于匿名函数就没有这么好解决。<br/>如<br/>var str=&quot;function testFn()&#123;alert(1);&#125;&quot;;<br/>document.onclick=eval(str);<br/>这样的写法是不能成功执行的。<br/><br/>后来自己变通了另外一种办法，如下：<br/><div class="code"><br/>var str=&quot;function testFn()&#123;alert(1)&#125;&quot;;<br/>eval(&quot;var fn=&quot; + str)<br/>document.onclick=fn;<br/></div><br/>虽然问题解决了，但感觉另外又定义了一个变量，看起来很蹩脚，对于我一个追求程序精简的人来说心里那是相当不舒服。<br/>一时觉得很迷惑，不太清楚具体原因是什么。<br/><br/>然后在无忧得到zztu对eval的解释和temade的代码，突然觉得明白了很多。其解释如下：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><br/>eval()函数，这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它。<br/>eval 函数对数字表达式的一个字符串进行求值，其语法为：<br/>eval(expr)<br/>此处 expr 是一个被求值的字符串参数。如果该字符串是一个表达式，eval 求该表达式的值；如果该参数代表一个或多个 JavaScript 语句，那么 eval 执行这些语句。<br/>function testFn()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var str=&quot;testFn&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.onclick=eval(str);<br/>这里str是个表达式，eval 求该表达式的值返回testFn也就是对定义的函数的引用。<br/>var str=&quot;function testFn()&#123;alert(1);&#125;&quot;;<br/>document.onclick=eval(str);<br/>而这里的str是一个或多个js语句,eval相当于执行了这个语句，而这个语句是没有返回值的，你可以试下<br/>alert(eval(str))是undefined。<br/></div></div><br/><br/>于是最后我想到一种办法，能比temade的写法更简单，也不需要再声明变量。<br/>主要代码如下：<br/><div class="code"><br/>Log:&lt;div id=&#039;log&#039; style=&#039;border:1px dashed #666;height:400px;padding:5px;width:200px&#039;&gt;&lt;/div&gt;<br/>&nbsp;&nbsp;&lt;script type=&quot;text/javascript&quot;&gt;<br/>&nbsp;&nbsp;&lt;!--<br/>&nbsp;&nbsp;function log(str)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(&#039;log&#039;).innerHTML+=str+&quot;&lt;br /&gt;&quot;;<br/>&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;function test()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;log(&#039;mousedown&#039;)<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;var down=&quot;test&quot;;<br/>&nbsp;&nbsp;var up=&quot;function()&#123;log(&#039;mouseup&#039;)&#125;&quot;;<br/><br/>&nbsp;&nbsp;document.onmousedown=eval(&quot;1&amp;&amp;&quot;+down);<br/>&nbsp;&nbsp;document.onmouseup=eval(&quot;1&amp;&amp;&quot;+up);<br/>&nbsp;&nbsp;//--&gt;<br/>&nbsp;&nbsp;&lt;/script&gt;<br/></div><br/><br/>其实这个写法也好理解，主要就是利用了eval对表达式求值并返回的特性。<br/>尽管还不是那么的完美，不过也得到了一些突破。<br/>Tags - <a href="http://www.ajaxbbs.net/tags/eval/" rel="tag">eval</a>
]]>
</description>
</item><item>
<link>http://www.ajaxbbs.net/javascript-eval/</link>
<title><![CDATA[深入认识javascript中的eval函数[转]]]></title> 
<author>yemoo &lt;admin@yourname.com&gt;</author>
<category><![CDATA[JS理论&amp;基础]]></category>
<pubDate>Fri, 27 Jun 2008 02:22:13 +0000</pubDate> 
<guid>http://www.ajaxbbs.net/javascript-eval/</guid> 
<description>
<![CDATA[ 
	先来说eval的用法，内容比较简单，熟悉的可以跳过。<br/>eval函数接收一个参数s，如果s不是字符串，则直接返回s。否则执行s语句。如果s语句执行结果是一个值，则返回此值，否则返回undefined。<br/>需要特别注意的是对象声明语法“&#123;&#125;”并不能返回一个值，需要用括号括起来才会返回值，简单示例如下：<br/><br/><div class="code">var code1=&#039;&quot;a&quot; + 2&#039;;&nbsp;&nbsp;&nbsp;&nbsp;//表达式<br/>var code2=&#039;&#123;a:2&#125;&#039;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//语句<br/>alert(eval(code1));&nbsp;&nbsp;&nbsp;&nbsp; //-&gt;&#039;a2&#039;<br/>alert(eval(code2));&nbsp;&nbsp;&nbsp;&nbsp; //-&gt;undefined<br/>alert(eval(&#039;(&#039; + code2 + &#039;)&#039;));&nbsp;&nbsp;&nbsp;&nbsp;//-&gt;&#91;object Object&#93;</div><br/><br/>可以看到，对于对象声明语句来说，仅仅是执行，并不能返回值。为了返回常用的“&#123;&#125;”这样的对象声明语句，必须用括号括住，以将其转换为表达式，才能返回其值。这也是使用JSON来进行Ajax开发的基本原理之一。在例子中可以清楚的看到，第二个alert语句输出的是undefined，而第三个加了括号后输出的是语句表示的对象。<br/><br/>现在来说本文的重点，如何在函数内执行全局代码。为了说明这个问题，先看一个例子：<br/><br/><div class="code">var s=&#039;global&#039;;&nbsp;&nbsp;&nbsp;&nbsp;//定义一个全局变量<br/>function demo1()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(&#039;var s=&quot;local&quot;&#039;);<br/>&#125;<br/>demo1();<br/>alert(s);&nbsp;&nbsp;&nbsp;&nbsp;//-&gt;global</div><br/><br/>很好理解，上面的demo1函数等价于：function demo1()&#123;var s=&#039;local&#039;;&#125;，其中定义了一个局部变量s。<br/>所以最后的输出是global并不是什么奇怪的事情，毕竟大家都能很清楚的区分局部变量和全局变量。<br/>仔细体会一下，可以发现eval函数的特点，它总是在调用它的上下文变量空间（也称为：包，closure）内执行，无论是变量定义还是函数定义都是如此，所以如下的代码会产生函数未定义的错误：<br/><br/><div class="code">var s=&#039;function test()&#123;return 1;&#125;&#039;;&nbsp;&nbsp;&nbsp;&nbsp; //一个函数定义语句<br/>function demo2()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(s);<br/>&#125;<br/>demo2();<br/>alert(test());&nbsp;&nbsp;&nbsp;&nbsp;//-&gt;error:test is not defined</div><br/><br/>这是因为test函数在局部空间定义，demo2函数内可以访问到，外面就访问不到了。<br/><br/>而在实际的Ajax开发中，有时我们需要从服务器动态获取代码来执行，以减轻一次载入代码过多的问题，或者是一些代码是通过Javascript自身生成的，希望用eval函数来使其执行。<br/>但这样的动态获取代码的工作一般在函数内完成，比如：<br/><br/><div class="code">function loadCode()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var code=getCode();<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(code);<br/>&#125;</div><br/><br/>可见eval不可能在全局空间内执行，这就给开发带来了不少问题，也看到过很多人为此郁闷。<br/><br/>不过现在偶终于找到了解决办法，嘿嘿，可以同时兼容IE和Firefox，方法如下：<br/><br/><div class="code">var X2=&#123;&#125;&nbsp;&nbsp;&nbsp;&nbsp;//my namespace:)<br/>X2.Eval=function(code)&#123;<br/>if(!!(window.attachEvent &amp;&amp; !window.opera))&#123;<br/>&nbsp;&nbsp;//ie<br/>&nbsp;&nbsp; execScript(code); <br/>&#125;else&#123;<br/>&nbsp;&nbsp;//not ie<br/>&nbsp;&nbsp; window.eval(code);<br/>&#125;<br/>&#125;</div><br/><br/>现在如果要想在函数内定义全局代码，就可以通过调用X2.Eval(code)方法，一个例子如下：<br/><br/><div class="code">var s=&#039;global&#039;;<br/>function demo3()&#123;<br/>X2.Eval(&#039;var s=&quot;local&quot;&#039;);<br/>&#125;<br/>demo3();<br/>alert(s); //-&gt;&#039;local&#039;</div><br/><br/>可见，在demo3函数内重新定义了全局变量s=&quot;local&quot;。<br/>需要注意的是X2.Eval并不返回值，如果要进行表达式的求值，还是用系统的eval函数。X2.Eval设计为仅做全局代码定义用。<br/><br/>其实看到这里，或许有人感觉问题也太容易解决了点，呵呵，但发现这个办法倒是需要些运气和技巧的：<br/>（1）对于IE浏览器，默认已经提供了这样的函数：execScript，用于在全局空间执行代码，只是知道的人还不多。<br/>（2）对于Firefox浏览器，直接调用eval函数，则在调用者的空间执行；如果调用window.eval则在全局空间执行。这个知道的人估计就更少了。毕竟alert(eval==window.eval)返回true！<br/><br/>Firefox的eval函数的特点的确是很令人奇怪的，但从javascript规范中倒也能找到其来源：<br/><br/>If value of the eval property is used in any way other than a direct call (that is, other than by the explicit use of its<br/>name as an Identifier which is the MemberExpression in a CallExpression), or if the eval property is assigned to,<br/>an EvalError exception may be thrown.<br/><br/>意思大概就是说eval函数的执行是和调用者相关的，但并没有说其执行上下文的问题。所以IE和Firefox孰是孰非也就很难说了，大家知道解决办法就好。<br/><br/>Tags - <a href="http://www.ajaxbbs.net/tags/eval/" rel="tag">eval</a>
]]>
</description>
</item>
</channel>
</rss>