<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
  <channel>
    <title><![CDATA[never-online]]></title> 
    <link>http://www.never-online.net/blog/</link> 
    <description><![CDATA[Eventually, I am never-online...]]></description> 
    <language>en</language> 
    <copyright><![CDATA[Copyright 2009, never-online]]></copyright> 
    <webMaster><![CDATA[blueDestiny[at]126.com (never-online)]]></webMaster> 
    <generator>LBS v2.0.304</generator> 
    <pubDate>Wed, 07 Jan 2009 17:58:11 +0800</pubDate> 
    <ttl>60</ttl>
  
    <item>
      <title><![CDATA[keydown在opera里与其他浏览器的区别]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=264]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Tue, 06 Jan 2009 00:56:10 +0800</pubDate> 
      <description><![CDATA[运行一下代码就明白了。<br /><div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; <br />&quot;http&#58;//www.w3.org/TR/html4/strict.dtd&quot;&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&lt;title&gt;Rank&#39;s HTML document&lt;/title&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-cache&quot;&gt;  <br />&nbsp;&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot;&gt;     <br />&nbsp;&lt;meta http-equiv=&quot;Expires&quot; content=&quot;0&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;ImageToolbar&quot; content=&quot;no&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Creator.name&quot; content=&quot;Rank, BlueDestiny, never-online&quot;&gt;<br />&nbsp;&lt;style type=&quot;text/css&quot; title=&quot;default&quot; media=&quot;screen&quot;&gt;<br />&nbsp;/*&lt;![CDATA[*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body{font:13px/1.4 arial,helvetica,sans-serif;*font-size:small;*font:x-small;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p {text-indent:2em;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table {width:500px;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table th {background:#eea;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table td {background:#eed;text-align:center;}<br />&nbsp;/*]]&gt;*/<br />&nbsp;&lt;/style&gt;<br /><br />&nbsp;&lt;/head&gt;<br />&nbsp;&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;h1&gt;keydown重复触发事件在几种浏览器里的差别&lt;/h1&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;1&quot; border=&quot;0&quot; width=&quot;100%&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;IE&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Firefox&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Opera&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Google Chrome&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Safari&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;Y&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;Y&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;N&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;Y&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;Y&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/p&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;也就是在opera中，keydown一直按下只会触发一次该事件，而在其他浏览器当中则都会按照一定的频率来触发<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/p&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;p id=&quot;log&quot;&gt;请一直按下键盘不放可以查看到效果&lt;/p&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;script type=&quot;text/javascript&quot;&gt;//&lt;![CDATA[<br />&nbsp;&nbsp;&nbsp;&nbsp;document.onkeydown = function(e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var nKeycode = window.event ? event.keyCode : e.which;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(&#39;log&#39;).innerHTML = &#39;keyCode is &#39; +nKeycode+ &#39;, random number&#39; +Math.random();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//]]&gt;&lt;/script&gt;<br />&nbsp;&lt;/body&gt;<br />&lt;/html&gt;</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=264]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[面向对象之非开发应用]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=263]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Wed, 31 Dec 2008 01:18:33 +0800</pubDate> 
      <description><![CDATA[也许很多朋友都熟悉面向对象的设计与开发，在我看来，四人帮的同学为我们总结出这二十几条模式，远远不只应用到我们的develop上面。<br />它们完全可以在开发方式和沟通方式上用。前几天同事和我谈到敏捷开发。不也是总结了传统的开发模型与面向对象的经验吗？<br />对于敏捷开发不太熟，这几天查了点资料，感觉是大团队用传统的开发方式，也可以说用文档驱动，而小团队是用敏捷开发方式，以人来驱动。因为对于大团队来说有可能需求是扩散的，而不是聚合型，假设以敏捷开发（人来驱动开发），以每个人为图的一个原点，那么N个人的连通图的总边数=N*(N-1)/2，所以沟通成本是很大的。<br /><br />说跑题了~ <img src="http://www.never-online.net/blog/styles/g/images/smilies/icon_stun.gif" border="0" alt="[stun]" /> 说回OO上来。既然面向对象是前人总结的经验，而面向对象是一种万物为对象的一种开发方式，那么我们可以肯定的说，它在一定程度上可以应用于我们平常的生活当中来。<br /><br />例如：<br />adapter模式。<br />当两个人沟通出现问题的时候，可以通过中间人做adpter来达成一致。<br /><br />command模式。<br />需求不能一条一条不停的发散的扑面而来，应该是和我们去饭店吃饭一样，用一张订单来记录你想要点什么东西，将订单交由厨师来处理。<br /><br />template模式。<br />前人已有经验，自己做的事情应该根据前人经验（template），再把一些事情特殊处理。<br /><br />factory，facade，flyweight等等都可以应用到生活当中去，OO的理解可以解释很多我们遇到问题的解决方法。<br /> <img src="http://www.never-online.net/blog/styles/g/images/smilies/icon_lol.gif" border="0" alt="[lol]" />]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=263]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[798随拍]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=262]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sun, 21 Dec 2008 01:11:07 +0800</pubDate> 
      <description><![CDATA[<a href="http://www.798.net.cn/" title="http://www.798.net.cn/" target="_blank">798</a><br /><br />注：是上个星期去的，今天刚才参加经典的聚会来着。因为前端的人比较多，为有啊做了宣传，也顺便提提<b>招人</b>的事。 <img src="http://www.never-online.net/blog/styles/g/images/smilies/icon_lol.gif" border="0" alt="[lol]" /> <br />只是放些行程中可以看到的作品，算是随拍的照片吧。去的路上有个小插曲，我是先坐地铁到三元桥，然后转401路，查到地图上要我坐到酒仙桥......<br />后来往回走了几站路才到798...=_=<br /><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3055/3104858340_69069625ab.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3055/3104858340_69069625ab.jpg?v=0" alt="http://farm4.static.flickr.com/3055/3104858340_69069625ab.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3223/3104027411_5c8cd26862.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3223/3104027411_5c8cd26862.jpg?v=0" alt="http://farm4.static.flickr.com/3223/3104027411_5c8cd26862.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3233/3104029277_6ae8f33cc5.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3233/3104029277_6ae8f33cc5.jpg?v=0" alt="http://farm4.static.flickr.com/3233/3104029277_6ae8f33cc5.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3237/3104030645_e0d7421a17.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3237/3104030645_e0d7421a17.jpg?v=0" alt="http://farm4.static.flickr.com/3237/3104030645_e0d7421a17.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3217/3104031941_500837edd0.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3217/3104031941_500837edd0.jpg?v=0" alt="http://farm4.static.flickr.com/3217/3104031941_500837edd0.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3161/3104860232_3b1e40cbda.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3161/3104860232_3b1e40cbda.jpg?v=0" alt="http://farm4.static.flickr.com/3161/3104860232_3b1e40cbda.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3035/3104027931_8877185ba4.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3035/3104027931_8877185ba4.jpg?v=0" alt="http://farm4.static.flickr.com/3035/3104027931_8877185ba4.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3009/3104859668_4485e0c2d9.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3009/3104859668_4485e0c2d9.jpg?v=0" alt="http://farm4.static.flickr.com/3009/3104859668_4485e0c2d9.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3082/3104861632_0a3353c83c.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3082/3104861632_0a3353c83c.jpg?v=0" alt="http://farm4.static.flickr.com/3082/3104861632_0a3353c83c.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3185/3104863808_f953699077.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3185/3104863808_f953699077.jpg?v=0" alt="http://farm4.static.flickr.com/3185/3104863808_f953699077.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3151/3104032771_4c736cf593.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3151/3104032771_4c736cf593.jpg?v=0" alt="http://farm4.static.flickr.com/3151/3104032771_4c736cf593.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3084/3104864658_a189f1890e.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3084/3104864658_a189f1890e.jpg?v=0" alt="http://farm4.static.flickr.com/3084/3104864658_a189f1890e.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3237/3104865222_d5e21faac7.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3237/3104865222_d5e21faac7.jpg?v=0" alt="http://farm4.static.flickr.com/3237/3104865222_d5e21faac7.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3134/3104034045_09438cf028.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3134/3104034045_09438cf028.jpg?v=0" alt="http://farm4.static.flickr.com/3134/3104034045_09438cf028.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3206/3104866230_2f78b0541c.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3206/3104866230_2f78b0541c.jpg?v=0" alt="http://farm4.static.flickr.com/3206/3104866230_2f78b0541c.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3157/3104866734_75f0c76ea0.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3157/3104866734_75f0c76ea0.jpg?v=0" alt="http://farm4.static.flickr.com/3157/3104866734_75f0c76ea0.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3196/3104036183_dc57dfa1de.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3196/3104036183_dc57dfa1de.jpg?v=0" alt="http://farm4.static.flickr.com/3196/3104036183_dc57dfa1de.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3066/3104868180_5a752e9d5d.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3066/3104868180_5a752e9d5d.jpg?v=0" alt="http://farm4.static.flickr.com/3066/3104868180_5a752e9d5d.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3003/3104868620_6290b0e95a.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3003/3104868620_6290b0e95a.jpg?v=0" alt="http://farm4.static.flickr.com/3003/3104868620_6290b0e95a.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3076/3104037585_80132d8aee.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3076/3104037585_80132d8aee.jpg?v=0" alt="http://farm4.static.flickr.com/3076/3104037585_80132d8aee.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3075/3104037961_e707a9f982.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3075/3104037961_e707a9f982.jpg?v=0" alt="http://farm4.static.flickr.com/3075/3104037961_e707a9f982.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3137/3104870074_a751b3d077.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3137/3104870074_a751b3d077.jpg?v=0" alt="http://farm4.static.flickr.com/3137/3104870074_a751b3d077.jpg?v=0" class="imgBorder"/></a></div>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=262]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[ie6 sp1+ssl+ajax(XMLHttpRequest)=trouble]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=261]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sun, 21 Dec 2008 01:04:33 +0800</pubDate> 
      <description><![CDATA[在ie6 sp1访问https站点，ajax会<b>随机</b>出现一个winet的状态码：12152。如果你还没有看到过这个困惑的状态码，请<a href="http://www.baidu.com/s?tn=ichuner_4_pg&amp;ie=gb2312&amp;bs=xmlhttp+12152&amp;sr=&amp;z=&amp;cl=3&amp;f=8&amp;wd=ajax+12152&amp;ct=0" title="http://www.baidu.com/s?tn=ichuner_4_pg&amp;ie=gb2312&amp;bs=xmlhttp+12152&amp;sr=&amp;z=&amp;cl=3&amp;f=8&amp;wd=ajax+12152&amp;ct=0" target="_blank">参看这里</a>。<br /><br />这至少可以说明两个问题<ul class="ubb-list" ><li>new ActiveXObject(progId)生成的XMLHttpRequest是winet的一部分。MS很喜欢资源重利用，从select这个怪胎就可以看出来了。</li><li>MS ie7以下对ssl的支持不够好。</li></ul>纵然ajax带来很好的用户体验，给无数前端开发的人员提供了就业机会。但是我的意见还是坚持的是，在没有ajax的时候，我们的web页面也要能成功的运行。<br />那么，从上面这样的bad case看来，如何让我没有ajax也能照常用呢？<br /><br />让我们想想解决方案<br /><br />解决方案也得从长计议，<br /><br />1.  出现上述的情况基数人群很少很少，那么均衡整体项目考虑，我们可以短时间内可以不解决这个问题。<br />2.  无论如何都解决掉这个问题，拔掉牙中这根刺。而我们又不想彻底的抛弃ajax，该怎么办。（因为我们不仅仅只有ie6，MS还有ie7和ie8。所以不能因为 sp1或某些奇怪版本的ie用户而摒弃ajax。）<br />3. 如果1, 2都不成立，可以直接不用ajax，改用传统的提交方式。<br /><br />1和3没有什么可说了，第二种情况会更多一些，我们可以：<ul class="ubb-list" ><li>把无刷新页面看做是一个与服务器沟通的桥梁的话，这座桥除了用XMLHttpRequest之外，还可以用iframe。形成一个connection的adapter。</li><li>ajax出现的异常情况下用普通的方式去提交表单。</li></ul>以下用一点小示例来说明问题用iframe回调的原理：<br />点击此处<a href="http://www.never-online.net/code/js/iframe-callback/default.html" title="http://www.never-online.net/code/js/iframe-callback/default.html" target="_blank">http://www.never-online.net/code/js/iframe-callback/default.html</a> 查看示例。<br /><br />请注意，当你的浏览器是ie6 sp1，装了高级版本的MSXML也是没有用的。因为这是与IE有关，与MSXML的版本没有任何关系。<br /><br />另外，再加一个比较快速的解决方案<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(this.requestor.status)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 12029:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 12030:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 12031:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 12152:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 12159:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// fixed ie ssl bug, retry send data<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var loader = this;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTimeout( function() { loader.execute.call(loader); }, 10);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.onError(this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=261]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[radio list的细节]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=260]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Mon, 24 Nov 2008 20:34:57 +0800</pubDate> 
      <description><![CDATA[see also: <a href="http://www.never-online.net/blog/?id=227" title="http://www.never-online.net/blog/?id=227" target="_blank">IE在DOM操作有表单控件时的bug</a><ul class="ubb-list" ><li>可支持方向键 </li><li>当radio最后一个选中时，按小键盘后会自动跳回第一个 </li><li>checked可自动触发onclick </li><li>支持各种浏览器,cross-browser </li></ul>bellow is the example:<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; <br />&quot;http&#58;//www.w3.org/TR/html4/strict.dtd&quot;&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&lt;title&gt;Rank&#39;s HTML document&lt;/title&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-cache&quot;&gt;  <br />&nbsp;&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot;&gt;     <br />&nbsp;&lt;meta http-equiv=&quot;Expires&quot; content=&quot;0&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;ImageToolbar&quot; content=&quot;no&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Creator.name&quot; content=&quot;Rank, BlueDestiny, never-online&quot;&gt;<br />&nbsp;&lt;style type=&quot;text/css&quot; title=&quot;default&quot; media=&quot;screen&quot;&gt;<br />&nbsp;/*&lt;![CDATA[*/<br />&nbsp;&nbsp;&nbsp;&nbsp;body { font:13px/1.5 arial; }<br />&nbsp;/*]]&gt;*/<br />&nbsp;&lt;/style&gt;<br />&nbsp;&lt;/head&gt;<br />&nbsp;&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;h1&gt;radio list的妙用&lt;/h1&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;ol&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;可支持方向键&lt;/li&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;当radio最后一个选中时，按小键盘后会自动跳回第一个&lt;/li&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;checked可自动触发onclick&lt;/li&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;支持各种浏览器,cross-browser&lt;/li&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ol&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;demo&lt;/h2&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;p id=&quot;wrap&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;input name=&quot;radio_n&quot; type=&quot;radio&quot;&gt;&lt;input name=&quot;radio_n&quot; type=&quot;radio&quot;&gt;&lt;input name=&quot;radio_n&quot; type=&quot;radio&quot;&gt;&lt;span id=&quot;ad&quot;&gt;&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/p&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;script type=&quot;text/javascript&quot;&gt;//&lt;![CDATA[<br />&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(&#39;wrap&#39;).onclick = function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(&#39;ad&#39;).innerHTML = (&#39;never-online \&#39;s weblog&#39;) + Math.random();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//]]&gt;&lt;/script&gt;<br />&nbsp;&lt;/body&gt;<br />&lt;/html&gt;</div><br />see also: <a href="http://www.never-online.net/blog/?id=227" title="http://www.never-online.net/blog/?id=227" target="_blank">IE在DOM操作有表单控件时的bug</a>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=260]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[从trim原型函数看js正则表达式的性能]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=259]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Mon, 24 Nov 2008 20:20:21 +0800</pubDate> 
      <description><![CDATA[see also:<a href="http://www.never-online.net/blog/?id=236" title="http://www.never-online.net/blog/?id=236" target="_blank">firefox 2 的正则表达式细节</a><br /><br />如果你看到别人写trim函数是用循环而不用正则表达式来写，请不要取笑，也许，他们就是高手。如果你很自信你的trim函数效率很高，请看完本文再下结论。<br /><br />一般情况下用正则写法为：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&lt;script type=&quot;text/javascript&quot;&gt;//&lt;![CDATA[<br />&nbsp;&nbsp;String.prototype.trim = function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;return this.replace(/^[\s\t ]+|[\s\t ]+$/g, &#39;&#39;);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;s = &#39; never-online\&#39;s weblog, www.never-online.net/blog &#39;;<br />&nbsp;&nbsp;alert(s.trim().length);<br />//]]&gt;&lt;/script&gt;</div><br />如果遇到大数据的变长字符串的话就会发现这个是很耗资源的。效率并不高，有的时候甚至无法忍受。<div class="code-op"><a href="javascript:NS_code.copy('codeFragment2')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment2')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment2')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment2">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; &quot;http&#58;//www.w3.org/TR/html4/strict.dtd&quot;&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;<br />&nbsp;&lt;title&gt;&lt;/title&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-cache&quot; /&gt;  <br />&nbsp;&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot; /&gt;     <br />&nbsp;&lt;meta http-equiv=&quot;Expires&quot; content=&quot;0&quot; /&gt;<br />&nbsp;&lt;meta http-equiv=&quot;ImageToolbar&quot; content=&quot;no&quot; /&gt;<br />&nbsp;&lt;style type=&quot;text/css&quot; title=&quot;default&quot; media=&quot;screen&quot;&gt;<br />&nbsp;/*&lt;![CDATA[*/<br /><br />&nbsp;/*]]&gt;*/<br />&nbsp;&lt;/style&gt;<br />&nbsp;&lt;/head&gt;<br />&nbsp;&nbsp;&lt;body&gt;<br />&nbsp;&nbsp;&lt;textarea&gt;请在这里写足够多的空格或者tab字符。&lt;/textarea&gt;<br />&nbsp;&nbsp;&lt;script type=&quot;text/javascript&quot;&gt;//&lt;![CDATA[<br />&nbsp;&nbsp;String.prototype.trim = function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;return this.replace(/^[\s\t ]+|[\s\t ]+$/g, &#39;&#39;);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;var s = document.getElementsByTagName(&#39;textarea&#39;)[0].value<br />&nbsp;&nbsp;var d = new Date();<br />&nbsp;&nbsp;s.trim();<br />&nbsp;&nbsp;alert(new Date()-d);<br />//]]&gt;&lt;/script&gt;<br />&nbsp;&nbsp;&lt;/body&gt;<br />&lt;/html&gt;<br /></div><br />在解释这个原因的时候想起以前看到master regular expression里面有提到过。NFA和DFA的引擎是有区别的。js/perl/php/java/.net都是NFA引擎。<br />而DFA与NFA机制上的不同带来5个影响：<br />1. DFA对于文本串里的每一个字符只需扫描一次，比较快，但特性较少；NFA要翻来覆去吃字符、吐字符，速度慢，但是特性丰富，所以反而应用广泛，当今主要的正则表达式引擎，如Perl、Ruby、Python的re模块、Java和.NET的regex库，都是NFA的。<br />2. 只有NFA才支持lazy和backreference（后向引用）等特性；<br />3. NFA急于邀功请赏，所以最左子正则式优先匹配成功，因此偶尔会错过最佳匹配结果；DFA则是“最长的左子正则式优先匹配成功”。<br />4. NFA缺省采用greedy量词(就是对于/.*/、/\w+/这样的“重复n”次的模式，以贪婪方式进行，尽可能匹配更多字符，直到不得以罢手为止)，<b>NFA会优先匹配量词</b>。<br />5. NFA可能会陷入递归调用的陷阱而表现得性能极差。<br /><br />backtracking（回朔）<br />当NFA发现自己吃多了，一个一个往回吐，边吐边找匹配，这个过程叫做backtracking。由于存在这个过程，在NFA匹配过程中，特别是在编写不合理的正则式匹配过程中，文本被反复扫描，效率损失是不小的。明白这个道理，对于写出高效的正则表达式很有帮助。<br /><br /><b>定位/分析原因</b><br />在解释上面的trim原型方法的时候。经过测试，先不说结果是否正确，有几个方法是可以化解JS NFA引擎的回朔次数的<br />a. 去掉限定的量词，即改成<div class="code-op"><a href="javascript:NS_code.copy('codeFragment3')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment3')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment3')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment3">&nbsp;String.prototype.trim = function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;return this.replace(/^[\s\t ]+|[\s\t ]$/g, &#39;&#39;);<br />&nbsp;}</div>b. 去掉字符串尾匹配。即改成:<div class="code-op"><a href="javascript:NS_code.copy('codeFragment4')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment4')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment4')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment4">&nbsp;String.prototype.trim = function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;return this.replace(/^[\s\t ]+/g, &#39;&#39;);<br />&nbsp;}</div>c.加入多行匹配。即改成：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment5')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment5')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment5')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment5">&nbsp;String.prototype.trim = function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;return this.replace(/^[\s\t ]+|[\s\t ]+$/mg, &#39;&#39;);<br />&nbsp;}</div><br />从以上三种改法结合文中开头的NFA资料，我们可以大概的知道trim性能出现问题的原因<ul class="ubb-list" ><li>量词限定将优先匹配。</li><li>量词限定在结尾可能会使JS的正则引擎不停的回朔，出现递归的一个陷阱，这个递归的深度太深。如果字符串更大一点应该会出现栈溢出了。</li><li>多行既然能够匹配，而且性能消耗不大。性能上没有任何问题，从一个写这个正则程序的人角度上去看，多行明显比单行要替换的空串多得多。所以第二点的结论应该是对的</li></ul><b>改良</b><br />首先确定匹配字符串的开始正则是没有任何效率问题的。而匹配结束的时候会出现性能问题，那可以采用正则与传统相结合来改善这个trim性能问题。<br /><br />例如：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment6')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment6')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment6')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment6">&lt;script type=&quot;text/javascript&quot;&gt;//&lt;![CDATA[<br />&nbsp;&nbsp;String.prototype.trim = function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;var s = this.replace(/^[\s\t ]+/g, &#39;&#39;);<br />&nbsp;&nbsp;&nbsp;&nbsp;从s后端开始查找，并回循环到最后一个非空字符串，代码略。<br />&nbsp;&nbsp;}<br />//]]&gt;&lt;/script&gt;</div><br />see also:<a href="http://www.never-online.net/blog/?id=236" title="http://www.never-online.net/blog/?id=236" target="_blank">firefox 2 的正则表达式细节</a>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=259]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[构建通用UI控件的那点事]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=258]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sat, 22 Nov 2008 00:37:10 +0800</pubDate> 
      <description><![CDATA[今天想把以前想写的文章写的前端UI控件的问题写完，也许还有点语句不太顺畅，能看懂就行了，呵呵，毕竟是半夜写的东西，难免有点糊涂。<br /><br />在应用当中如何构建一个比较灵活的UI控件是一个比较让人头痛的问题。<br /><br />本文将自己的一些经验和思路拿出来和大家讨论一下，在这里并不想用设计模式的理论上去套，如果硬套上去感觉有点象是为了理论而理论了。但基本出发点是一样的。<br />为了少写和易于维护代码，所以我们尽量在前期做好设计。<br /><br />首先，先概括一下我们做程序时应该遵循的大概原则。<ul class="ubb-list" ><li>无强依赖</li><li>事件模型</li><li>易扩展性</li><li>接口统一</li><li>无硬偏码</li><li>单一职责</li><li>易用性</li><li>简单灵活</li></ul>无依赖性<br />比如你有一个很好的库，例如YUI之类的基础框架。如果你把UI控件很多的代码都依赖于这个框架，假设这个框架升级了大版本，你的代码将很有可能重构一次。或者再设想一个情况，如果你的控件依赖了好几个文件。我们在一个页面只需要用到一个UI控件，那么我们也不得不把所依赖的文件都链进来。这无疑增加了http请求。这时你可能会说，可以合并几个所依赖的文件。但是你是不是违被了你的初衷呢？——管理起来又复杂了。<br />在这里我不是说毫不依赖于框架。而是有所为有所不为。比如，如果你只在框架里用到判断是否浏览器是否为IE，何苦依赖于一个大的框架呢？一句!!window.ActiveXObject不就行了吗？<br />无依赖这点如何做是一个项目里评估并决策的过程，因此是否依赖根据实据情况而定。如果在这一点上我能为各位提一个醒，对一些朋友有所帮助就足矣。<br /><br />事件模型<br />假设我们把一个框架/UI控件看成一个金字塔型，或者看作一个树结构。<br />如果你是喜欢一句代码就把一个UI控件生成，且控件帮你做所有的事的话，那么只能说这个UI控件是整个框架或者继承树的叶子（最末端）。通常这样做的后果是欠缺灵活，哪天需求变了，你的UI控件就必须得重写。我们现在的编程都是事件驱动的，因此，在很多情况下，灵活的事件机制可以达到象人的关节一样，练散打也可以，打太极也行。如何做就看你怎么用了。<br />关于这一点，我们可以向操作系统来学习。比如：DragDrop的设计，可以看做是实现一个事件模型；它完全可以说是一套事件驱动编程的典范。关于这一点以前也写过一篇文章。<br />详细的设计及JS伪代码可以参看一下我的这篇文章——<a href="http://www.never-online.net/blog/?id=220" title="http://www.never-online.net/blog/?id=220" target="_blank">设计简单可重用的拖动(DragDrop)库.</a>。<br /><br />易扩展性<br />易扩展是指至少在UI控件分层的时候应该有一个程序员可操作的层，这也是YUI的示例里还会有这么多的代码的原因。<br /><br />接口统一<br />事实上我想我们应该把它和数据抽象联系起来。先言归正传吧，为什么我们要有一个统一的接口供使用者调用呢？<br />假设一个Tip组件，一个Dialog组件，你会怎么定义什么名字给使用该控件的人调用？<br />是这样？<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">var tip = new Tip(...);<br />var dlg = new Dialog(...);<br /><br />tip.showTip();<br />dlg.showDialog();</div><br />这个思路是没有错的。而且使用该控件的人应该也没有什么怨言的了。但仔细考虑一下我们的设计：<br />首先我们都可以把他们归属于container类，（都可以说他们都是一个容器的扩展，且不说是is a container还是has a container的关系）<br />因此，我们可以把一个container定义一组统一的接口。例如显示，隐藏，设置坐标等接口，也可以包括设置left,top,width,height等等属性，他们应该是一样的公用接口。以上的代码因为没有在设计上把公用的接口抽象出来，虽然我们不完全面向对象，但至少接口也可算作是公用的约定。因此上面的代码个人觉得可以适当修改为：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment2')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment2')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment2')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment2">var tip = new Tip(...);<br />var dlg = new Dialog(...);<br />tip.show();<br />dlg.show();</div><br />无硬编码<br />硬编码是一个让人头疼的问题。举个例子：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment3')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment3')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment3')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment3">var img = document.getElementsByClassName(&#39;img-k&#39;);<br />for (var i=0, l=img.length; i&lt;l; i++) <br />...</div>上面代码里这个&#39;img-k&#39;是什么类名对于维护这份代码的人完全不可知，他为了知道这代码的作用，得切换到HTML，找到HTML里img-k的结构，再分析JS获取该className元素集合的作用是什么。<br />假如改成以下这样：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment4')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment4')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment4')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment4">var dragDropClassName = &#39;img-k&#39;;<br />var img = document.getElementsByClassName(dragDropClassName);<br />for (var i=0, l=img.length; i&lt;l; i++) <br />...</div>是不是会清晰多了。<br /><br />单一职责<br />比如一个控件Dialog里面，你就不应该把控制坐标的代码在控件里面写，应当委托给一个坐标控制器。<br />一个基础的tabview里面就不应该写死结构。<br />如果坐标由Dialog来管，那么你UI控件里会有越来越多这样的代码。<br />如果tabview这样的标准结构：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment5')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment5')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment5')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment5">&lt;div id=&quot;tabview&quot;&gt;<br />&nbsp;&nbsp;&lt;ul&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;tab1&lt;/li&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;tab2&lt;/li&gt;<br />&nbsp;&nbsp;&lt;ul&gt;<br />&nbsp;&nbsp;&lt;div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&gt;content1&lt;/div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&gt;content2&lt;/div&gt;<br />&nbsp;&nbsp;&lt;/div&gt;<br />&lt;/div&gt;</div>代码结构很明显，是一个tab节点对应一个内容节点。在你的代码里是可以应付的。<br />假设一个tabview是纵向的tab排列。亦或者结构有变，我要改变HTML结构。你就比较麻烦了。这里又出现另一个问题，如何应付HTML结构与脚本代码的高耦合呢？<br />请参看这篇文章——<a href="http://www.never-online.net/blog/article.asp?id=256" title="http://www.never-online.net/blog/article.asp?id=256" target="_blank">降低HTML结构与脚本之间的强耦合</a> ，这里就暂不过多描述了。<br />把话说回来。tabview在我看来只是一个管理器，控制tabview的tab节点的事件触发我们定义好的事件模型。他不负责组织tabview的结构。<br />UI控件应该分层，但不要超过三层。每层都有他们的职责。让他们该干嘛干嘛，不要一个控件把所有的好事做完。<br /><br />易用性，简单灵活：<br />这似乎和单一职责相矛盾。如果说要简单灵活，又要易用性好。就有必要在UI框架的叶端为其做一个能够足够满足大多数人的一个应用。<br />一个框架拆分得多了，学习成本似乎要提高。因为使用者必须了解更多的类型用来拼装成想要的一个应用。积木要搭好，还要看你这个积木的结构是怎么样的。<br />可以说，学习一个框架与学习一门新语言一样让人心烦。它使我们在学习成本，易用性，单一职责上面要做一个权衡。<br />需求永远都是我们的指路明灯。我个人觉得在这点上做得好不好，可以从代码架构上看出一个人的整体水平。<br />简单灵活的使用可以体现在我们的代码的传参，如果是一个UI控件，我会建议如果有标准循标准，否则建议传json，而不是传统的参数类型。一是为了以后你能很好的扩展你控件的参数个数。二是给使用者不必死记硬背参数的顺序。<br /><br />YUI之所以受程序员的青睐，是因为他可以让我们不考虑兼容，提供了基础框架，<br />JQuery之所以精彩是因为他为我们的开发带来了具大的便利，也就是我们所说的易用性。<br /><br />任何一个框架都是一个迭代和完善的一个过程，重构不可避免，没有完全无bug的程序，设计本就是一个自由体。<br /><br />本文纯属自己的漫谈，如有不对，请各位及时指出。<br /><br />see also:<br /><a href="http://www.never-online.net/blog/article.asp?id=199" title="http://www.never-online.net/blog/article.asp?id=199" target="_blank">剖析Prototype 1.6框架(一) 设计 </a><br /><a href="http://www.never-online.net/blog/article.asp?id=200" title="http://www.never-online.net/blog/article.asp?id=200" target="_blank">剖析Prototype 1.6框架(二) 实现 </a>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=258]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[降低HTML结构与脚本之间的强耦合]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=256]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sat, 22 Nov 2008 00:21:24 +0800</pubDate> 
      <description><![CDATA[文章有点短，多余的例子和前言就略去了，N久前要写的一点点东西。<br /><br />UI控件在<b>通常情况下</b>不仅仅无侵入，更要灵活，作为编写UI控件的你，写出的控件要给整个team/company用，我建议写出的UI控件不仅要用面象程序员的接口，也需要有面向应用者的接口。要怎么样才能降低HTML结构与脚本之间的强耦合呢？<br /><br />首先定位问题的关键：控件与结构的耦合无非是要选择哪个元素的问题。<br /><br />回想我们用的xml和xsl是怎么在UI层联系起来的。没错，是<b>xpath</b>。那么，我们的UI控件一样有xpath一样的工具，那就是selector。<br /><br />可以说selector是UI控件和HTML结构的一个bridge。有了它，不仅程序员可以用，会CSS的人都会用你的控件了，有效降低学习成本。也提高了控件的灵活性。<br /><br />但同时要保证没有selector你的控件照样能让给调用者使用，无非多几行代码。可保证心尽量降低依赖的问题。<br /><br />例子我就不举了，相信写过通用控件/框架的人都知道HTML结构与脚本之间的那点事——设计架构是代码之源。<br /><br />see also:<a href="http://www.never-online.net/blog/article.asp?id=258" title="http://www.never-online.net/blog/article.asp?id=258" target="_blank">构建通用UI控件的几点事</a>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=256]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[flash/flex/air的一个大问题~]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=255]]></link> 
      <category><![CDATA[Flash & Flex & Air]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Mon, 17 Nov 2008 23:14:22 +0800</pubDate> 
      <description><![CDATA[<b>对HTML标签的支持得不够好。</b><br />现在普遍的做法是浮一个iframe。例如：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&nbsp;&lt;mx:Panel width=&quot;100%&quot; height=&quot;100%&quot; title=&quot;Content&quot; paddingTop=&quot;1&quot; paddingBottom=&quot;1&quot; paddingLeft=&quot;1&quot; paddingRight=&quot;1&quot; &gt;<br />&nbsp;&lt;IFrame id=&quot;iframe&quot; source=&quot;http&#58;//www.never-online.net&quot; width=&quot;100%&quot; height=&quot;100%&quot;  /&gt;<br />&nbsp;&lt;mx:ControlBar&gt;<br />&nbsp;&lt;mx:CheckBox id=&quot;cbVisible&quot; label=&quot;iframe Visible&quot; selected=&quot;true&quot; click=&quot;iframe.visible=cbVisible.selected&quot;/&gt;<br />&nbsp;&lt;/mx:ControlBar&gt;<br />&nbsp;&lt;/mx:Panel&gt;</div><br />或者在text里用htmltext写入html的字符串，但是都不理想。<br /><br />不知道adobe有没有想过改善这一点，如果这一点不能改善很多应用都是没有办法做~亦或者，自己去解析你所需要的HTML标签了~ <img src="http://www.never-online.net/blog/styles/g/images/smilies/icon_cry.gif" border="0" alt="[cry]" /> <br /><br />如果有朋友知道更好的办法，望告知，谢谢~~ <img src="http://www.never-online.net/blog/styles/g/images/smilies/icon_smile.gif" border="0" alt="[smile]" />]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=255]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[一流的框架做“标准”]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=254]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sat, 15 Nov 2008 02:31:57 +0800</pubDate> 
      <description><![CDATA[偶然想到的一句话。以前常说一流的企业做标准，二流企业做技术，三流企业做产品。<br />单从技术上来说。标题所指的“标准”不一定是w3c。<br />从另一个层面上来说，能让绝大多数人易用就是标准，技术上来说不管你写的代码多烂，多难以让理解，据说firefox的C++代码是写得很烂的。<br />说回前端吧，prototype是$，jquery是chaining&amp;selector，extjs的UI界面如此漂亮。yui现在也要跟主流用chaining了。虽然yui的代码在这三者之间我觉得是层次是较好的，base2的框架是最符合w3c的。<br />但是现在的无侵入正越来越流行，selector的作用如此之大，template引擎是否能让人接受等等问题。<br />如果你的框架要让人接受，必须要站在以后的角度上去看易用性，做好了，你的框架自然就是主流。]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=254]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[去天坛的照片]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=257]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sat, 15 Nov 2008 00:25:13 +0800</pubDate> 
      <description><![CDATA[<div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3007/3031075909_4161800a4d.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3007/3031075909_4161800a4d.jpg?v=0" alt="http://farm4.static.flickr.com/3007/3031075909_4161800a4d.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3180/3031082303_5975c58c2a.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3180/3031082303_5975c58c2a.jpg?v=0" alt="http://farm4.static.flickr.com/3180/3031082303_5975c58c2a.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3009/3031937386_15467f97be.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3009/3031937386_15467f97be.jpg?v=0" alt="http://farm4.static.flickr.com/3009/3031937386_15467f97be.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3284/3031111691_7282bc470a.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3284/3031111691_7282bc470a.jpg?v=0" alt="http://farm4.static.flickr.com/3284/3031111691_7282bc470a.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3294/3031117329_578b70b96f.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3294/3031117329_578b70b96f.jpg?v=0" alt="http://farm4.static.flickr.com/3294/3031117329_578b70b96f.jpg?v=0" class="imgBorder"/></a></div>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=257]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[CSS &quot;Collapsing margins&quot;]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=253]]></link> 
      <category><![CDATA[CSS]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Tue, 11 Nov 2008 00:13:13 +0800</pubDate> 
      <description><![CDATA[以下例子请用Firefox, Opera, Safari来看才能看出真正的效果。<br />应该比较少人遇到这类的问题，但是遇到后你如果不明白的话就很郁闷了。以下的例子是用margin-bottom却会有margin-top，不信？你看看就明白了。<br /><br /><s>Floats, absolutely positioned elements, inline-blocks, table-cells, table-captions, and elements with &#39;overflow&#39; other than &#39;visible&#39; (except when that value has been propagated to the viewport) establish new block formatting contexts.<br />浮动，绝对定位以及一些特殊的标签会触发新的块格式上下文(block formatting contexts)。</s><br /><br /><b>If the top and bottom margins of a box are adjoining, then it is possible for margins to collapse through it. In this case, the position of the element depends on its relationship with the other elements whose margins are being collapsed. </b><br /><br />the bellow css code is the Collapsing margins example:<br />看下面的例子<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; <br />&quot;http&#58;//www.w3.org/TR/html4/strict.dtd&quot;&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&lt;title&gt;Rank&#39;s HTML document&lt;/title&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-cache&quot;&gt;  <br />&nbsp;&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot;&gt;     <br />&nbsp;&lt;meta http-equiv=&quot;Expires&quot; content=&quot;0&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;ImageToolbar&quot; content=&quot;no&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Creator.name&quot; content=&quot;Rank, BlueDestiny, never-online&quot;&gt;<br />&nbsp;&lt;style type=&quot;text/css&quot; title=&quot;default&quot; media=&quot;screen&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;body { margin:0 auto; font:13px/1.4 arial; }<br />&nbsp;&nbsp;&nbsp;&nbsp;.context { float:left; }<br />&nbsp;&nbsp;&nbsp;&nbsp;#hd { margin-bottom: 100px;}<br />&nbsp;&lt;/style&gt;<br />&nbsp;&lt;/head&gt;<br />&nbsp;&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;hd&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;context&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧，父容器明明是margin-bottom:100px....是不是觉得象margin:100px auto 100px auto?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />&nbsp;&lt;/body&gt;<br />&lt;/html&gt;</div><br /><span style="color:Red">use height, border, padding can fixed the issues.  the bellow is the example.<br />可以利用height, border以及padding。</span><br /><div class="code-op"><a href="javascript:NS_code.copy('codeFragment2')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment2')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment2')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment2">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; <br />&quot;http&#58;//www.w3.org/TR/html4/strict.dtd&quot;&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&lt;title&gt;Rank&#39;s HTML document&lt;/title&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-cache&quot;&gt;  <br />&nbsp;&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot;&gt;     <br />&nbsp;&lt;meta http-equiv=&quot;Expires&quot; content=&quot;0&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;ImageToolbar&quot; content=&quot;no&quot;&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Creator.name&quot; content=&quot;Rank, BlueDestiny, never-online&quot;&gt;<br />&nbsp;&lt;style type=&quot;text/css&quot; title=&quot;default&quot; media=&quot;screen&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;body { margin:0 auto; font:13px/1.4 arial; }<br />&nbsp;&nbsp;&nbsp;&nbsp;.context { float:left; }<br />&nbsp;&nbsp;&nbsp;&nbsp;#hd { margin-bottom: 100px;padding:1px;/*height:1px;*/ /*border:1px solid #000;*/}<br />&nbsp;&lt;/style&gt;<br />&nbsp;&lt;/head&gt;<br />&nbsp;&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;hd&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;context&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />&nbsp;&lt;/body&gt;<br />&lt;/html&gt;</div><br />from w3c information<div class="quote"><div class="quote-title">引用 <u></u></div><div class="quote-content">8.3.1 Collapsing margins<br />In this specification, the expression collapsing margins means that adjoining margins (no non-empty content, padding or border areas or clearance separate them) of two or more boxes (which may be next to one another or nested) combine to form a single margin. <br /><br />In CSS 2.1, horizontal margins never collapse. <br /><br />Vertical margins may collapse between certain boxes:<br /><br />Two or more adjoining vertical margins of block boxes in the normal flow collapse. The resulting margin width is the maximum of the adjoining margin widths. In the case of negative margins, the maximum of the absolute values of the negative adjoining margins is deducted from the maximum of the positive adjoining margins. If there are no positive margins, the absolute maximum of the negative adjoining margins is deducted from zero. Note. Adjoining boxes may be generated by elements that are not related as siblings or ancestors. <br />Vertical margins between a floated box and any other box do not collapse (not even between a float and its in-flow children). <br />Vertical margins of elements with &#39;overflow&#39; other than &#39;visible&#39; do not collapse with their in-flow children. <br />Margins of absolutely positioned boxes do not collapse (not even with their in-flow children). <br />Margins of inline-block elements do not collapse (not even with their in-flow children). <br />If the top and bottom margins of a box are adjoining, then it is possible for margins to collapse through it. In this case, the position of the element depends on its relationship with the other elements whose margins are being collapsed. <br />If the element&#39;s margins are collapsed with its parent&#39;s top margin, the top border edge of the box is defined to be the same as the parent&#39;s. <br />Otherwise, either the element&#39;s parent is not taking part in the margin collapsing, or only the parent&#39;s bottom margin is involved. The position of the element&#39;s top border edge is the same as it would have been if the element had a non-zero top border.<br />An element that has had clearance applied to it never collapses its top margin with its parent block&#39;s bottom margin.<br /><br />Note that the positions of elements that have been collapsed through have no effect on the positions of the other elements with whose margins they are being collapsed; the top border edge position is only required for laying out descendants of these elements.<br /><br />Margins of the root element&#39;s box do not collapse. <br />The bottom margin of an in-flow block-level element is always adjoining to the top margin of its next in-flow block-level sibling, unless that sibling has clearance.<br /><br />The top margin of an in-flow block-level element is adjoining to its first in-flow block-level child&#39;s top margin if the element has no top border, no top padding, and the child has no clearance.<br /><br />The bottom margin of an in-flow block-level element with a &#39;height&#39; of &#39;auto&#39; and &#39;min-height&#39; less than the element&#39;s used height and &#39;max-height&#39; greater than the element&#39;s used height is adjoining to its last in-flow block-level child&#39;s bottom margin if the element has no bottom padding or border. <br /><br />An element&#39;s own margins are adjoining if the &#39;min-height&#39; property is zero, and it has neither top or bottom borders nor top or bottom padding, and it has a &#39;height&#39; of either 0 or &#39;auto&#39;, and it does not contain a line box, and all of its in-flow children&#39;s margins (if any) are adjoining.<br /><br />When an element&#39;s own margins collapse, and that element has had clearance applied to it, its top margin collapses with the adjoining margins of subsequent siblings but that resulting margin does not collapse with the bottom margin of the parent block.<br /><br />Collapsing is based on the used value of &#39;padding&#39;, &#39;margin&#39;, and &#39;border&#39; (i.e., after resolving any percentages). The collapsed margin is calculated over the used value of the various margins.<br /><br />Please consult the examples of margin, padding, and borders for an illustration of collapsed margins. </div></div><div class="quote"><div class="quote-title">引用 <u></u></div><div class="quote-content">For others who experience this (as a) problem, but want to play freely<br />with margins of _some size_ on paragraphs and other elements:<br /><br />The &#39;protruding margins&#39; / &#39;collapsing margins&#39; (same thing) are better<br />sorted out by applying a &#39;margin-top: 1px;&#39; on body. A negative<br />margin-top the same size, will cover up any unwanted offset created by<br />such a small padding if _that_ becomes a problem.<br /><br />IE/win doesn&#39;t show the mentioned &quot;gap&quot;, because body is given &#39;Layout<br />by default&#39;[1] in that browser. That&#39;s the buggy part of &#39;Layout&#39;. IE<br />may show such &quot;gaps&quot; on other elements that doesn&#39;t have / isn&#39;t given<br />&#39;Layout&#39;.<br /><br />This non-standard &#39;engine-inherent rendering concept&#39; effect in IE<br />points back to the fact that &#39;collapsing margins&#39;[2] are contained in<br />the outer container - in this case body - _if_ the outer container is<br />styled to establish a &#39;block formatting contexts&#39;[3] (which is the<br />closest thing to &#39;Layout&#39; in standard CSS). Studying those two<br />parts of the CSS specs, should make it perfectly clear what&#39;s happening<br />and what can be done about it.<br /><br />Applying such a &#39;block formatting contexts&#39; style on body isn&#39;t always<br />working too well in all browsers, but applying it on the next main<br />container inside body - usually a wrapper-div in most layouts - will<br />have the same effect.</div></div>see also:<br /><a href="http://archivist.incutio.com/viewlist/css-discuss/72146" title="http://archivist.incutio.com/viewlist/css-discuss/72146" target="_blank">http://archivist.incutio.com/viewlist/css-discuss/72146</a>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=253]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[试机，香山游]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=252]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sun, 09 Nov 2008 22:50:51 +0800</pubDate> 
      <description><![CDATA[得到一个教训，以后背相机一定要带相机包，还有就是如果还有机会去香山，尽可能的坐索道上去.......<br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3210/3015929406_72f0fa9b81.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3210/3015929406_72f0fa9b81.jpg?v=0" alt="http://farm4.static.flickr.com/3210/3015929406_72f0fa9b81.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3296/3015954554_47d32bc65b.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3296/3015954554_47d32bc65b.jpg?v=0" alt="http://farm4.static.flickr.com/3296/3015954554_47d32bc65b.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3007/3015954548_67e46e6153.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3007/3015954548_67e46e6153.jpg?v=0" alt="http://farm4.static.flickr.com/3007/3015954548_67e46e6153.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3032/3015954558_e2ba3409fe.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3032/3015954558_e2ba3409fe.jpg?v=0" alt="http://farm4.static.flickr.com/3032/3015954558_e2ba3409fe.jpg?v=0" class="imgBorder"/></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://farm4.static.flickr.com/3163/3015954560_be4a241b06.jpg?v=0" target="_blank" rel="lightbox"><img src="http://farm4.static.flickr.com/3163/3015954560_be4a241b06.jpg?v=0" alt="http://farm4.static.flickr.com/3163/3015954560_be4a241b06.jpg?v=0" class="imgBorder"/></a></div>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=252]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[买相机了]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=251]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sat, 08 Nov 2008 20:54:54 +0800</pubDate> 
      <description><![CDATA[比较了很多相机，比如尼康的d80,d90,d200，还有佳能的450d<br />感觉d80由于停产所以价格又上来了。d90由于是新品且多了高清录象功能，目前价格虚高。d200好是好，机器也是停产了，价格一直没有大降。<br />450d和40d价格差不多，但450d硬性参数比40d差一个档次，比较了几天终于决定...<br />买部canon 40d<br /><div style="width: 100%;overflow-x : auto;"><a href="http://img2.zol.com.cn/product/13/400/ce9oSDrMIVPbo.jpg" target="_blank" rel="lightbox"><img src="http://img2.zol.com.cn/product/13/400/ce9oSDrMIVPbo.jpg" alt="http://img2.zol.com.cn/product/13/400/ce9oSDrMIVPbo.jpg" class="imgBorder"/></a></div><br />再加了个18-200的头<br /><div style="width: 100%;overflow-x : auto;"><a href="http://img2.zol.com.cn/product/22/586/ceGAvRzkRi5I.jpg" target="_blank" rel="lightbox"><img src="http://img2.zol.com.cn/product/22/586/ceGAvRzkRi5I.jpg" alt="http://img2.zol.com.cn/product/22/586/ceGAvRzkRi5I.jpg" class="imgBorder"/></a></div><br />收入所得，一机辄尽...<br /><br />买了相机好处是可以促使我出去多走走，用照片记录生活。真正是用自己的眼睛看世界了<br />不足就是...花钱太多... <img src="http://www.never-online.net/blog/styles/g/images/smilies/icon_cry.gif" border="0" alt="[cry]" />]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=251]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[opera的一点是是非非]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=250]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Fri, 07 Nov 2008 22:20:27 +0800</pubDate> 
      <description><![CDATA[最近两天都在玩opera，说点自己用的感受。<br /><br /><b>cache &amp; session</b><br />我的blog是lbs，以前看过代码，是用了application在内存里做cache来降低数据库的读取数次。<br />其它的浏览器里(IE,6,7,8, safari, firefox 1.5-3.0)都没有问题，但在opera下面（现在用9.62）就会发现有些让我很不爽的地方。<br />输入用户名，密码登录，登录成功后点击blog首页会发现左侧的sidebar仍然是未登录状态。<br />我估计是与opera的cache, Session机制有关。因为<ul class="ubb-list" ><li>一进blog后lbs就会分配一个Session给用户。</li><li>登录后仍然可能用这个Session，只是用户等级不一样。而opera会认为这个Session是进blog的Session，所以并没有给出最新的状态。</li></ul>除非用户重新reload，在opera的重新载入实际上是和ctrl+f5的效果一样。<br />opera的cache机制本身也是有问题的。因此opera只能鉴定为浏览类的browser，低版本比高版本好用，mini版又比低版本好用。<br /><br /><b>多线程标签页</b><br />发现opera的标签页是多线程的。在一个标签假死的时候其它的标签照常可以使用。<br /><br /><b>还是标签页</b><br />个人觉得用dragdrop拖放标签页在opera里一直感觉都没有firefox人性化...不知道是不是我没有用习惯。<br /><br /><b>地址栏的细节</b><br />估计这个很少人会去注意。在标签式browser做地址栏的时候通常有两种类似的做法/思路<ul class="ubb-list" ><li>只用一个textbox，这有个缺点：假设用户开了两个标签页，点击第一个标签页之后想在地址栏运行一个脚本。然后切换到第二个标签后，再切换到第一个标签，你在地址栏敲入的脚本就还原成原URL了。且多线程的标签页里也应该不好同步。</li><li>每个标签用一个textbox。就可以弥补上一点的不足，但同时又有另一个问题，有点浪费。</li></ul>不知道有人用过theworld浏览器没有，theworld就属于第一种情况。<br />马桶也属于第一种情况。顺便在这里再点一个马桶的问题。马桶开启多线程输入法和多线程标签之后就会有假设我在第一个标签里的地址栏输中文在中文输入法状态下直接切换到第二个标签，那么所有的标签都会是中文了。safari也是第一种情况。<br />其它的浏览器firefox, opera都做得比IE内核的地址栏好，属第二种。但我想不通的是opera在网页正在载入时居然把地址栏给隐藏显示载入的速度...在点停止或者页面载入完毕后才出现地址栏。不知道这个功能对于用户来说有什么用。 <img src="http://www.never-online.net/blog/styles/g/images/smilies/icon_rolleyes.gif" border="0" alt="[rolleyes]" /> <br />我个人觉得第二种要比第一种要稍好些。<br />补充：要关闭在地址栏里显示进度要在“外观”-》“工具栏”-》进度栏。选择关闭在地址栏显示进度<br /><br /><b>widget</b><br />在opera的widget并没有什么亮点，我下载的几个widget基本都是flash做的。且widget都是小玩意，比如说钟表天气之类的。没有多大的价值。象鸡肋的感觉。<br /><br /><b>笔记</b><br />这本倒是蛮有用，而且与页面集成，随时可以存到笔记里。<br /><br /><b>debug</b><br />dragonfly肯定没有firebug好用。工作效率不高。]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=250]]></wfw:commentRss>
    </item>
      
  </channel>
</rss>
