<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<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>才子小窝 - Web编程</title><link>http://www.54caizi.org/</link><description>天生我才必有用，千金散尽还复来 - </description><generator>RainbowSoft Studio Z-Blog 1.8 Spirit Build 80605</generator><language>zh-CN</language><copyright>Copyright 2008-? 才子小窝. Some Rights Reserved.&amp;amp;nbsp;粤ICP备08040021号&amp;amp;nbsp;&amp;amp;nbsp;网站地图</copyright><pubDate>Thu, 09 Sep 2010 07:13:48 +0800</pubDate><item><title>Firefox把caption元素挤出table家庭</title><author>a@b.com (风流才子)</author><link>http://www.54caizi.org/post/firefox-is-different-for-caption.html</link><pubDate>Fri, 08 Aug 2008 14:36:16 +0800</pubDate><guid>http://www.54caizi.org/post/firefox-is-different-for-caption.html</guid><description><![CDATA[前段时间写了一篇“<a href="http://www.54caizi.org/post/table-to-valid.html" target="_blank">关于table如何通过XHTML验证那档子事</a>”，最后贴出了一段才子自用的table样式的定义，有网友今天告诉我，他发现定义了table的margin之后，也就是定义了table的外边距之后，在Firefox下的渲染效果与其它各大主流浏览器都不同，caption这个标签元素是表格的说明，却被挤出了table之外，变成caption与表格内容之间的边距是定义的margin的值了。<br/>这就奇怪了，caption与thead，tbody，tfoot都是table下同等级的元素，为什么Firefox却把caption元素挤出了table家庭呢？真有点匪夷所思。<br/>才子用其它的一些浏览器都测试过了，唯独只有Firefox的渲染效果不同，看来Firefox这个被大家所公认的所谓优秀的Web标准浏览器，似乎也有不标准的地方，呵呵。<br/><b><font color="Red">PS：才子一直都觉得Firefox就是个垃圾。</font></b><br/><br/>特意做个演示页面，请大家用各种不同的浏览器浏览一下，看看渲染效果的差异！<br/>定义了表格宽度为100%，也只有Firefox把左边的表格线也弄没了，原因不明。<br/>演示：<a href="http://www.54caizi.org/demo/firefox-is-different-for-caption.html" target="_blank">http://www.54caizi.org/demo/firefox-is-different-for-caption.html</a><br/><br/>风流才子 作品，转帖请保留原文地址链接，谢谢合作！<br/><a href="http://www.54caizi.org" target="_blank">才子小窝</a>：<a href="http://www.54caizi.org" target="_blank">http://www.54caizi.org</a><br/><br/>]]></description><category>Web编程</category><comments>http://www.54caizi.org/post/firefox-is-different-for-caption.html#comment</comments><wfw:comment>http://www.54caizi.org/</wfw:comment><wfw:commentRss>http://www.54caizi.org/feed.asp?cmt=53</wfw:commentRss><trackback:ping>http://www.54caizi.org/cmd.asp?act=tb&amp;id=53&amp;key=82cfba9a</trackback:ping></item><item><title>定义列表+CSS制作的垂直菜单</title><author>a@b.com (风流才子)</author><link>http://www.54caizi.org/post/dl-menu.html</link><pubDate>Thu, 07 Aug 2008 01:39:45 +0800</pubDate><guid>http://www.54caizi.org/post/dl-menu.html</guid><description><![CDATA[利用无序列表(ul,li)+css制作菜单的例子我们见得多了，相信大家也都很熟练了。<br/>今天找到一个用定义列表(dl,dt,dd)+css制作的垂直菜单，还不错，有一定的参考价值，收藏一下。<br/>代码如下：<br/><p class="code"><code>&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br/>&lt;html&nbsp;xmlns="http://www.w3.org/1999/xhtml"&gt;<br/><br/>&lt;head&gt;<br/>&lt;meta&nbsp;http-equiv="content-type"&nbsp;content="text/html;&nbsp;charset=utf-8"&nbsp;/&gt;<br/>&lt;meta&nbsp;http-equiv="content-language"&nbsp;content="gb2312"&nbsp;/&gt;<br/>&lt;title&gt;dl,dt,dd制作的CSS垂直菜单&lt;/title&gt;<br/>&lt;style&nbsp;type="text/css"&gt;<br/>body&nbsp;{<br/>&nbsp;&nbsp;font-size:&nbsp;12px;<br/>&nbsp;&nbsp;margin:&nbsp;0;<br/>}<br/>#menu&nbsp;dl&nbsp;{<br/>&nbsp;&nbsp;margin:&nbsp;0&nbsp;auto;<br/>&nbsp;&nbsp;padding:&nbsp;0&nbsp;0&nbsp;10px&nbsp;0;<br/>&nbsp;&nbsp;width:&nbsp;150px;<br/>&nbsp;&nbsp;background:&nbsp;#69c;<br/>}<br/>#menu&nbsp;dt&nbsp;{<br/>&nbsp;&nbsp;margin:&nbsp;0;<br/>&nbsp;&nbsp;padding:&nbsp;10px;<br/>&nbsp;&nbsp;background:&nbsp;#69c;<br/>&nbsp;&nbsp;color:&nbsp;#fff;<br/>&nbsp;&nbsp;font-size:&nbsp;1.4em;<br/>&nbsp;&nbsp;font-weight:&nbsp;bold;<br/>&nbsp;&nbsp;border-bottom:&nbsp;1px&nbsp;solid&nbsp;#fff;<br/>}<br/>#menu&nbsp;dd&nbsp;{<br/>&nbsp;&nbsp;margin:&nbsp;0;<br/>&nbsp;&nbsp;padding:&nbsp;0;<br/>&nbsp;&nbsp;background:&nbsp;#47a;<br/>&nbsp;&nbsp;color:&nbsp;#fff;<br/>&nbsp;&nbsp;font-size:&nbsp;1em;<br/>&nbsp;&nbsp;border-bottom:1px&nbsp;solid&nbsp;#fff;<br/>}<br/>#gallery&nbsp;a,&nbsp;#gallery&nbsp;a:visited&nbsp;{<br/>&nbsp;&nbsp;display:block;<br/>&nbsp;&nbsp;padding:5px&nbsp;5px&nbsp;5px&nbsp;20px;<br/>&nbsp;&nbsp;width:125px;<br/>&nbsp;&nbsp;background:&nbsp;#47a;<br/>&nbsp;&nbsp;color:#fff;<br/>&nbsp;&nbsp;text-decoration:none;<br/>}<br/>#gallery&nbsp;a:hover&nbsp;{<br/>&nbsp;&nbsp;background:&nbsp;#258;<br/>&nbsp;&nbsp;color:#9cf;<br/>}<br/>&lt;/style&gt;<br/>&lt;/head&gt;<br/><br/>&lt;body&gt;<br/>&lt;div&nbsp;id="menu"&gt;<br/>&nbsp;&nbsp;&lt;dl&nbsp;id="gallery"&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;dt&gt;Gallery&lt;/dt&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;dd&gt;&lt;a&nbsp;href="#"&nbsp;title="Paul&nbsp;Cezanne"&gt;Paul&nbsp;Cezanne&lt;/a&gt;&lt;/dd&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;dd&gt;&lt;a&nbsp;href="#"&nbsp;title="Henri&nbsp;Matisse"&gt;Henri&nbsp;Matisse&lt;/a&gt;&lt;/dd&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;dd&gt;&lt;a&nbsp;href="#"&nbsp;title="Vincent&nbsp;van&nbsp;Gogh"&gt;Vincent&nbsp;van&nbsp;Gogh&lt;/a&gt;&lt;/dd&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;dd&gt;&lt;a&nbsp;href="#"&nbsp;title="William&nbsp;Turner"&gt;William&nbsp;Turner&lt;/a&gt;&lt;/dd&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;dd&gt;&lt;a&nbsp;href="#"&nbsp;title="John&nbsp;Constable"&gt;John&nbsp;Constable&lt;/a&gt;&lt;/dd&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;dd&gt;&lt;a&nbsp;href="#"&nbsp;title="Claude&nbsp;Monet"&gt;Claude&nbsp;Monet&lt;/a&gt;&lt;/dd&gt;<br/>&nbsp;&nbsp;&lt;/dl&gt;<br/>&lt;/div&gt;<br/>&lt;/body&gt;<br/>&lt;/html&gt;</code></p><br/>演示：<a href="http://www.54caizi.org/demo/dl-menu.html" target="_blank">http://www.54caizi.org/demo/dl-menu.html</a><br/><br/>]]></description><category>Web编程</category><comments>http://www.54caizi.org/post/dl-menu.html#comment</comments><wfw:comment>http://www.54caizi.org/</wfw:comment><wfw:commentRss>http://www.54caizi.org/feed.asp?cmt=50</wfw:commentRss><trackback:ping>http://www.54caizi.org/cmd.asp?act=tb&amp;id=50&amp;key=1e22ef33</trackback:ping></item><item><title>div+css布局中多列等高处理</title><author>a@b.com (风流才子)</author><link>http://www.54caizi.org/post/autoHeight.html</link><pubDate>Wed, 06 Aug 2008 14:36:27 +0800</pubDate><guid>http://www.54caizi.org/post/autoHeight.html</guid><description><![CDATA[div+css布局中多列等高的问题可能大家都碰到过，网上也有一系列的处理方法，有的用背景来处理，有的用内外边距相抵来处理，才子觉得都不是非常好用，不太方便。最近帮人改版一个网站，也碰到这个问题，于是就写了一个两列等高的javascript函数来处理。后来想想可能有三列，四列或更多的情况下怎么办呢？改一改函数就行了，当然可以，但显得不通用了，于是写了下面这个函数，理论上是无限列都可以处理，当然实际上不太可能，一个页面最多也不至于多过4，5个列吧。<br/>看代码：<br/><p class="code"><code>function&nbsp;autoHeight()&nbsp;{<br/>&nbsp;&nbsp;if&nbsp;(arguments.length&nbsp;&gt;&nbsp;1)&nbsp;{&nbsp;&nbsp;//参数个数必须大于1才执行函数<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;x&nbsp;=&nbsp;arguments.length;&nbsp;&nbsp;//计算参数个数<br/>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;elements=[];&nbsp;&nbsp;//定义一个临时数组容器<br/>&nbsp;&nbsp;&nbsp;&nbsp;//循环取出各个列的高度值<br/>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i&lt;x;&nbsp;i++)&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elements.push(document.getElementById(arguments[i]).scrollHeight);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;//用冒泡法取出最大列高的值<br/>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;max&nbsp;=&nbsp;elements[0];<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt;x;&nbsp;i++)&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(max&nbsp;&lt;&nbsp;elements[i])&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;=&nbsp;elements[i];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;//再用循环将最大列高的值赋予各个列<br/>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i&lt;x;&nbsp;i++)&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(arguments[i]).style.height&nbsp;=&nbsp;max+"px";<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;}<br/>}</code></p>用了最原始的冒泡法来取得最大列高的项目，其实冒泡法的效率是比较低的，但想到实际应用中最多也应该不会超过4,5个列，那效率就根本不是问题了，没任何感觉。<br/><font color="Red">如果各位有什么好的算法可以快速的取出一个数组中最大值，请回复告知，谢谢。</font><br/><br/>做了个演示页面：<a href="http://www.54caizi.org/demo/autoHeight.html" target="_blank">http://www.54caizi.org/demo/autoHeight.html</a><br/><br/>风流才子 作品，转帖请保留原文地址链接，谢谢合作！<br/><a href="http://www.54caizi.org" target="_blank">才子小窝</a>：<a href="http://www.54caizi.org" target="_blank">http://www.54caizi.org</a><br/><br/>]]></description><category>Web编程</category><comments>http://www.54caizi.org/post/autoHeight.html#comment</comments><wfw:comment>http://www.54caizi.org/</wfw:comment><wfw:commentRss>http://www.54caizi.org/feed.asp?cmt=49</wfw:commentRss><trackback:ping>http://www.54caizi.org/cmd.asp?act=tb&amp;id=49&amp;key=de4395d1</trackback:ping></item><item><title>解决IE6下PNG图片不透明的问题</title><author>a@b.com (风流才子)</author><link>http://www.54caizi.org/post/enablePngImages.html</link><pubDate>Tue, 05 Aug 2008 17:14:16 +0800</pubDate><guid>http://www.54caizi.org/post/enablePngImages.html</guid><description><![CDATA[IE6真是个烂浏览器，CSS方面已经一堆bug了，连这么优秀的png图片也不兼容，无法透明，透明部分会显示成灰色，倒。<br/>有人会选择换成gif格式，但gif格式虽然可以做到透明，但会有毛边，很不美观，不爽。<br/>在网上找到了几个方法，觉得这个方法最简单，才子修改了一下函数，直接针对IE6有效，其它浏览器不会执行此函数。也就不需要用到IE独有的条件注释来判断了。<br/>看原代码：<br/><p class="code"><code>function&nbsp;enablePngImages()&nbsp;{<br/>&nbsp;&nbsp;var&nbsp;imgArr&nbsp;=&nbsp;document.getElementsByTagName("IMG");<br/>&nbsp;&nbsp;for(i=0;&nbsp;i&lt;imgArr.length;&nbsp;i++){<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(imgArr[i].src.toLowerCase().lastIndexOf(".png")&nbsp;!=&nbsp;-1){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgArr[i].style.filter&nbsp;=&nbsp;"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"&nbsp;+&nbsp;imgArr[i].src&nbsp;+&nbsp;"',&nbsp;sizingMethod='auto')";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgArr[i].src&nbsp;=&nbsp;"images/none.gif";<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if(imgArr[i].currentStyle.backgroundImage.lastIndexOf(".png")&nbsp;!=&nbsp;-1){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;img&nbsp;=&nbsp;imgArr[i].currentStyle.backgroundImage.substring(5,imgArr[i].currentStyle.backgroundImage.length-2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgArr[i].style.filter&nbsp;=&nbsp;"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+img+"',&nbsp;sizingMethod='crop')";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgArr[i].style.backgroundImage&nbsp;=&nbsp;"url(images/none.gif)";<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;}<br/>}</code></p>原理就是通过 javascript 和 css 滤镜来解决。images/none.gif是一张空白一个像素的图片。<br/>调用时要采用IE独有的条件注释来判断，如下：<br/><p class="code"><code>&lt;!--[if&nbsp;lt&nbsp;IE&nbsp;7]&gt;<br/>&lt;script&nbsp;type='text/javascript'&gt;<br/>enablePngImages();<br/>&lt;/script&gt;<br/>&lt;![endif]--&gt;</code></p><br/>才子觉得这样调用不太方便，改了一下函数，添加了判断IE浏览器版本的代码，调用更方便。看代码：<br/><p class="code"><code>function&nbsp;enablePngImages()&nbsp;{<br/>&nbsp;&nbsp;var&nbsp;imgArr&nbsp;=&nbsp;document.getElementsByTagName("IMG");<br/>&nbsp;&nbsp;var&nbsp;version&nbsp;=&nbsp;parseFloat(navigator.appVersion.split("MSIE")[1]);<br/><br/>&nbsp;&nbsp;if&nbsp;(version&nbsp;=&nbsp;6.0&nbsp;&&&nbsp;(document.body.filters))&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i=0,&nbsp;j=imgArr.length;&nbsp;i&lt;j;&nbsp;i++){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(imgArr[i].src.toLowerCase().lastIndexOf(".png")&nbsp;!=&nbsp;-1){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgArr[i].style.filter&nbsp;=&nbsp;"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"&nbsp;+&nbsp;imgArr[i].src&nbsp;+&nbsp;"',&nbsp;sizingMethod='auto')";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgArr[i].src&nbsp;=&nbsp;"images/none.gif";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(imgArr[i].currentStyle.backgroundImage.lastIndexOf(".png")&nbsp;!=&nbsp;-1){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;img&nbsp;=&nbsp;imgArr[i].currentStyle.backgroundImage.substring(5,imgArr[i].currentStyle.backgroundImage.length-2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgArr[i].style.filter&nbsp;=&nbsp;"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+img+"',&nbsp;sizingMethod='crop')";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgArr[i].style.backgroundImage&nbsp;=&nbsp;"url(images/none.gif)";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;}<br/>}</code></p>加了判断IE版本的代码，如果为IE6就执行。<br/>调用如下：<br/><p class="code"><code>window.onload&nbsp;=&nbsp;function()&nbsp;{<br/>&nbsp;&nbsp;enablePngImages();<br/>}</code></p>为什么要用window.onload呢？这是表示加载完页面内容再执行指定的函数，保证png图片加载完成了再执行。<br/><br/>做了个演示页面：<a href="http://www.54caizi.org/demo/enablePngImages.html" target="_blank">http://www.54caizi.org/demo/enablePngImages.html</a><br/><br/><br/>]]></description><category>Web编程</category><comments>http://www.54caizi.org/post/enablePngImages.html#comment</comments><wfw:comment>http://www.54caizi.org/</wfw:comment><wfw:commentRss>http://www.54caizi.org/feed.asp?cmt=48</wfw:commentRss><trackback:ping>http://www.54caizi.org/cmd.asp?act=tb&amp;id=48&amp;key=eb77d323</trackback:ping></item><item><title>关于table如何通过XHTML验证那档子事</title><author>a@b.com (风流才子)</author><link>http://www.54caizi.org/post/table-to-valid.html</link><pubDate>Mon, 28 Jul 2008 23:03:19 +0800</pubDate><guid>http://www.54caizi.org/post/table-to-valid.html</guid><description><![CDATA[很多人都因为强制要求自己的页面通过XHTML的标准验证而放弃使用table(表格)，想尽一切办法用可以通过验证的标签来模拟表格，什么ul+li啦，什么dl+dt+dd啦，有的甚至用javascript的document.write输出表格，真够晕的。因为我们常用的table里面会包含一些xhtml标准验证不允许的属性，如cellspacing属性，加上这个属性就通不过验证，在CSS里好像又根本没有这个属性的样式，写不进CSS，不用吧，表格线又实在难看，呵呵。<br/>一般我们写表格都是这样子写的：<br/><p class="code"><code>&lt;table&nbsp;border="0"&nbsp;width="100%"&nbsp;cellspacing="1"&nbsp;bgcolor="#000000"&gt;<br/>&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;bgcolor="#FFFFFF"&gt;XXX&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;bgcolor="#FFFFFF"&gt;XXX&lt;/td&gt;<br/>&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;bgcolor="#FFFFFF"&gt;XXX&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;bgcolor="#FFFFFF"&gt;XXX&lt;/td&gt;<br/>&nbsp;&nbsp;&lt;/tr&gt;<br/>&lt;/table&gt;<br/></code></p>在table里定义边框(border)为0，定义背景颜色，而表格间距(cellspacing)定义为1，再在td里定义背景颜色，这样table虽然定义了背景，但table里布满了td，td也定义了背景，table里还定义了表格间距为1，所以变成table的背景只留下了表格的间距了，其它地方已经被td的背景覆盖了，看起来像个定义了1px边框的表格一样。<br/>这样的写法是我们很早以前的写法了，那时我们都还没有关注web标准，也基本没有关注css样式，但现在我们可以定义一个css，可以简化及分离一下，如：<br/><p class="code"><code>&lt;style&nbsp;type="text/css"&gt;<br/>table&nbsp;{<br/>&nbsp;&nbsp;border:&nbsp;0px;<br/>&nbsp;&nbsp;width:&nbsp;100%;<br/>&nbsp;&nbsp;background:&nbsp;#000000;<br/>}<br/>td&nbsp;{<br/>&nbsp;&nbsp;background:#FFFFFF;<br/>}<br/>&lt;/style&gt;<br/>&lt;table&nbsp;cellspacing="1"&gt;<br/>&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;XXX&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;XXX&lt;/td&gt;<br/>&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;XXX&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;XXX&lt;/td&gt;<br/>&nbsp;&nbsp;&lt;/tr&gt;<br/>&lt;/table&gt;<br/></code></p>嗯，好像清爽了很多，表格与样式基本分离了，但可以看到，cellspacing="1"这个属性还在，不能去掉，一去掉的话，表格间距就变成2px了，就不是那种1px的细线边框了，很难看。table默认的间距就是2px，真晕，干吗要默认为2px，还没法在CSS中定义cellspacing这个属性，这不是害人嘛。加上cellspacing="1"这个属性又没法通过XHTML验证，正是因为这个原因，所以导致很多追求完美的人去研究其它方法来代替表格，让其通过验证，汗。。。<br/>其实我们大可不必这么“要求完美”，W3C从来没说过不允许使用table，table仍然是xhtml里非常重要的一部分，想想一个相对比较复杂的表格，如果用其它方法来代替表格，那不是要人命嘛。通不过验证就表示程序写得烂？呵呵，不至于吧。<br/>但我们是不是就只能忍受着xhtml验证时的错误报告呢？其实也不是啦，因为我们一般用的都是规则表格，并不复杂，行数列数都是标准的，没有什么合并行合并列的，那其实还是有办法定义CSS，让其通过xhtml的验证的。<br/>这里不得不说一说表格的标准写法，其实我们以前写table，严格来说都是错的，为什么呢？呵呵，因为一个完整的表格里可不光是只有tr和td的，还有thead(表头)，tfoot(表脚)，tbody(表身)等等，看下面的例子，这就是个完整的表格：<br/><p class="code"><code>&lt;table&gt;<br/>&nbsp;&nbsp;&lt;caption&gt;表格介绍&lt;/caption&gt;<br/>&nbsp;&nbsp;&lt;thead&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;表头1&lt;/th&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;表头2&lt;/th&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;/thead&gt;<br/>&nbsp;&nbsp;&lt;tfoot&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表脚1&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表脚2&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;/tfoot&gt;<br/>&nbsp;&nbsp;&lt;tbody&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表身1&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表身2&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表身3&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表身4&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;/tbody&gt;<br/>&lt;/table&gt;<br/></code></p>caption是表格的介绍，说明这个表格里的是些什么东东，这个标签我们比较少用，可能绝大部分人都压根没用过这个标签。还请注意了，thead表头的单元格容器不是td而是th，它的默认字体会比表身及表脚要加粗一点。thead, tfoot, tbody三者顺序还不能乱动，tfoot是写在tbody前面的，但浏览时会自动的排到tbody的后面去的，不用担心，呵呵。<br/>好了，这个表格没得说了吧，又完整，又没有任何其它的属性值，通过验证是肯定没问题的了。但如何来解决表格边框的问题呢？呵呵，看下面的CSS吧：<br/><p class="code"><code>&lt;style&nbsp;type="text/css"&gt;<br/>table,td,th&nbsp;{<br/>&nbsp;&nbsp;border:1px&nbsp;#000000&nbsp;solid;&nbsp;&nbsp;/*边框为1像素的黑色实线*/<br/>&nbsp;&nbsp;border-collapse:collapse;&nbsp;&nbsp;/*单元格相邻的边框合并*/<br/>&nbsp;&nbsp;background:#FFFFFF;&nbsp;&nbsp;/*定义背景颜色*/<br/>}<br/>&lt;/style&gt;<br/></code></p>没错，就这么简单，关键就在于第二句：border-collapse:collapse; 意思是将单元格相邻的边合并，单元格的边框都是1像素，相邻就应该有2像素了，但它们之间的边框被定义为合并了，不就还是1px吗？这不就是我们要的1px的细线边框吗？<br/><br/>OK，最后分享一下才子自己的完整CSS定义，感觉比较考虑比较周到也比较美观了，各位参考一下：<br/><p class="code"><code>&lt;style&nbsp;type="text/css"&gt;<br/>table,td,th&nbsp;{<br/>&nbsp;&nbsp;border:1px&nbsp;#09F&nbsp;solid;<br/>&nbsp;&nbsp;border-collapse:collapse;<br/>&nbsp;&nbsp;padding:5px;<br/>&nbsp;&nbsp;background:#FFF;<br/>}<br/>table&nbsp;{<br/>&nbsp;&nbsp;margin:5px&nbsp;0;<br/>&nbsp;&nbsp;width:100%;<br/>&nbsp;&nbsp;font:12px/1.5&nbsp;Verdana,&nbsp;Geneva,&nbsp;Arial,&nbsp;Helvetica,&nbsp;Sans-Serif;<br/>&nbsp;&nbsp;text-align:left;<br/>}<br/>caption&nbsp;{&nbsp;text-align:left;&nbsp;font:bold&nbsp;1.5em&nbsp;Verdana,Sans-Serif;&nbsp;}<br/>thead&nbsp;th,&nbsp;tfoot&nbsp;td&nbsp;{&nbsp;text-align:center;&nbsp;background:#D9ECFF;&nbsp;}<br/>thead&nbsp;th&nbsp;{&nbsp;font-size:120%;&nbsp;}<br/>&lt;/style&gt;<br/><br/>&lt;table&gt;<br/>&nbsp;&nbsp;&lt;caption&gt;表格介绍&lt;/caption&gt;<br/>&nbsp;&nbsp;&lt;thead&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;表头1&lt;/th&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;表头2&lt;/th&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;/thead&gt;<br/>&nbsp;&nbsp;&lt;tfoot&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表脚1&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表脚2&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;/tfoot&gt;<br/>&nbsp;&nbsp;&lt;tbody&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表身1&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表身2&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表身3&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;表身4&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&lt;/tbody&gt;<br/>&lt;/table&gt;<br/></code></p><br/>风流才子 作品，转帖请保留原文地址链接，谢谢合作！<br/><a href="http://www.54caizi.org" target="_blank">才子小窝</a>：<a href="http://www.54caizi.org" target="_blank">http://www.54caizi.org</a><br/><br/>]]></description><category>Web编程</category><comments>http://www.54caizi.org/post/table-to-valid.html#comment</comments><wfw:comment>http://www.54caizi.org/</wfw:comment><wfw:commentRss>http://www.54caizi.org/feed.asp?cmt=44</wfw:commentRss><trackback:ping>http://www.54caizi.org/cmd.asp?act=tb&amp;id=44&amp;key=de55bcc5</trackback:ping></item><item><title>利用DOM动态加载javascript文件</title><author>a@b.com (风流才子)</author><link>http://www.54caizi.org/post/dom-include-javascript.html</link><pubDate>Sun, 27 Jul 2008 13:41:28 +0800</pubDate><guid>http://www.54caizi.org/post/dom-include-javascript.html</guid><description><![CDATA[近几天玩DOM比较多，越来越觉得DOM操作的方便，可以动态添加/删除节点，今天无聊，写了个动态加载javascript文件的函数，非常简单，并没有什么技术含量，但却非常实用，有需要的朋友拿去用吧，嘿嘿。<br/><p class="code"><code>/****************************************<br/>&nbsp;*&nbsp;函数：incJS<br/>&nbsp;*&nbsp;参数：file&nbsp;---&nbsp;需要加载的js文件的地址<br/>&nbsp;*&nbsp;范例：incJS('/javascript/aa.js')<br/>&nbsp;****************************************/<br/>function&nbsp;incJS&nbsp;(file)&nbsp;{<br/>&nbsp;&nbsp;var&nbsp;el&nbsp;=&nbsp;document.createElement('script');<br/>&nbsp;&nbsp;el.src&nbsp;=&nbsp;file;<br/>&nbsp;&nbsp;el.type&nbsp;=&nbsp;'text/javascript';<br/>&nbsp;&nbsp;var&nbsp;head&nbsp;=&nbsp;document.getElementsByTagName('head')[0];<br/>&nbsp;&nbsp;head.appendChild(el);<br/>}<br/></code></p>这里解释一下file参数所指的地址，才子这里建议采用绝对目录地址。为什么要采用绝对目录，因为通常我们的javascript文件都放在某一个目录下，而我们调用javascript文件的页面却可能有N级目录，也许是根目录，也有二级目录，三级目录甚至四级目录，这样的话，如果采用相对目录会因为需要过多的去考虑相对目录的层数，还不如直接来个绝对目录方便。<br/><br/>演示：<a href="http://www.54caizi.org/demo/incjs.html" target="_blank">http://www.54caizi.org/demo/incjs.html</a><br/><br/>风流才子 作品，转帖请保留原文地址链接，谢谢合作！<br/><a href="http://www.54caizi.org" target="_blank">才子小窝</a>：<a href="http://www.54caizi.org" target="_blank">http://www.54caizi.org</a><br/><br/>]]></description><category>Web编程</category><comments>http://www.54caizi.org/post/dom-include-javascript.html#comment</comments><wfw:comment>http://www.54caizi.org/</wfw:comment><wfw:commentRss>http://www.54caizi.org/feed.asp?cmt=43</wfw:commentRss><trackback:ping>http://www.54caizi.org/cmd.asp?act=tb&amp;id=43&amp;key=f7d7d420</trackback:ping></item><item><title>一些不常用的meta的写法</title><author>a@b.com (风流才子)</author><link>http://www.54caizi.org/post/xhtml-meta.html</link><pubDate>Sat, 26 Jul 2008 13:12:53 +0800</pubDate><guid>http://www.54caizi.org/post/xhtml-meta.html</guid><description><![CDATA[head标签中的meta标签相信大家都不陌生了，特别是近几年SEO风行后，meta标签越来越被重视了。<br/>但我们常用的meta标签大概就下面几个：<br/><p class="code"><code>&lt;!--&nbsp;指明本页面所采用的字符集编码&nbsp;--&gt;<br/>&lt;meta&nbsp;http-equiv="content-type"&nbsp;content="text/html;&nbsp;charset=utf-8"&nbsp;/&gt;<br/>&lt;!--&nbsp;指明本页面所采用的文字语言类型&nbsp;--&gt;<br/>&lt;meta&nbsp;http-equiv="content-language"&nbsp;content="gb2312"&nbsp;/&gt;<br/>&lt;!--&nbsp;指明关键字，SEOer应该很重视这个&nbsp;--&gt;<br/>&lt;meta&nbsp;name="keywords"&nbsp;content="风流才子,才子小窝"&nbsp;/&gt;<br/>&lt;!--&nbsp;页面内容简介，SEOer同样很重视这个&nbsp;--&gt;<br/>&lt;meta&nbsp;name="description"&nbsp;content=""&nbsp;/&gt;</code></p>其实meta标签没有什么限制的，用户可随意自己添加一些没有什么意义的meta标签，例如google和yahoo的站长管理工具里，要求验证站点时，就会要求你在首页的head里添加一句指定的meta，用来验证这个站点是否是你所拥有的。如：<br/><p class="code"><code>&lt;meta&nbsp;name="y_key"&nbsp;content="9ecba7f4549f5681"&nbsp;/&gt;</code></p>添加后，google和yahoo的验证工具会来获取这个标签值进行验证。<br/><br/>还有一些官方指明的meta标签，用处其实不小，但用的时候并不多，例如指明页面不许缓存，每次访问都必须从服务器上下载：<br/><p class="code"><code>&lt;meta&nbsp;http-equiv="pragma"&nbsp;content="no-cache"&nbsp;/&gt;<br/>&lt;meta&nbsp;http-equiv="expires"&nbsp;content="0"&nbsp;/&gt;<br/>&lt;meta&nbsp;http-equiv="cache-cntrol"&nbsp;content="no-cache,&nbsp;must-revalidate"&nbsp;/&gt;</code></p>前两个标签在官方的电子书上可以找到，但第三个没有找到，才子也不清楚有没有意义，但看到有人这样写。<br/><p class="code"><code>&lt;meta&nbsp;name="robots"&nbsp;content="all"&nbsp;/&gt;<br/>&lt;meta&nbsp;name="author"&nbsp;content="Macky,&nbsp;风流才子"&nbsp;/&gt;<br/>&lt;meta&nbsp;http-equiv="content-script-type"&nbsp;content="text/javascript"&gt;</code></p>还有这三个标签用得也不算少，第一个告诉搜索引擎的机器人哪些页面需要索引，当然一般我们都会填写all啦<br/>第二个是声明页面的作者，写不写似乎没什么意义。<br/>第三个是指明页面中脚本的类型，HTML是前台，脚本当然一般就是javacript啦<br/><br/>我们还可以自定义一些标签来声明一些内容，才子在一个世界知名的品牌网站上看到过如下内容：<br/><p class="code"><code>&lt;meta&nbsp;name="copyright"&nbsp;content="www.54caizi.org"&nbsp;/&gt;<br/>&lt;meta&nbsp;name="identifier-url"&nbsp;content="www.54caizi.org"&nbsp;/&gt;<br/>&lt;meta&nbsp;name="organization"&nbsp;content="www.54caizi.org"&nbsp;/&gt;<br/>&lt;meta&nbsp;name="publisher"&nbsp;content="www.54caizi.org"&nbsp;/&gt;</code></p>以上这些标签虽然并没有什么意义，但显得这个网站够专业，够权威嘛，嘿嘿。<br/>第一个是版权，第二个是标识符，第三个是声明机构，组织，第四个是发行者<br/><br/>当然还有一些标签，如声明Generator (编辑器)，Page-Enter、Page-Exit (进入与退出时的效果)等等，免了吧，不建议用，没任何意义了。<br/><br/>风流才子 作品，转帖请保留原文地址链接，谢谢合作！<br/><a href="http://www.54caizi.org" target="_blank">才子小窝</a>：<a href="http://www.54caizi.org" target="_blank">http://www.54caizi.org</a><br/><br/>]]></description><category>Web编程</category><comments>http://www.54caizi.org/post/xhtml-meta.html#comment</comments><wfw:comment>http://www.54caizi.org/</wfw:comment><wfw:commentRss>http://www.54caizi.org/feed.asp?cmt=40</wfw:commentRss><trackback:ping>http://www.54caizi.org/cmd.asp?act=tb&amp;id=40&amp;key=785180b8</trackback:ping></item><item><title>扩展DOM层的控制开关</title><author>a@b.com (风流才子)</author><link>http://www.54caizi.org/post/javascript-viewnone.html</link><pubDate>Sun, 20 Jul 2008 23:42:52 +0800</pubDate><guid>http://www.54caizi.org/post/javascript-viewnone.html</guid><description><![CDATA[才子很多年前就写过一个层的模糊控制开关函数，用来<font color="Red">模糊控制</font>指定层的显示与否。<br/>PS：所谓模糊控制是指，当一个层的显示与否未知的情况下，触发这个函数时，被指定的层，原本是显示的变为不显示，而原本不显示的变为显示，才子称其为模糊控制，汗，这种名称都被才子想得出来，晕一下。<br/><br/>原函数如下：<br/><p class="code"><code>function&nbsp;viewnone(e){<br/>&nbsp;&nbsp;var&nbsp;obj&nbsp;=&nbsp;document.getElementById(e);<br/>&nbsp;&nbsp;obj.style.display=(obj.style.display=="none")?"":"none";<br/>}</code></p>调用方法就指定一个ID号即可，如：<br/><p class="code"><code>&lt;div&nbsp;id="testDiv1"&gt;这里是层1&lt;/div&gt;<br/>&lt;input&nbsp;type="button"&nbsp;value="层的开关"&nbsp;onclick="viewnone('testDiv1');"&nbsp;/&gt;</code></p>非常简单，通过取得指定DOM层的ID，获得一个对象，取其style.display的属性值并加以修改，如原本为none，即不显示时，将其值修改为""，即取消了不显示，就变为显示；如原本就是没有display的属性值，也就是原本是显示出来的，则修改其属性值为none，变为不显示。<br/>函数简单高效，符合HTML DOM，所有浏览器均有效。<br/><br/>但今天做一个页面，需要指定某个层的显示与否，是明确指定，就算原本是显示的，触发一个函数仍然是显示，反之也一样。那么上面这个函数就显示不适合了，本来想重新编写一个函数来控制的，想想没什么必要，干脆直接在原函数上修改一下就行了，于是就有了下面这个函数：<br/><p class="code"><code>function&nbsp;viewnone(e){<br/>&nbsp;&nbsp;var&nbsp;obj&nbsp;=&nbsp;document.getElementById(e);<br/>&nbsp;&nbsp;obj.style.display=(obj.style.display=="none")?"":"none";<br/>&nbsp;&nbsp;if&nbsp;(arguments.length&nbsp;==&nbsp;2)&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(arguments[1]=="show")&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.style.display="";<br/>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(arguments[1]=="hide")&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.style.display="none";<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;}<br/>}</code></p>调用时还需要再指定一个明确的开关了，如：<br/><p class="code"><code>&lt;div&nbsp;id="testDiv2"&gt;这里是层2&lt;/div&gt;<br/>&lt;input&nbsp;type="button"&nbsp;value="关闭层2"&nbsp;onclick="viewnone('testDiv2','hide');"&nbsp;/&gt;<br/>&lt;input&nbsp;type="button"&nbsp;value="打开层2"&nbsp;onclick="viewnone('testDiv2','show');"&nbsp;/&gt;</code></p>大家看到只是加了几行而已，没有修改原函数的名字及参数，直接用arguments的特性做了一下扩展，arguments表示参数的集合，与数组非常类似，同样有下标，也是用arguments[n]这样的形式进行访问，下次再专门写篇关于arguments与Array(数组)方面的文章再做进一步探讨，这里就不多介绍了。<br/>上面这个修改后的函数，就添加了几行代码，通过取得arguments的长度来判断是否有指定层的开关，如果arguments长度为2，表示引入的参数有两个，第一个不用多，就是DOM的层ID，而第二个参数就是明确指定的开关值，其值有两个：分别为<font color="Red">show</font>和<font color="Red">hide</font>，就是通过判断这个参数的值来明确指定层的显示与否，后面的代码相信不用多解释大家也都应该明白意思了。<br/><br/>还有疑问的请看详细的使用范例：<br/><a href="http://www.54caizi.org/demo/javascript-viewnone.html"  target="_blank">http://www.54caizi.org/demo/javascript-viewnone.html</a><br/><br/>风流才子 作品，转帖请保留原文地址链接，谢谢合作！<br/><a href="http://www.54caizi.org" target="_blank">才子小窝</a>：<a href="http://www.54caizi.org" target="_blank">http://www.54caizi.org</a><br/><br/>]]></description><category>Web编程</category><comments>http://www.54caizi.org/post/javascript-viewnone.html#comment</comments><wfw:comment>http://www.54caizi.org/</wfw:comment><wfw:commentRss>http://www.54caizi.org/feed.asp?cmt=34</wfw:commentRss><trackback:ping>http://www.54caizi.org/cmd.asp?act=tb&amp;id=34&amp;key=cfb94087</trackback:ping></item><item><title>[转]深入认识javascript中的eval函数</title><author>a@b.com (风流才子)</author><link>http://www.54caizi.org/post/javascript-eval.html</link><pubDate>Sat, 19 Jul 2008 23:28:58 +0800</pubDate><guid>http://www.54caizi.org/post/javascript-eval.html</guid><description><![CDATA[先来说eval的用法，内容比较简单，熟悉的可以跳过。<br/>eval函数接收一个参数s，如果s不是字符串，则直接返回s。否则执行s语句。如果s语句执行结果是一个值，则返回此值，否则返回undefined。<br/>需要特别注意的是对象声明语法“{}”并不能返回一个值，需要用括号括起来才会返回值，简单示例如下：<br/><p class="code"><code>var&nbsp;code1='"a"&nbsp;+&nbsp;2';&nbsp;&nbsp;//表达式<br/>var&nbsp;code2='{a:2}';&nbsp;&nbsp;&nbsp;&nbsp;//语句<br/>alert(eval(code1));&nbsp;&nbsp;&nbsp;&nbsp;//-&gt;'a2'<br/>alert(eval(code2));&nbsp;&nbsp;&nbsp;&nbsp;//-&gt;undefined<br/>alert(eval('('&nbsp;+&nbsp;code2&nbsp;+&nbsp;')'));&nbsp;&nbsp;&nbsp;&nbsp;//-&gt;[object&nbsp;Object]</code></p>可以看到，对于对象声明语句来说，仅仅是执行，并不能返回值。为了返回常用的“{}”这样的对象声明语句，必须用括号括住，以将其转换为表达式，才能返回其值。这也是使用JSON来进行Ajax开发的基本原理之一。在例子中可以清楚的看到，第二个alert语句输出的是undefined，而第三个加了括号后输出的是语句表示的对象。<br/><br/>现在来说本文的重点，如何在函数内执行全局代码。为了说明这个问题，先看一个例子：<br/><p class="code"><code>var&nbsp;s='global';&nbsp;&nbsp;&nbsp;&nbsp;//定义一个全局变量<br/>function&nbsp;demo1(){<br/>&nbsp;&nbsp;eval('var&nbsp;s="local"');<br/>}<br/>demo1();<br/>alert(s);&nbsp;&nbsp;//-&gt;global</code></p>很好理解，上面的demo1函数等价于：function demo1(){var s='local';}，其中定义了一个局部变量s。<br/>所以最后的输出是global并不是什么奇怪的事情，毕竟大家都能很清楚的区分局部变量和全局变量。<br/>仔细体会一下，可以发现eval函数的特点，它总是在调用它的上下文变量空间（也称为：包，closure）内执行，无论是变量定义还是函数定义都是如此，所以如下的代码会产生函数未定义的错误：<br/><p class="code"><code>var&nbsp;s='function&nbsp;test(){return&nbsp;1;}';&nbsp;&nbsp;&nbsp;&nbsp;//一个函数定义语句<br/>function&nbsp;demo2(){<br/>&nbsp;&nbsp;eval(s);<br/>}<br/>demo2();<br/>alert(test());&nbsp;&nbsp;&nbsp;&nbsp;//-&gt;error:test&nbsp;is&nbsp;not&nbsp;defined</code></p>这是因为test函数在局部空间定义，demo2函数内可以访问到，外面就访问不到了。<br/><br/>而在实际的Ajax开发中，有时我们需要从服务器动态获取代码来执行，以减轻一次载入代码过多的问题，或者是一些代码是通过Javascript自身生成的，希望用eval函数来使其执行。<br/>但这样的动态获取代码的工作一般在函数内完成，比如：<br/><p class="code"><code>function&nbsp;loadCode(){<br/>&nbsp;&nbsp;var&nbsp;code=getCode();<br/>&nbsp;&nbsp;eval(code);<br/>}</code></p>可见eval不可能在全局空间内执行，这就给开发带来了不少问题，也看到过很多人为此郁闷。<br/><br/>不过现在偶终于找到了解决办法，嘿嘿，可以同时兼容IE和Firefox，方法如下：<br/><p class="code"><code>var&nbsp;X2={}&nbsp;&nbsp;//my&nbsp;namespace:)<br/>X2.Eval=function(code){<br/>&nbsp;&nbsp;if(!!(window.attachEvent&nbsp;&&&nbsp;!window.opera)){<br/>&nbsp;&nbsp;&nbsp;&nbsp;//ie<br/>&nbsp;&nbsp;&nbsp;&nbsp;execScript(code);<br/>&nbsp;&nbsp;}else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;//not&nbsp;ie<br/>&nbsp;&nbsp;&nbsp;&nbsp;window.eval(code);<br/>&nbsp;&nbsp;}<br/>}</code></p>现在如果要想在函数内定义全局代码，就可以通过调用X2.Eval(code)方法，一个例子如下：<br/><p class="code"><code>var&nbsp;s='global';<br/>function&nbsp;demo3(){<br/>&nbsp;&nbsp;X2.Eval('var&nbsp;s="local"');<br/>}<br/>demo3();<br/>alert(s);&nbsp;//-&gt;'local'</code></p>可见，在demo3函数内重新定义了全局变量s="local"。<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/>]]></description><category>Web编程</category><comments>http://www.54caizi.org/post/javascript-eval.html#comment</comments><wfw:comment>http://www.54caizi.org/</wfw:comment><wfw:commentRss>http://www.54caizi.org/feed.asp?cmt=33</wfw:commentRss><trackback:ping>http://www.54caizi.org/cmd.asp?act=tb&amp;id=33&amp;key=f5f2d490</trackback:ping></item><item><title>一个漂亮的可拖动的弹出窗口</title><author>a@b.com (风流才子)</author><link>http://www.54caizi.org/post/alertmsg.html</link><pubDate>Wed, 16 Jul 2008 20:50:41 +0800</pubDate><guid>http://www.54caizi.org/post/alertmsg.html</guid><description><![CDATA[忘了在哪找到的，很久了，最近做一个东东需要用到弹出窗口，翻了出来。<br/>觉得还不是非常满意，自己动手改了一改，感觉不错，分享出来。<br/>代码用javascript封装，调用很简单，效果经过才子严格测试，支持IE5.5, IE6, IE7, FireFox2, FireFox3, Opera9。<br/>不多说，直接给演示：<br/><a href="http://www.54caizi.org/demo/alertMsg.html"  target="_blank">http://www.54caizi.org/demo/alertMsg.html</a><br/><br/>请在演示里直接右键－查看源代码取得代码，这里就不贴代码了。<br/><br/>]]></description><category>Web编程</category><comments>http://www.54caizi.org/post/alertmsg.html#comment</comments><wfw:comment>http://www.54caizi.org/</wfw:comment><wfw:commentRss>http://www.54caizi.org/feed.asp?cmt=32</wfw:commentRss><trackback:ping>http://www.54caizi.org/cmd.asp?act=tb&amp;id=32&amp;key=835fe1df</trackback:ping></item></channel></rss>
