<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7879640828921632974</id><updated>2024-08-28T02:33:37.232-07:00</updated><category term="web"/><title type='text'>信笔涂鸦</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yaboyang.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7879640828921632974/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://yaboyang.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>yabo</name><uri>http://www.blogger.com/profile/08079877690187115540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7879640828921632974.post-5823968832347074071</id><published>2009-02-24T22:33:00.000-08:00</published><updated>2009-02-24T23:14:28.335-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>爱词霸的假计数器</title><content type='html'>&lt;p&gt;今天要查一个英文短句，Google了一下就到了爱词霸，短句很快就查到了。额外的事情事看见爱词霸上面有“登录”、“注册”的按钮。接下来的事情，没什么原因好叙述的。注了册，然后激活，一不小心看见页面上有个数字在跳，数字左边写的是“最新日志”。数字跳得很快，第一反应：不会是假的吧。看了十秒钟，发现数字跳得太均匀了，估计假的真不了了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;一般说来我不是喜欢寻根究底的人，无奈有firebug的情况下有些事情太简单了。先抓出这几个数字的id，然后再页面源代码中搜索了一下，就有了下面这段代码：&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$(function() {&lt;br /&gt;  $(&#39;#tbNews&#39;).jdNewsScroll({divWidth:166,divHeight:40,fontSize:&#39;10.5pt&#39;});&lt;br /&gt;  var min = 214595-Math.floor(Math.random()*10);var max = 214615;&lt;br /&gt;  if(min&lt;0)min=0;&gt;=max)min = max;&lt;br /&gt;      if(min&gt;=max)return false;&lt;br /&gt;      min++;&lt;br /&gt;      $(&#39;#cknum&#39;).html(min);&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;于是乎，鉴定完毕。代码写得很好读，还小心避免了涨个不停。变量min初始化用的数字估计是真实的，max的就无法揣测了。只是我还是无法理解，造这种假有什么附加好处呢？难道说，我们习惯了人性本恶，在小事情上总是倾向于“不行善”？&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yaboyang.blogspot.com/feeds/5823968832347074071/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7879640828921632974/5823968832347074071' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7879640828921632974/posts/default/5823968832347074071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7879640828921632974/posts/default/5823968832347074071'/><link rel='alternate' type='text/html' href='http://yaboyang.blogspot.com/2009/02/blog-post.html' title='爱词霸的假计数器'/><author><name>yabo</name><uri>http://www.blogger.com/profile/08079877690187115540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7879640828921632974.post-2988495986972701201</id><published>2009-01-18T19:54:00.000-08:00</published><updated>2009-04-29T09:00:10.753-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>关于全选框</title><content type='html'>&lt;p&gt;最近的项目里很多地方用了全选框。用一个checkbox来控制一组checkbox（后面就用group指代吧）的全选和全不选。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;老实说，我并不喜欢全选框的设计。Checkbox是选择用的，其语义就在于选与不选。全选框干了些什么？选中时则选择group所有，未选中时则group全不选。也就是说，全选框的状态对应group中所有checkbox的状态。那么，如果要做得够好的话，group中的checkbox状态变化时，全选框的状态也应该同步变化。但这就有一个地方暧昧了——group中checkbox只有部分选中时，全选框该是什么状态？&lt;/p&gt;&lt;br /&gt;&lt;p&gt;对很多人来说，这个问题不是问题，规定一下就可以了——group部分选中时，全选框选中或不选中都可以，只要在同一个项目/库中一致就可以了。这样看来，这个问题就规避掉了。不过新的问题会接着产生，例如：若group中成员可以增加减少，那么新增成员的状态，全选框的状态如何“规定”。这儿的问题就很多了，为了让一切能够行得通，势必增加大量的细节定义。否则，就会产生太多的不明确行为。而大量的细节定义，又会让实现者容易产生混乱。就算最后能够正确的“完美”实现，也实在是“杀鸡用牛刀”的典范。而且，过多不直观的定义，基本可以认定，下一次的使用又会发生变化，也就是说，没有重用的价值。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;那么问题的根源在哪儿呢？难道这个问题真有这么高的复杂度？&lt;/p&gt;&lt;br /&gt;&lt;p&gt;显然不是。我们要的是全选、全不选。而实际上，checkbox不适合做这个工作。由于checkbox自身带有（带状态的）语义，为了配合这些语义，问题变复杂了。我们只是需要选择，并不需要选择触发器本身的状态。只要换一个没有状态的选择触发器就可以了，例如，一个按钮，一个标签。这样的好处很明显，你可以给一个按钮/标签任何语义，例如全选和全不选，如果你高兴多点快捷操作，还可以指定选中某种状态。而且由于触发器没有状态，就没有跟踪选择对象状态的必要。这儿倒不是说跟踪状态本身不好，只不过大多数情况下，实际上没有这个需求。而一旦选择checkbox，语义上默认就需要跟踪状态。而用无状态的触发器的实例是有的，例如GMail。（我大概只能举这个例子了，因为没有搜集过这方面的资料，而且，毕竟，我不是做UI的。）&lt;/p&gt;&lt;br /&gt;&lt;p&gt;或许，有这样一篇文章，极大原因在于自己对于别人的全选框的实现很不爽。下面附上最近看了jQuery后的全选框的实现。项目中的比这复杂，因为没用任何框架。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/*&lt;br /&gt;* This function is to implement a checkbox group controled by a checkbox.&lt;br /&gt;* It doesn&#39;t change other behaviors in those elements.&lt;br /&gt;* This function is depended on jquery.&lt;br /&gt;* @param: allSelector {jquery selector} it is nothing special, though all-box should be one and possible an id.&lt;br /&gt;*    boxesSelector {jquery selector} expect it as a string, don&#39;t try other selectors.&lt;br /&gt;*        It should be like &quot;input[type=checkbox][name=boxg1]&quot;.&lt;br /&gt;*        Now I doesn&#39;t plan to deal with more complex selector.&lt;br /&gt;*    mode {Boolean} if it&#39;s true, all-box will be checked when any in the checkbox group is checked.&lt;br /&gt;*/&lt;br /&gt;function CheckboxGroup(allSelector, boxesSelector, mode) {&lt;br /&gt;   $(allSelector).bind(&#39;click&#39;,function(e){&lt;br /&gt;       $(boxesSelector).attr(&quot;checked&quot;,$(allSelector).attr(&quot;checked&quot;));&lt;br /&gt;   });&lt;br /&gt;   $(boxesSelector).bind(&#39;click&#39;,function(e){&lt;br /&gt;       var num = $(boxesSelector).length;&lt;br /&gt;       var cnt = $(boxesSelector+&quot;[checked=true]&quot;).length;&lt;br /&gt;       /*&lt;br /&gt;       * The all-box will be checked when all checkboxes in group are checked(cnt == num),&lt;br /&gt;       * or some checkboxes are checked if mode is true(mode &amp;amp;&amp;amp; cnt &gt; 0).&lt;br /&gt;       */&lt;br /&gt;       $(allSelector).attr(&quot;checked&quot;,((cnt == num) || (mode &amp;amp;&amp;amp; cnt &gt; 0)));&lt;br /&gt;   });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://yaboyang.blogspot.com/feeds/2988495986972701201/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7879640828921632974/2988495986972701201' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7879640828921632974/posts/default/2988495986972701201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7879640828921632974/posts/default/2988495986972701201'/><link rel='alternate' type='text/html' href='http://yaboyang.blogspot.com/2009/01/blog-post.html' title='关于全选框'/><author><name>yabo</name><uri>http://www.blogger.com/profile/08079877690187115540</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>