<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_JKisJK</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/81095/rss</id><updated>2012-06-01T09:10:37Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/81095/rss"/><entry><id>http://www.cnblogs.com/jkisjk/archive/2012/06/01/2531004.html</id><title type="text">备忘：递归callee.caller导致死循环</title><summary type="text">今天网友 Baobao包子 反映QWrap里的QW.EventH.getEvent有可能会产生死循环。代码如下： /** * 获得event对象 * @method getEvent * @param {event} event (Optional)event对象 默认为调用位置所在宿主的event * @param {element} element (Optional)任意element对象 element对象所在宿主的event * @return ...</summary><published>2012-06-01T08:38:00Z</published><updated>2012-06-01T08:38:00Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jkisjk/archive/2012/06/01/2531004.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/archive/2012/06/01/2531004.html"/><content type="html">&lt;p&gt;今天网友 &lt;a href="http://www.wangzhaohui.com/"&gt;Baobao包子&lt;/a&gt; 反映QWrap里的QW.EventH.getEvent有可能会产生死循环。&lt;br /&gt;代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;* &lt;br/&gt;         * 获得event对象&lt;br/&gt;         * @method    getEvent&lt;br/&gt;         * @param    {event}        event    (Optional)event对象 默认为调用位置所在宿主的event&lt;br/&gt;         * @param    {element}    element (Optional)任意element对象 element对象所在宿主的event&lt;br/&gt;         * @return    {event}        event对象&lt;br/&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        getEvent: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(event, element) {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (event) {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; event;&lt;br/&gt;            } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (element) {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (element.document) {&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; element.document.parentWindow.event; }&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (element.parentWindow) {&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; element.parentWindow.event; }&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (window.event) {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; window.event;&lt;br/&gt;            } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; f =&lt;span style="color: #000000;"&gt; arguments.callee;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;do&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (/Event/.test(f.arguments[0])) {&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; f.arguments[0&lt;span style="color: #000000;"&gt;]; }&lt;br/&gt;                } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (f =&lt;span style="color: #000000;"&gt; f.caller);&lt;br/&gt;            }&lt;br/&gt;        },&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;网友 &lt;a title="集鹄" href="http://weibo.com/zswang"&gt;集鹄 &lt;/a&gt;也曾在2011-12-07以一个例子来说过这个死循环的问题：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; getEvent_Count = 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; getEvent(e) {&lt;br/&gt;    e &lt;/span&gt;= e ||&lt;span style="color: #000000;"&gt; window.event;&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #000000;"&gt;e) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; c =&lt;span style="color: #000000;"&gt; arguments.callee.caller;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (c) {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (getEvent_Count++ &amp;gt; 1000&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;                alert(&lt;/span&gt;'死循环了！'&lt;span style="color: #000000;"&gt;);&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            e &lt;/span&gt;= c.arguments[0&lt;span style="color: #000000;"&gt;];&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (e &amp;amp;&amp;amp; &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt; (e.altKey) == "boolean") { &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; duck typing&lt;/span&gt;&lt;br/&gt;                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            c &lt;/span&gt;=&lt;span style="color: #000000;"&gt; c.caller;&lt;br/&gt;            e &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; e;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; test(n) {&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; n ? test(n - 1&lt;span style="color: #000000;"&gt;) : getEvent();&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;test(&lt;/span&gt;2);&lt;/div&gt;&lt;p&gt;&lt;br /&gt;造成死循环的原因：&lt;span style="color: #ff0000;"&gt;caller链中有时会有闭环。&lt;/span&gt;例如：一个function的caller有可能等于本身。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;另：QW.EventH.getEvent 方法并不直接对业务编码的同学开放，目前还没有人踩坑，暂无必要更改实现方法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jkisjk/aggbug/2531004.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jkisjk/archive/2012/06/01/2531004.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jkisjk/archive/2012/04/23/javascript_shuffle.html</id><title type="text">随机问题之--洗牌算法</title><summary type="text">洗牌算法是我们常见的随机问题，在玩游戏、随机排序时经常会碰到。它可以抽象成这样：得到一个M以内的所有自然数的随机顺序数组。在百度搜“洗牌算法”，第一个结果是《百度文库-洗牌算法》：http://wenku.baidu.com/view/c4fea82658fb770bf78a55b7.html扫了一下里面的内容，很多内容都容易误导别人走上歧途，包括最后用链表代替数组，也只是一个有限的优化（链表也引入了读取效率的损失）。该文里的第一种方法，可以简单描述成：随机抽牌，放在另一组；再次抽取，抽到空牌则重复抽。“抽到空牌则重复抽”这会导致后面抽到空牌的机会越来越大，显然是不合理的。可以优化一步成：牌抽</summary><published>2012-04-23T13:23:00Z</published><updated>2012-04-23T13:23:00Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jkisjk/archive/2012/04/23/javascript_shuffle.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/archive/2012/04/23/javascript_shuffle.html"/><content type="html">&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;洗牌算法&lt;/strong&gt;&lt;/span&gt;是我们常见的随机问题，在玩游戏、随机排序时经常会碰到。它可以抽象成这样：得到一个M以内的所有自然数的随机顺序数组。&lt;br /&gt;在百度搜&amp;ldquo;洗牌算法&amp;rdquo;，第一个结果是《百度文库-洗牌算法》：&lt;a href="http://wenku.baidu.com/view/c4fea82658fb770bf78a55b7.html" target="_blank"&gt;http://wenku.baidu.com/view/c4fea82658fb770bf78a55b7.html&lt;/a&gt;&lt;br /&gt;扫了一下里面的内容，很多内容都容易误导别人走上歧途，包括最后用链表代替数组，也只是一个有限的优化（链表也引入了读取效率的损失）。&lt;br /&gt;&lt;br /&gt;该文里的第一种方法，可以简单描述成：随机抽牌，放在另一组；再次抽取，抽到空牌则重复抽。&lt;br /&gt;&amp;ldquo;抽到空牌则重复抽&amp;rdquo;这会导致后面抽到空牌的机会越来越大，显然是不合理的。&lt;br /&gt;可以优化一步成：牌抽走后，原牌变少。（而不是留下空牌）&lt;br /&gt;代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; shuffle_pick_1(m) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;洗牌 //抽牌法&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;生成m张牌&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; arr = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Array(m);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=0; i&amp;lt;m; i++&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;        arr[i] &lt;/span&gt;=&lt;span style="color: #000000;"&gt; i;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;每次抽出一张牌，放在另一堆。因为要在数组里抽出元素，把后面的所有元素向前拉一位，所以很耗时。&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; arr2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Array();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=m; i&amp;gt;0; i--&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; rnd = Math.floor(Math.random()*&lt;span style="color: #000000;"&gt;i);&lt;br/&gt;        arr2.push(arr[rnd]);&lt;br/&gt;        arr.splice(rnd,&lt;/span&gt;1&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; arr2;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;这个也明显有问题，因为数组如果很大的话，删除中间的某个元素，会导致后面的排队向前走一步，这是一个很耗时的动作。&lt;br /&gt;回想一下&amp;ldquo;我们为什么要删除那个元素？&amp;rdquo;目的就是为了不产生空牌。&lt;br /&gt;除了删除那个元素之外，我们是不是还有其它方式来去除空牌？&lt;br /&gt;----有的，我们把最后一张未抽的牌放在那个抽走的位置上就可以了。&lt;br /&gt;所以，这个思路我们可以优化成这样：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; shuffle_pick(m) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;洗牌 //抽牌法优化牌&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;生成m张牌&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; arr = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Array(m);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=0; i&amp;lt;m; i++&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;        arr[i] &lt;/span&gt;=&lt;span style="color: #000000;"&gt; i;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;每次抽出一张牌，放在另一堆。把最后一张未抽的牌放在空位子上。&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; arr2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Array();&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=m; i&amp;gt;0&lt;span style="color: #000000;"&gt;;) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; rnd = Math.floor(Math.random()*&lt;span style="color: #000000;"&gt;i);&lt;br/&gt;        arr2.push(arr[rnd]);&lt;br/&gt;        arr[rnd] &lt;/span&gt;= arr[--&lt;span style="color: #000000;"&gt;i];&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; arr2;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;除了抽牌思路，我们还可以用换牌思路。&lt;br /&gt;《百度文库-洗牌算法》提到一种换牌思路：&amp;ldquo;随机交换两个位置，共交换n次，n越大，越接近随机&amp;rdquo;。&lt;br /&gt;这个做法是不对的，就算n很大（例如10张牌，进行10次调换），也还存在很大可能&amp;ldquo;有的牌根本没换位置&amp;rdquo;。&lt;br /&gt;顺着这个思路，做一点小调整就可以了：第i张与任意一张牌换位子，换完一轮即可。&lt;br /&gt;代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; shuffle_swap(m) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;洗牌 //换牌法&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;生成m张牌&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; arr = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Array(m);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=0; i&amp;lt;m; i++&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;        arr[i] &lt;/span&gt;=&lt;span style="color: #000000;"&gt; i;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;第i张与任意一张牌换位子，换完一轮即可&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=0; i&amp;lt;m; i++&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; rnd = Math.floor(Math.random()*(i+1&lt;span style="color: #000000;"&gt;)),&lt;br/&gt;            temp &lt;/span&gt;=&lt;span style="color: #000000;"&gt; arr[rnd];&lt;br/&gt;        arr[rnd] &lt;/span&gt;=&lt;span style="color: #000000;"&gt; arr[i];&lt;br/&gt;        arr[i]&lt;/span&gt;=&lt;span style="color: #000000;"&gt;temp;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; arr;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;除了抽牌与换牌的思路，我们还可以用插牌的思路：先有一张牌，第二张牌有两个位置可随机插入（第一张牌前，或后），第三张牌有三个位置可随机插入（放在后面，或插在第一位，或插在第二位），依此类推&lt;br /&gt;代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; shuffle_insert_1(m) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;洗牌 //插牌法&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;每次生成一张最大的牌，插在随机的某张牌前。因为要在数组里插入元素，把后面的所有元素向后挤一位，所以很耗时。&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; arr = [0&lt;span style="color: #000000;"&gt;];&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=1; i&amp;lt;m; i++&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;        arr.splice(Math.floor(Math.random()&lt;/span&gt;*(i+1)),0&lt;span style="color: #000000;"&gt;,i);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; arr;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;以上的代码也会有一些问题：就是随着牌数的增多，插牌变得越来越困难，因为插牌会导致后面的很多牌都往后推一步。&lt;br /&gt;当然，我们也可以适当的优化一下：先有n-1张牌，第n张牌放在最后，然后与任意一张牌互换位置。&lt;br /&gt;代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; shuffle_insert(m) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;洗牌 //插牌法优化版，可以用数学归纳法证明，这种洗牌是均匀的。&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;每次生成一张最大的牌，与随机的某张牌换位子&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; arr = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Array(m);&lt;br/&gt;    arr[&lt;/span&gt;0] = 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=1; i&amp;lt;m; i++&lt;span style="color: #000000;"&gt;) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; rnd = Math.floor(Math.random()*(i+1&lt;span style="color: #000000;"&gt;));&lt;br/&gt;        arr[i] &lt;/span&gt;=&lt;span style="color: #000000;"&gt; arr[rnd];&lt;br/&gt;        arr[rnd] &lt;/span&gt;=&lt;span style="color: #000000;"&gt; i;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; arr;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;好的，全部的代码如下，有兴趣的同学可以在自己的机器上试下，看下他们各自的执行效率、以及最后的结果是否是理论随机。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('36f49a30-eb90-410b-9244-64f1ef16245d')"&gt;&lt;div id="cnblogs_code_open_36f49a30-eb90-410b-9244-64f1ef16245d" class="cnblogs_code_hide"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;meta &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Content-Type"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/html; charset=gb2312"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;JK：javascript 洗牌算法 &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; shuffle_pick_1(m) &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;洗牌 //抽牌法&lt;/span&gt;&lt;br/&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;生成m张牌&lt;/span&gt;&lt;br/&gt;    &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Array(m);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; (&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;m; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;++&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;) {&lt;br/&gt;        arr[i] &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;每次抽出一张牌，放在另一堆。因为要在数组里抽出元素，把后面的所有元素向前拉一位，所以很耗时。&lt;/span&gt;&lt;br/&gt;    &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr2 &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Array();&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; (&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;m; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;--&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; rnd &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Math.floor(Math.random()&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;i);&lt;br/&gt;        arr2.push(arr[rnd]);&lt;br/&gt;        arr.splice(rnd,&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;1&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr2;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; shuffle_pick(m) &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;洗牌 //抽牌法优化牌&lt;/span&gt;&lt;br/&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;生成m张牌&lt;/span&gt;&lt;br/&gt;    &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Array(m);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; (&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;m; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;++&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;) {&lt;br/&gt;        arr[i] &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;每次抽出一张牌，放在另一堆。把最后一张未抽的牌放在空位子上。&lt;/span&gt;&lt;br/&gt;    &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr2 &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Array();&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; (&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;m; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; rnd &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Math.floor(Math.random()&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;i);&lt;br/&gt;        arr2.push(arr[rnd]);&lt;br/&gt;        arr[rnd] &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr[&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;--&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;i];&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr2;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; shuffle_swap(m) &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;洗牌 //换牌法&lt;/span&gt;&lt;br/&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;生成m张牌&lt;/span&gt;&lt;br/&gt;    &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Array(m);&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; (&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;m; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;++&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;) {&lt;br/&gt;        arr[i] &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;第i张与任意一张牌换位子，换完一轮即可&lt;/span&gt;&lt;br/&gt;    &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; (&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;m; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;++&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; rnd &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Math.floor(Math.random()&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;+&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;1&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;)),&lt;br/&gt;            temp &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr[rnd];&lt;br/&gt;        arr[rnd] &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr[i];&lt;br/&gt;        arr[i]&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;temp;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; shuffle_insert_1(m) &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;洗牌 //插牌法&lt;/span&gt;&lt;br/&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;每次生成一张最大的牌，插在随机的某张牌前。因为要在数组里插入元素，把后面的所有元素向后挤一位，所以很耗时。&lt;/span&gt;&lt;br/&gt;    &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; [&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;];&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; (&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;1&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;m; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;++&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;) {&lt;br/&gt;        arr.splice(Math.floor(Math.random()&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;+&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;1&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;)),&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,i);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; shuffle_insert(m) &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;洗牌 //插牌法优化版，可以用数学归纳法证明，这种洗牌是均匀的。&lt;/span&gt;&lt;br/&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;每次生成一张最大的牌，与随机的某张牌换位子&lt;/span&gt;&lt;br/&gt;    &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Array(m);&lt;br/&gt;    arr[&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;] &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; (&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;1&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;m; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;++&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;) {&lt;br/&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; rnd &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Math.floor(Math.random()&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;*&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;+&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;1&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;));&lt;br/&gt;        arr[i] &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr[rnd];&lt;br/&gt;        arr[rnd] &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i;&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; arr;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;alert(shuffle_pick(10))&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; funcs &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; [shuffle_pick_1, shuffle_pick, shuffle_swap, shuffle_insert_1, shuffle_insert],&lt;br/&gt;    funcNames &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; [&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;抽牌&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;, &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;抽牌优化&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;, &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;换牌&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;, &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;插牌&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;, &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;插牌优化&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;]&lt;br/&gt;    m &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #000000;"&gt;10000&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,&lt;br/&gt;    times&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;[];&lt;br/&gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; i &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; funcs.length; i&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;++&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;){&lt;br/&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; d0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Date();&lt;br/&gt;    funcs[i](m);&lt;br/&gt;    funcNames[i] &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; (&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; Date() &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;-&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; d0) &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;+&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;\t&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt; &lt;span style="background-color: #f5f5f5; color: #000000;"&gt;+&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; funcNames[i];&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;alert(funcNames.join(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;\n&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;));&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jkisjk/aggbug/2467092.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jkisjk/archive/2012/04/23/javascript_shuffle.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jkisjk/archive/2012/04/08/the_order_of_onclick_and_listeners.html</id><title type="text">onclick与listeners的执行先后问题</title><summary type="text">以下代码，会先执行onclick，然后再执行事件监控：&lt;HTML&gt;&lt;HEAD&gt; &lt;TITLE&gt;JK Test&lt;/TITLE&gt; &lt;META content="text/html; charset=utf-8" http-equiv=Content-Type&gt; &lt;script src="http://s0.qhimg.com/lib/qwrap/110.js" type="text/javascript"&gt;&lt;/script&gt; &lt;style&gt; d</summary><published>2012-04-08T06:19:00Z</published><updated>2012-04-08T06:19:00Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jkisjk/archive/2012/04/08/the_order_of_onclick_and_listeners.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/archive/2012/04/08/the_order_of_onclick_and_listeners.html"/><content type="html">&lt;p&gt;以下代码，会先执行onclick，然后再执行事件监控：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;HTML&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;HEAD&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TITLE&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;JK Test&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;TITLE&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;META &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/html; charset=utf-8"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; http-equiv&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=Content-Type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://s0.qhimg.com/lib/qwrap/110.js"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;    div&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;border&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;1px solid balck&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;padding&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;5px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;margin&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;2px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;}&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;HEAD&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="div1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; onclick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="alert(1);"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;div1 原生的fireEvent，是先运行onclick，再运行listeners&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; fun&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(e){&lt;br /&gt;        alert(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;hello&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);    &lt;br /&gt;    };&lt;br /&gt;    W(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;#div1&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;).addEventListener(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;click&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,fun).fire(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;click&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;); &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;QW里调用的是原生方法&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;HTML&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;JQuery的执行顺序恰恰相反：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;HTML&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;HEAD&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TITLE&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;JK Test&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;TITLE&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;META &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/html; charset=utf-8"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; http-equiv&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=Content-Type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://s0.qhimg.com/lib/jquery/172.js"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;    div&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;border&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;1px solid balck&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;padding&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;5px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;margin&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;2px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;}&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;HEAD&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="div2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; onclick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="alert(2);"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;div2 JQuery，先运行listeners，再运行onclick&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; fun&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(e){&lt;br /&gt;        alert(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;hello&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);    &lt;br /&gt;    };&lt;br /&gt;    $(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;#div2&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;).bind(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;click&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,fun).trigger(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;click&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;HTML&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;扫了一下jq的trigger的实现，也没弄明白颠倒的目的是什么。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jkisjk/aggbug/2437606.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jkisjk/archive/2012/04/08/the_order_of_onclick_and_listeners.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jkisjk/archive/2011/12/31/textarea_and_lazyRender.html</id><title type="text">Textarea与懒惰渲染</title><summary type="text">2008年有啊第一次性能优化时，我们曾用textarea来存贮需要懒惰渲染的节点。代码如下。&lt;div&gt;立即渲染内容&lt;ul&gt; &lt;li&gt;张三&lt;img src="p01.jpg"/&gt;&lt;/li&gt; &lt;li&gt;张四&lt;img src="p02.jpg"/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;textarea id="lazyRender01" style="display:none"&amp;g</summary><published>2011-12-31T13:12:00Z</published><updated>2011-12-31T13:12:00Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jkisjk/archive/2011/12/31/textarea_and_lazyRender.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/archive/2011/12/31/textarea_and_lazyRender.html"/><content type="html">&lt;p&gt;2008年有啊第一次性能优化时，我们曾用textarea来存贮需要懒惰渲染的节点。代码如下。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;立即渲染内容&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;张三&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="p01.jpg"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;张四&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="p02.jpg"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;textarea &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="lazyRender01"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="display:none"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;懒惰渲染内容&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;李三&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="p11.jpg"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;李四&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="p12.jpg"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;textarea&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;setTimeout(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(){&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;懒惰渲染&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; el &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;document.getElementById(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;lazyRender01&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br /&gt;  el.parentNode.innerHTML &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; el.value;&lt;br /&gt;},&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;1000&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;代码的好处是：让李三李四对应的内容，在懒惰渲染之前，不形成dom节点，不请求图片。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;但有的同学会问：&amp;ldquo;Textarea里的内容，对搜索引擎不友好。&amp;rdquo;&lt;br /&gt;没问题，这个也很好解决的：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;立即渲染内容&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;张三&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="p01.jpg"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;张四&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="p02.jpg"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;document.write(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;textarea id="lazyRender01" style="display:none"&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;懒惰渲染内容&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;李三&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="p11.jpg"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;李四&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;img &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="p12.jpg"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;textarea&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;setTimeout(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(){&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;//&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;懒惰渲染&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; el &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;document.getElementById(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;lazyRender01&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br /&gt;  el.parentNode.innerHTML &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt; el.value;&lt;br /&gt;},&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;1000&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码的区别很简单，只是把'&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;textarea id="lazyRender01"&amp;gt;&lt;/span&gt;'这一段通过js的document.write输出来。&lt;/p&gt;&lt;p&gt;但结果却有了很大的不同：&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;就算浏览器不支持js，一切内容也还是能原样显示出来&lt;/strong&gt;&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jkisjk/aggbug/2309116.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jkisjk/archive/2011/12/31/textarea_and_lazyRender.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jkisjk/archive/2011/11/27/qwrap_selector_w3c.html</id><title type="text">QWrap Selector之W3C版</title><summary type="text">之前也曾经有过一系列《QWrap Selector解密》 文章，讲到过QWrap里的dom/selector.js里的大多数要点。今天又整了一个完全依赖浏览器的querySelectorAll的slector版本：selector_w3c.js。与之前的selector.js的接口名称相同。我们自己写一个selector.js，这样我们就有弥补标准的不足的自由。例如，就算最新的浏览器，也依然没有人严格实现matchesSelector。而我们的selector.js里早就有了filter与test方法来实现matchesSelector的功能。从另一个角度看，我们有时需要为某些特定场景定制一些</summary><published>2011-11-27T11:06:00Z</published><updated>2011-11-27T11:06:00Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jkisjk/archive/2011/11/27/qwrap_selector_w3c.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/archive/2011/11/27/qwrap_selector_w3c.html"/><content type="html">&lt;p&gt;之前也曾经有过一系列《&lt;a href="http://www.cnblogs.com/jkisjk/tag/qw.selector/" target="_blank"&gt;QWrap Selector解密&lt;/a&gt;》 文章，讲到过QWrap里的dom/selector.js里的大多数要点。今天又整了一个完全依赖浏览器的querySelectorAll的slector版本：&lt;a href="https://github.com/wedteam/qwrap/blob/master/resource/js/dom/selector_w3c.js" target="_blank"&gt;selector_w3c.js&lt;/a&gt;。与之前的&lt;a href="https://github.com/wedteam/qwrap/blob/master/resource/js/dom/selector.js" target="_blank"&gt;selector.js&lt;/a&gt;的接口名称相同。&lt;br /&gt;&lt;br /&gt;我们自己写一个selector.js，这样我们就有弥补标准的不足的自由。例如，就算最新的浏览器，也依然没有人严格实现matchesSelector。而我们的selector.js里早就有了filter与test方法来实现matchesSelector的功能。&lt;br /&gt;从另一个角度看，我们有时需要为某些特定场景定制一些代码，以些来节约网络流量。selector_w3c.js就是假设浏览器已支持querySelectorAll方法。典型的例子就是：基于移动终端做的web js开发。&lt;br /&gt;selector_w3c.js与selector.js对外提供的所有方法名称都一样，只是有w3c版里对参数的要求与对应的处理，更依赖于浏览器。&lt;br /&gt;例如：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;差别1：原来的selector.js中的Selector.query(document.body,'body div')不会反回结果。因为它为了易用性的考虑，把后面的selector字符串默认加上了&amp;ldquo;:scope &amp;rdquo;，相当于selector_w3c.js里的Selector.query(document.body,':scope body div')，尽管现在Chrome也没有实现:scope伪类。这种差别在这篇《&lt;a href="http://www.cnblogs.com/jkisjk/archive/2011/05/21/qwrap_selector_knowit.html" target="_blank"&gt;认识selector写法&lt;/a&gt;》&amp;nbsp; 的文章中也讲过，是一个&lt;span style="color: #ff0000;"&gt;严谨性&lt;/span&gt;与&lt;span style="color: #ff0000;"&gt;易用性&lt;/span&gt;冲突的典型例子。&lt;/li&gt;&lt;li&gt;差别2：seletor_w3c.js里的test方法里的selector参数现在也支持各种关系符了。例如，可以这样写：Selector.test(document.body,'html body')。同时它也产生了一个副作用，即：如果被测试的元素没有父元素（例如新建的、还未插入到dom树里去的节点），则测试结果为假。&lt;/li&gt;&lt;li&gt;差别3：seletor_w3c.js里的filter(els, sSelector, pEl)在未传pEl时，会忽略游离在dom树之外的节点。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;很可惜，因为chrome也没有实现matchesSelector，所以test、filter两个方法我只能去山寨的去实现一下，所以有了上面的差别2与差别3里的瑕玼。----&lt;span style="color: #ff0000;"&gt;这说明，&amp;ldquo;标准&amp;rdquo;总走跑不赢我们的期望，现实的浏览器又跑不赢标准&lt;/span&gt;。----管他呢，反正那&amp;ldquo;标准&amp;rdquo;是&amp;ldquo;草案&amp;rdquo;还是&amp;ldquo;建议&amp;rdquo;还是其他的什么，都不是我能左右的。&lt;br /&gt;&lt;br /&gt;代码具体代码在这里： &lt;a href="https://github.com/wedteam/qwrap/blob/master/resource/js/dom/selector_w3c.js" target="_blank"&gt;https://github.com/wedteam/qwrap/blob/master/resource/js/dom/selector_w3c.js&lt;/a&gt;&lt;br /&gt;其实很简单，如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    Copyright (c) Baidu Youa Wed QWrap&lt;br /&gt;    version: $version$ $release$ released&lt;br /&gt;    author: JK&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt; * @class Selector Css Selector相关的几个方法&lt;br /&gt; * @singleton&lt;br /&gt; * @namespace QW&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;() {&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; Selector = {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;* &lt;br /&gt;         * 把一个selector字符串转化成一个过滤函数.&lt;br /&gt;         * @method selector2Filter&lt;br /&gt;         * @static&lt;br /&gt;         * @param {string} sSelector 过滤selector&lt;br /&gt;         * @returns {function} : 返回过滤函数。&lt;br /&gt;         * @example: &lt;br /&gt;         var fun=selector2Filter("input.aaa");alert(fun);&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        selector2Filter: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(sSelector) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; s2f(sSelector);&lt;br /&gt;        },&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;* &lt;br /&gt;         * 判断一个元素是否符合某selector.&lt;br /&gt;         * @method test &lt;br /&gt;         * @static&lt;br /&gt;         * @param {HTMLElement} el: 被考察参数&lt;br /&gt;         * @param {string} sSelector: 过滤selector&lt;br /&gt;         * @returns {function} : 返回过滤函数。&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        test: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(el, sSelector) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; s2f(sSelector)(el);&lt;br /&gt;        },&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;* &lt;br /&gt;         * 用一个css selector来过滤一个数组.&lt;br /&gt;         * @method filter &lt;br /&gt;         * @static&lt;br /&gt;         * @param {Array|Collection} els: 元素数组&lt;br /&gt;         * @param {string} sSelector: 过滤selector。&lt;br /&gt;         * @param {Element} pEl: 父节点。默认是document&lt;br /&gt;         * @returns {Array} : 返回满足过滤条件的元素组成的数组。&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        filter: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(els, sSelector, pEl) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; allEls = (pEl || document).querySelectorAll(sSelector);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Array.filter(els, &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(el){&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Array.indexOf(allEls,el) &amp;gt; -1;&lt;br /&gt;            });&lt;br /&gt;        },&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;* &lt;br /&gt;         * 以refEl为参考，得到符合过滤条件的HTML Elements. refEl可以是element或者是document&lt;br /&gt;         * @method query&lt;br /&gt;         * @static&lt;br /&gt;         * @param {HTMLElement} refEl: 参考对象&lt;br /&gt;         * @param {string} sSelector: 过滤selector,&lt;br /&gt;         * @returns {array} : 返回elements数组。&lt;br /&gt;         * @example: &lt;br /&gt;         var els=query(document,"li input.aaa");&lt;br /&gt;         for(var i=0;i&amp;lt;els.length;i++ )els[i].style.backgroundColor='red';&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        query: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(refEl, sSelector) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; toArray((refEl || document).querySelectorAll(sSelector));&lt;br /&gt;        },&lt;br /&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;* &lt;br /&gt;         * 以refEl为参考，得到符合过滤条件的一个元素. refEl可以是element或者是document&lt;br /&gt;         * @method one&lt;br /&gt;         * @static&lt;br /&gt;         * @param {HTMLElement} refEl: 参考对象&lt;br /&gt;         * @param {string} sSelector: 过滤selector,&lt;br /&gt;         * @returns {HTMLElement} : 返回element，如果获取不到，则反回null。&lt;br /&gt;         * @example: &lt;br /&gt;         var els=query(document,"li input.aaa");&lt;br /&gt;         for(var i=0;i&amp;lt;els.length;i++ )els[i].style.backgroundColor='red';&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        one: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(refEl, sSelector) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (refEl || document).querySelector(sSelector);&lt;br /&gt;        }&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;     * s2f(sSelector): 由一个selector得到一个过滤函数filter&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; filterCache = {};&lt;br /&gt;    filterCache[''] = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;    };&lt;br /&gt;    filterCache['*'] = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(el){&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; !!el.tagName;&lt;br /&gt;    };&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; s2f(sSelector) {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!filterCache[sSelector]) {&lt;br /&gt;            filterCache[sSelector] = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (el) {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; el.parentNode &amp;amp;&amp;amp; Array.indexOf(el.parentNode.querySelectorAll(sSelector), el) &amp;gt; -1;&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; filterCache[sSelector];&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; toArray(arr){&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i=arr.length-1, ret = []; i&amp;gt;-1; i--) {&lt;br /&gt;            ret[i] = arr[i];&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; ret;&lt;br /&gt;    }&lt;br /&gt;    QW.Selector = Selector;&lt;br /&gt;}());&lt;/div&gt;&lt;p&gt;&lt;br /&gt;另：由于QWrap有灵活的apps机制，所以我们可以订制一个apps/qwrap_webkit.js的应用，用selector_w3c.js来取代selector.js。而其他地方的代码不用任何改变。&lt;/p&gt;&lt;p&gt;附：&lt;br /&gt;QWrap博客网址：&lt;a href="http://www.qwrap.com" target="_blank"&gt;http://www.qwrap.com&lt;/a&gt;&lt;br /&gt;Selector速度比赛：&lt;a href="http://dev.qwrap.com/resource/js/_tools/speedmatch/_examples/SelectorSpeed.html" target="_blank"&gt;http://dev.qwrap.com/resource/js/_tools/speedmatch/_examples/SelectorSpeed.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jkisjk/aggbug/2265205.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jkisjk/archive/2011/11/27/qwrap_selector_w3c.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jkisjk/archive/2011/11/25/QWrap_EventH_getEvent.html</id><title type="text">原来window.event快达到全浏览器支持了</title><summary type="text">在Tangram群里讨论到&lt;a href="#" onclick="baidu.event.preventDefault(event);"&gt;的写法时，以为标准浏览器只能用arguments[0]来获取到event，结果nodiseal同学说已经可以这么用了，于是做了以下测试。。。看下以下代码在各浏览器下的结果：&lt;body onclick="alert([window.event,event,this.event]);"&gt;test&lt;/body&gt;IE8: object,object,undefinedF</summary><published>2011-11-25T06:25:00Z</published><updated>2011-11-25T06:25:00Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jkisjk/archive/2011/11/25/QWrap_EventH_getEvent.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/archive/2011/11/25/QWrap_EventH_getEvent.html"/><content type="html">&lt;p&gt;在Tangram群里讨论到&amp;lt;a href="#" onclick="baidu.event.preventDefault(event);"&amp;gt;的写法时，以为标准浏览器只能用arguments[0]来获取到event，结果nodiseal同学说已经可以这么用了，于是做了以下测试。。。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;看下以下代码在各浏览器下的结果：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;body &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;onclick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="alert([window.event,event,this.event]);"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;test&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;IE8: object,object,undefined&lt;br /&gt;FF8.0: undefined,MouseEvent,undefined &amp;nbsp;&lt;br /&gt;Cr16: MouseEvent,MouseEvent,undefined&lt;br /&gt;Opera: MouseEvent,MouseEvent,undefined&lt;br /&gt;Safira: MouseEvent,MouseEvent,undefined&lt;/p&gt;&lt;p&gt;除FF8外，其它浏览器都已经支持window.event了&lt;/p&gt;&lt;p&gt;ff8似乎在调用事件时with了一个{event:new Event(...)}；所以在onclick里也可以直接用&amp;ldquo;event&amp;rdquo;来获取事件句柄。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;另：好奇同学在QWrap的Event里供了一个QW.EventH.getEvent的静态方法，用来在各种情况下获取当前的事件对象，代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;* &lt;br /&gt;         * 获得event对象&lt;br /&gt;         * @method    getEvent&lt;br /&gt;         * @param    {event}        event    (Optional)event对象 默认为调用位置所在宿主的event&lt;br /&gt;         * @param    {element}    element (Optional)任意element对象 element对象所在宿主的event&lt;br /&gt;         * @return    {event}        event对象&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        getEvent: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(event, element) {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (event) {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; event;&lt;br /&gt;            } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (element) {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (element.document) {&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; element.document.parentWindow.event; }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (element.parentWindow) {&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; element.parentWindow.event; }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (window.event) {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; window.event;&lt;br /&gt;            } &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; f = arguments.callee;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;do&lt;/span&gt; {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (/Event/.test(f.arguments[0])) {&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; f.arguments[0]; }&lt;br /&gt;                } &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt; (f = f.caller);&lt;br /&gt;            }&lt;br /&gt;        },&lt;/div&gt;&lt;p&gt;&lt;br /&gt;所以，使用QW的页面，可以直接这样写：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;a &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; onclick&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="EventH.preventDefault()"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;点我无效&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;即：调用preventDefault时，不必传入event实例。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jkisjk/aggbug/2263203.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jkisjk/archive/2011/11/25/QWrap_EventH_getEvent.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jkisjk/archive/2011/11/17/QWrap_Jss.html</id><title type="text">JSS----另一种节点与JS数据的关系模式</title><summary type="text">节点JS数据的用途一个简单的例子，我们的页面需要一个日期输入框，用html5可以简写为：&lt;input name="birthday" type="date"/&gt;但是，只有type="date"这一个设置，远远不能满足交互需求。看一下wagang的valid组件（http://dev.qwrap.com/resource/js/wagang/valid/_examples/Valid-BaseDemo.htm ）里，与日期输入框交互有关的信息还有哪些： minValue 最小日期 maxValue 最大日期 d_format</summary><published>2011-11-17T08:37:00Z</published><updated>2011-11-17T08:37:00Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jkisjk/archive/2011/11/17/QWrap_Jss.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/archive/2011/11/17/QWrap_Jss.html"/><content type="html">&lt;p&gt;&lt;span style="color: #ff0000; font-size: 16px;"&gt;&lt;strong&gt;节点JS数据的用途&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;一个简单的例子，我们的页面需要一个日期输入框，用html5可以简写为：&amp;lt;input name="birthday" type="date"/&amp;gt;&lt;br /&gt;但是，只有type="date"这一个设置，远远不能满足交互需求。&lt;br /&gt;看一下wagang的valid组件（http://dev.qwrap.com/resource/js/wagang/valid/_examples/Valid-BaseDemo.htm ）里，与日期输入框交互有关的信息还有哪些：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; minValue 最小日期&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; maxValue 最大日期&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; d_format 用户日期格式错误&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; d_upper 日期太晚时的提示&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; d_lower 日期太早时的提示 &lt;br /&gt;这些信息没有标准的dom属性与之对应，我们需要js来根据些信息来完成一些交互需求。&lt;br /&gt;同时，这些信息又跟某具体的元素相关。&lt;br /&gt;那么，如何将这些信息（数据）与元素对应起来呢？&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;节点JS数据的描述方式&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;我们看一下有哪些方式来实现这种关联。&lt;br /&gt;1. 自定义属性描述&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input  &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fromDate"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; dataType&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="d"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; minValue&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2011-11-12"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;2. JS偷加属性&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input  &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fromDate"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;g(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;fromDate&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;).dataType&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;d&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;; g(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;fromDate&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;).minValue:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;2011-11-12&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;3. JQuery的data方法&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fromDate"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;$(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;#fromDate&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;).data({dataType:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;d&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,minValue:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;2011-11-12&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;});&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;4. ECUI 格式（百度欧阳等同学开发，&lt;a href="http://tangram.baidu.com/other/ecui/" target="_blank"&gt;http://tangram.baidu.com/other/ecui/&lt;/a&gt;）&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input  &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fromDate"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; ecui&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="dataType:d;minValue:2011-11-12"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;5. JSS 格式&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input  &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fromDate"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; data-jss&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="dataType:'d',minValue:'2011-11-12'"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;6. 其它，批量定义节点JS数据的描述方式&amp;mdash;批量&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;//JQuery的data方法&lt;br /&gt;    $('input.d').data('dataType', 'd');&lt;br /&gt;    $('input.birthday').data('maxValue','2011-11-12');&lt;br /&gt;//QWrap的jss方法&lt;br /&gt;    W('input.d').jss('dataType', 'd');&lt;br /&gt;    W('input.birthday').jss('maxValue','2011-11-12');&lt;/div&gt;&lt;p&gt;7. 还有一种，节点JS数据的描述方式&amp;mdash;JSS规则&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;Jss.addRules({&lt;br /&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;.d&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;: {dataType:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;d&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;, minValue:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;2008-01-01&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;},&lt;br /&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;.n&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;: {dataType:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;n&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;, minValue:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;},&lt;br /&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;.email&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;: {dataType:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;email&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;},&lt;br /&gt;    &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;#fromDate&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;: {minValue:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;2011-11-12&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;}&lt;br /&gt;});&lt;br /&gt;Dom.ready(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;(){&lt;br /&gt;    alert(W(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;#fromDate&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;).jss(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;dataType&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;));&lt;br /&gt;});&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fromDate"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="d"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;规则的优点：&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;在元素产生之前，就可以定规则。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;在获取数据时，再去配合规则。&lt;/span&gt;&lt;br /&gt;回头看一下JSS的三种描述节点数据的方式: JSS规则、inline JSS、QW.NodeW所提供的jss方法&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;    Jss.addRules({&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;.d&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;: {dataType:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;d&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;, minValue:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;2008-01-01&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;},&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;.n&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;: {dataType:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;n&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;, minValue:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;0&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;},&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;.email&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;"&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;: {dataType:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;email&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;},&lt;br /&gt;        &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;#fromDate&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;: {minValue:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;2011-11-12&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;}&lt;br /&gt;    });&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fromDate"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="d"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; data-jss&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="errMsg:'日格输入有误'"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;W(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;#fromDate&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;).jss(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;d_lower&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;只能预订五日内的车票&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;这三种描述形成一个小的体系。这个体系与CSS很相似：CSS规则、inline Style、js里更改style。&lt;br /&gt;这也是JSS的得名由来：JSS是仿照CSS的一套"HTML元素"与"JS数据"之间的关联机制。&lt;br /&gt;即：&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;CSS是"HTML元素"与"style数据"之间的关联机制，&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;而JSS是"HTML元素"与"JS数据"之间的关联机制。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;感谢屈屈（&lt;a href="http://www.imququ.com/" target="_blank"&gt;http://www.imququ.com/&lt;/a&gt;）同学为这一种机制命名为&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;JSS&lt;/strong&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;JS的原生代码其实很简单：参见：&lt;a href="https://github.com/wedteam/qwrap/blob/master/resource/js/dom/jss.js"&gt;https://github.com/wedteam/qwrap/blob/master/resource/js/dom/jss.js&lt;/a&gt;&lt;br /&gt;重点方法：getJss&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;         * 获取元素的jss属性，优先度为：inlineJssAttribute &amp;gt; #id &amp;gt; @name &amp;gt; .className &amp;gt; tagName&lt;br /&gt;         * @method    getJss&lt;br /&gt;         * @param    {element}    el    元素&lt;br /&gt;         * @return    {any}    获取到的jss attribute&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;        getJss: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(el, attributeName) { &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;为提高性能，本方法代码有点长。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; data = getOwnJssData(el);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (data &amp;amp;&amp;amp; (attributeName &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; data)) {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; data[attributeName];&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; getRuleData = Jss.getRuleData,&lt;br /&gt;                id = el.id;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (id &amp;amp;&amp;amp; (data = getRuleData('#' + id)) &amp;amp;&amp;amp; (attributeName &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; data)) {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; data[attributeName];&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; name = el.name;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (name &amp;amp;&amp;amp; (data = getRuleData('@' + name)) &amp;amp;&amp;amp; (attributeName &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; data)) {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; data[attributeName];&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; className = el.className;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (className) {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; classNames = className.split(' ');&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; i = 0; i &amp;lt; classNames.length; i++) {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; ((data = getRuleData('.' + classNames[i])) &amp;amp;&amp;amp; (attributeName &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; data)) {&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; data[attributeName];&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; tagName = el.tagName;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (tagName &amp;amp;&amp;amp; (data = getRuleData(tagName)) &amp;amp;&amp;amp; (attributeName &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; data)) {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; data[attributeName];&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; undefined;&lt;br /&gt;        }&lt;/div&gt;&lt;p&gt;其中,平时会使用到的jss方法，是getJss与setJss方法的gsetter合体。&lt;br /&gt;参见：&lt;a href="http://dev.qwrap.com/resource/js/_docs/_youa/?content=http://dev.qwrap.com/resource/js/_docs/_youa/qw/nodew/w.jss_.htm"&gt;http://dev.qwrap.com/resource/js/_docs/_youa/?content=http://dev.qwrap.com/resource/js/_docs/_youa/qw/nodew/w.jss_.htm&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;JSS的一些应用场景：&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;1. Valid验证规则的前后端统一配置：前端验证，前端效果渲染（日期输入框后会加日期按钮）、后端验证，三者可以统一用一套规则：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;rules:&lt;br /&gt;    {&lt;br /&gt;   '@goDate':{&lt;br /&gt;        dataType:'d',&lt;br /&gt;        errMsg:'请检查您的出发日期',&lt;br /&gt;        reqMsg:'出发日期必填'&lt;br /&gt;    }&lt;br /&gt;       '@backDate':{&lt;br /&gt;        dataType:'d',&lt;br /&gt;        errMsg:'请检查您的返程日期',&lt;br /&gt;        reqMsg:'返程日期必填'&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;2. Css与Jss的配合：通过class，定义css展现，与jss代表的js交互&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;        Jss.addRule(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;.d&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;, {dataType:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;d&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,minValue:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;2008-01-01&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;});&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;        .d &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;{&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #ff0000;"&gt;width&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;:&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;100px&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;}&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #800000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    日期：&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="d"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;3. 新的组件初始化方式：组件调用三部曲：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="picslide_1"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;...&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;W(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;#picslide_1&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;).switchable({&lt;br /&gt;    tabSelector : &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;gt;.switch-nav&amp;gt;li&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,&lt;br /&gt;    viewSelector : &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;gt;.switch-content&amp;gt;li&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,&lt;br /&gt;    autoPlay: &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,&lt;br /&gt;    supportMouseenter: &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;,&lt;br /&gt;    mouseenterSwitchTime: &lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;300&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;});&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;可以简化成这样：&lt;span style="background-color: #ffffff; color: #000000;"&gt;（因为组件代码已为".picslide"作好了jss定制）&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="picslide_1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="picslide"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;...&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;W(&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;#picslide_1&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;).switchable();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;可以进一步简化成什么代码都没有了：（因为组件代码里已有Dom.ready(function(){W('div.switchable').switchable();});）&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="picslide_2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="switchable picslide"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;...&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;参见例子：&lt;a href="http://dev.qwrap.com/resource/js/wagang/switch/_examples/switch_retouched_demo.html" target="_blank"&gt;http://dev.qwrap.com/resource/js/wagang/switch/_examples/switch_retouched_demo.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;我自己很看好JSS在以后的应用，尤其是在组件的开发中，有了JSS，再也不必用类继承来实现参数特别化，并且还可以作参数特别化的按优先级自动揉合（因为selector有优先度）&lt;br /&gt;更多信息，可以查看这个ppt，这是11月12日webrebuild年会上作分享的ppt：&lt;/p&gt;&lt;p&gt;《QWrap中的JSS》&lt;/p&gt;&lt;p&gt;&lt;a href="http://dev.qwrap.com/resource/js/_docs/QWrap-Jss-20111106.ppt" target="_blank"&gt;http://dev.qwrap.com/resource/js/_docs/QWrap-Jss-20111106.ppt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jkisjk/aggbug/2252860.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jkisjk/archive/2011/11/17/QWrap_Jss.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jkisjk/archive/2011/11/11/html_unfit.html</id><title type="text">html结构错误小记</title><summary type="text">这段代码，IE下报错：&lt;html&gt;&lt;head&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"/&gt;&lt;title&gt;test&lt;/title&gt;&lt;/head&gt;&lt;body &gt;hello&lt;/body&gt;&lt;script&gt;document.body.innerHTML='&lt;p&gt;&lt;pre&gt;ddd&lt;br&gt;&lt;/pre&gt;&lt;/p&amp;</summary><published>2011-11-11T06:17:00Z</published><updated>2011-11-11T06:17:00Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jkisjk/archive/2011/11/11/html_unfit.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/archive/2011/11/11/html_unfit.html"/><content type="html">&lt;p&gt;这段代码，IE下报错：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;meta &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Content-Type"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/html; charset=gb2312"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;test&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;body &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;hello&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&lt;br /&gt;document.body.innerHTML&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;&amp;lt;p&amp;gt;&amp;lt;pre&amp;gt;ddd&amp;lt;br&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;'&lt;/span&gt;&lt;span style="background-color: #f5f5f5; color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;原因 （感谢网友貘给出解答）：&lt;/p&gt;&lt;div&gt;The&amp;nbsp;P&amp;nbsp;element&amp;nbsp;represents&amp;nbsp;a&amp;nbsp;paragraph.&amp;nbsp;It&amp;nbsp;cannot&amp;nbsp;contain&amp;nbsp;block-level&amp;nbsp;elements&amp;nbsp;(including&amp;nbsp;P&amp;nbsp;itself).&lt;br /&gt;http://www.w3.org/TR/html401/struct/text.html#edef-P &lt;/div&gt;&lt;p&gt;更多内空（感谢网友GrayZhang提供）：&lt;/p&gt;&lt;div&gt;这里有对应的各元素，点进去能看到元素的具体额外内容模型&lt;/div&gt;&lt;div&gt;http://dev.w3.org/html5/markup/elements.html&lt;br /&gt;这个是general的内容模型&lt;br /&gt;http://dev.w3.org/html5/markup/common-models.html&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jkisjk/aggbug/2245634.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jkisjk/archive/2011/11/11/html_unfit.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jkisjk/archive/2011/09/30/JS_YUICompressor_menutools.html</id><title type="text">右键集成JS文件压缩 YUI Compressor</title><summary type="text">几年前，国忠同学转发过一篇右键集成的YUI压缩的邮件，最近发现对不少同学还是有用，就把它成整成这一篇随笔吧。在网上看过也有一些类似的文章，不过大多是很长的代码，而本做法由于用到了filemenutools工具，代码相对来说少一些。内容如下：-----------------------------------------------------可以把YUICompressor集成到右键，可以通过压缩来自查代码。如以下。需要 :YUI Compressor : http://developer.yahoo.com/yui/compressor/filemenutools : http://www</summary><published>2011-09-30T05:02:00Z</published><updated>2011-09-30T05:02:00Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jkisjk/archive/2011/09/30/JS_YUICompressor_menutools.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/archive/2011/09/30/JS_YUICompressor_menutools.html"/><content type="html">&lt;div&gt;几年前，国忠同学转发过一篇右键集成的YUI压缩的邮件，最近发现对不少同学还是有用，就把它成整成这一篇随笔吧。&lt;/div&gt;&lt;div&gt;在网上看过也有一些类似的文章，不过大多是很长的代码，而本做法由于用到了filemenutools工具，代码相对来说少一些。&lt;/div&gt;&lt;div&gt;内容如下：&lt;/div&gt;&lt;div&gt;-----------------------------------------------------&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;可以把YUICompressor集成到右键，可以通过压缩来自查代码。如以下。&lt;/div&gt;&lt;p&gt;&lt;strong&gt;需要 :&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;YUI Compressor : &lt;a href="http://developer.yahoo.com/yui/compressor/"&gt;http://developer.yahoo.com/yui/compressor/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;filemenutools : &lt;a href="http://www.baidu.com/s?wd=filemenutools"&gt;http://www.baidu.com/s?wd=filemenutools&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step1 :&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;将&lt;a href="http://yuilibrary.com/downloads/#yuicompressor"&gt;http://yuilibrary.com/downloads/#yuicompressor&lt;/a&gt; 中的yuicompressor-2.4.6.zip 解压缩到d盘某处，如D:\JKTools&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step2:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在D:\JKTools 新建一个yuicom.bat 文件。内容如下：&lt;/p&gt;&lt;div style="border-width: 1px;"&gt;&lt;div&gt;java -jar D:\JKTools\yuicompressor-2.4.6\build\yuicompressor-2.4.6.jar %1 -v -o %1_com.%2&lt;br/&gt;&lt;br/&gt;pause&lt;br/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;安装 filemenutools&lt;/p&gt;&lt;p&gt;在filemenu tools 命令中添加一个 YUIcompressor 命令，属性如下&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/245184/2011101017085428.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;设置完成。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step4:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;右键点击要压缩的css 或js 文件，选择YUIcompressor，将在目录下生成*_com.*.*文件，如果文件有语法错误会提示。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;------&lt;/p&gt;&lt;p&gt;另，命cmd窗口里的压缩报告很值得细读。。。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jkisjk/aggbug/2196448.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jkisjk/archive/2011/09/30/JS_YUICompressor_menutools.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jkisjk/archive/2011/09/05/window_external.html</id><title type="text">关于window.external</title><summary type="text">由于工作中有很多时候需要用到window.external，以前一直稀里糊涂的，今天又被人问到，于是突击学习了一下，记下备忘。--------------------------------------我们在js中可以通过window.external.aaaa()来调用浏览器提供的外部方法aaaa。IE的已默认实现了一些外部方法，可以参见1:某中文文章：http://www.it118.org/Specials/2e876829-483a-4216-a6ef-08a472c94297/8f8d0507-b4c8-4d92-8e35-3c88dade3a17.htm2:官方文档里有更多： ht</summary><published>2011-09-05T07:43:00Z</published><updated>2011-09-05T07:43:00Z</updated><author><name>JKisJK</name><uri>http://www.cnblogs.com/jkisjk/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jkisjk/archive/2011/09/05/window_external.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jkisjk/archive/2011/09/05/window_external.html"/><content type="html">&lt;p&gt;由于工作中有很多时候需要用到window.external，以前一直稀里糊涂的，今天又被人问到，于是突击学习了一下，记下备忘。&lt;br /&gt;&lt;br /&gt;--------------------------------------&lt;br /&gt;我们在js中可以通过window.external.aaaa()来调用浏览器提供的外部方法aaaa。&lt;br /&gt;&lt;br /&gt;IE的已默认实现了一些外部方法，可以参见&lt;br /&gt;1:某中文文章：&lt;a href="http://www.it118.org/Specials/2e876829-483a-4216-a6ef-08a472c94297/8f8d0507-b4c8-4d92-8e35-3c88dade3a17.htm"&gt;http://www.it118.org/Specials/2e876829-483a-4216-a6ef-08a472c94297/8f8d0507-b4c8-4d92-8e35-3c88dade3a17.htm&lt;/a&gt;&lt;br /&gt;2:官方文档里有更多： &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects/external.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects/external.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在嵌入了浏览器的工程中，除了IE默认提供的外部方法之外，需要网页的脚本中能调用C++代码，要实现这种交互，就必须实现脚本扩展。实现脚本扩展就是在程序中实现一个IDispatch接口，通过CHtmlView类的OnGetExternal虚函数返回此接口指针,这样就可以在脚本中通过window.external.XXX(关键字window可以省略)来 引用接口暴露的方法或属性(XXX为方法或属性名)。&lt;br /&gt;参考《实现脚本扩展》&lt;a href="http://topic.csdn.net/u/20080116/17/5fbac468-1188-4c9c-9339-ad48edd8a4d3.html"&gt;http://topic.csdn.net/u/20080116/17/5fbac468-1188-4c9c-9339-ad48edd8a4d3.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Firefox与Chrome也提供了external对象，例如，他们都默认的实现了opensearch的两个外部方法：&lt;br /&gt;AddSearchProvider IsSearchProviderInstalled&lt;br /&gt;Chrome下，可以在控制台输入window.external看到。&lt;br /&gt;Firefox默认提供的外部方法稍稍多一些，也可以可以通过firebug看到。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jkisjk/aggbug/2167615.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jkisjk/archive/2011/09/05/window_external.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
