<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_web前端开发-Jun</title><subtitle type="text">为找到女朋友而努力！</subtitle><id>http://feed.cnblogs.com/blog/u/66329/rss</id><updated>2012-05-07T02:44:48Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/66329/rss"/><entry><id>http://www.cnblogs.com/idche/archive/2012/04/27/2473943.html</id><title type="text">canvas构建一个平面直角坐标系</title><summary type="text">功能： 1：可设置只显示某个象限（onlyQuadrant） 2：可设置刻度大小（setCalibration） 3：可设置放大比例（setProportion）可调用的方法（包括上面3个）： 向坐标系打印一点 （printPoint） 在坐标画一条直线（printLine） 设置下一画笔的填充色（setFillColor） 设置下一画笔的边框色（setStrokeColor） 获取某个坐标的真实x坐标（getx） 获取某个坐标的真实y坐标（gety）例子：http://jun-lu.github.com/jun/canvas_sin_cos_tan.html源码：https...</summary><published>2012-04-27T09:57:00Z</published><updated>2012-04-27T09:57:00Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idche/archive/2012/04/27/2473943.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/archive/2012/04/27/2473943.html"/><content type="html">&lt;p&gt;功能：&lt;/p&gt;&lt;p&gt;1：可设置只显示某个象限（onlyQuadrant）&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2：可设置刻度大小（setCalibration）&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;3：可设置放大比例（setProportion）&lt;/p&gt;&lt;p&gt;可调用的方法（包括上面3个）：&lt;/p&gt;&lt;p&gt;向坐标系打印一点 （printPoint）&lt;/p&gt;&lt;p&gt;在坐标画一条直线（printLine）&lt;/p&gt;&lt;p&gt;设置下一画笔的填充色（setFillColor）&lt;/p&gt;&lt;p&gt;设置下一画笔的边框色（setStrokeColor）&lt;/p&gt;&lt;p&gt;获取某个坐标的真实x坐标（getx）&lt;/p&gt;&lt;p&gt;获取某个坐标的真实y坐标（gety）&lt;/p&gt;&lt;p&gt;例子：&lt;a href="http://jun-lu.github.com/jun/canvas_sin_cos_tan.html"&gt;http://jun-lu.github.com/jun/canvas_sin_cos_tan.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;源码：&lt;a href="https://github.com/jun-lu/jun/blob/master/src/FlatSystem.js"&gt;https://github.com/jun-lu/jun/blob/master/src/FlatSystem.js&lt;/a&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;    平面直角坐标系类&lt;br/&gt;    可以轻松在一块画布上画出平面直角坐标系，可设置宽度，高度，绘制比例，以及单位刻度&lt;br/&gt;    构造函数 : FlatSystem&lt;br/&gt;                context： 画布的2d上下文&lt;br/&gt;                width：绘制的最大宽度&lt;br/&gt;                height：绘制的最大高度&lt;br/&gt;    属性设置：&lt;br/&gt;            this.calibration=30 //刻度 可通过 setCalibration(number) 设置 ,这个方法也是对外API之一&lt;br/&gt;            this.proportion=2 //绘制比例  可通过 setProportion(number) 设置这个方法也是对外API之一&lt;br/&gt;    api:&lt;br/&gt;        setCalibration(number);// 设置坐标系刻度&lt;br/&gt;        setProportion();// 设置坐标系绘制比例&lt;br/&gt;        init();//在画布上画出坐标系，如果在init之前没有设置刻度和绘制比例会使用默认的值&lt;br/&gt;        clear(x,y,width,height)//清除画布的某块区域，如果不传递任何值会清空全部画布 &lt;br/&gt;        &lt;br/&gt;        &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;span style="color: #000000;"&gt; FlatSystem(context, width, height){&lt;br/&gt;            &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context =&lt;span style="color: #000000;"&gt; context;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width =&lt;span style="color: #000000;"&gt; width;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height =&lt;span style="color: #000000;"&gt; height;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.calibration = 20;&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;this&lt;/span&gt;.proportion = 2;&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;this&lt;/span&gt;.jx = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width/2; //0坐标点的x位置&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jy = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height/2; //0坐标点的y位置&lt;br/&gt;        &lt;br/&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;this.init();&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;    &lt;br/&gt;}&lt;br/&gt;FlatSystem.prototype &lt;/span&gt;=&lt;span style="color: #000000;"&gt; {&lt;br/&gt;    constructor:FlatSystem,&lt;br/&gt;    init:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.clearRect(0,0,&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.height);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;this.width *= this.proportion;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;this.height *= this.proportion;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.moveTo(0,0&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.setFillColor("#000"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.setStrokeColor("#000"&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.build();&lt;br/&gt;    },&lt;br/&gt;    clear:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x, y, width, height){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.clearRect(x ||0,y || 0,width || &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width, height || &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.height);&lt;br/&gt;    },&lt;br/&gt;    setProportion:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(proportion){&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;this&lt;/span&gt;.proportion =&lt;span style="color: #000000;"&gt; proportion;&lt;br/&gt;    },&lt;br/&gt;    setCalibration:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(calibration){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.calibration = calibration;&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;    onlyQuadrant:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(quadran){&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;显示某一象限 1， 2， 3， 4&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(quadran == 0&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jx = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width/2;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jy = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height/2;&lt;br/&gt;&lt;span style="color: #000000;"&gt;        }&lt;br/&gt;        &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(quadran == 1&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jx = 50&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jy = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height-50&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(quadran == 2&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jx = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width - 50&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jy = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height - 50&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(quadran == 3&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jx = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width -50&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jy = 50&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(quadran == 4&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            &lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jx = 50&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jy = 50&lt;span style="color: #000000;"&gt;;&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;br/&gt;        在坐标系统打印一个点&lt;br/&gt;        x 轴坐标&lt;br/&gt;        y 轴坐标&lt;br/&gt;        width 点的宽度&lt;br/&gt;        height 点的高度&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    printPoint:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(x,y,width,height){&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;默认点阵宽度2&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;    &lt;br/&gt;        x &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getx(x);&lt;br/&gt;        y &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.gety(y);&lt;br/&gt;        &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(x &amp;lt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width &amp;amp;&amp;amp;  y &amp;lt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.height){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.drawRect(x, y, width || 2, height || 2&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: #0000ff;"&gt;true&lt;/span&gt;&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: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&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;br/&gt;        在坐标系中画一条直线（线段）&lt;br/&gt;        x 线段结束点 x坐标&lt;br/&gt;        y 线段结束点 y坐标&lt;br/&gt;        &lt;br/&gt;        sx 线段开始点 x坐标 可选 不传递将会使用上次画笔结束点&lt;br/&gt;        sy 线段开始点 y坐标 可选&lt;br/&gt;        &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    printLine:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x, y, sx, sy){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.drawLine(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.getx(x), &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.gety(y), &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.getx(sx),&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.gety(sy));&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;br/&gt;        设置填充色&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    setFillColor:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(color){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.fillStyle =&lt;span style="color: #000000;"&gt; color;&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;br/&gt;        设置边框色&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    setStrokeColor:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(color){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.strokeStyle =&lt;span style="color: #000000;"&gt; color;&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;br/&gt;        非公开&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    drawRect:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x,y,width, height){&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.context.beginPath();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.fillRect(x-width/2, y-height/2&lt;span style="color: #000000;"&gt;, width, height);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.context.stroke();&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;br/&gt;        非公开&lt;br/&gt;        在画布打印一个点，坐标为真实开始坐标和结束坐标&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    drawLine:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(x, y, sx, sy){&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;目标x y 开始sx sy&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.context.beginPath();&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(sx !== undefined &amp;amp;&amp;amp; sy !==&lt;span style="color: #000000;"&gt; undefined ){&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.context.moveTo(sx,sy);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;this.context.beginPath();&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.context.lineTo(x, y);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.context.stroke();&lt;br/&gt;    },&lt;br/&gt;    fillText:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(text, x, y){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.fillText(text, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.getx(x), &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.gety(y));&lt;br/&gt;    },&lt;br/&gt;    build:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&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;br/&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.drawLine(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jx, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jx, 0);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; y&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.drawLine(0, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jy, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width,  &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jy);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; x&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.setFillColor('#d8d8d8'&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.fillText("O", &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jx+5 , &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jy+10);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;原点坐标 0&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.buildCoordinate();&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; +x height/2&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;        &lt;br/&gt;    },&lt;br/&gt;    buildCoordinate:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&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;br/&gt;        &lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; calibration = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.calibration * &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.proportion;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;calibration 最小刻度&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; width = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.width;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; height = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.height;&lt;br/&gt;        &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; len = 中心点到4个最远点的最大绝对值 / 最小间隔单位&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; len =&lt;span style="color: #000000;"&gt; Math.max(&lt;br/&gt;                    Math.max( Math.abs(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.getx(0) - width), Math.abs(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.getx(0) - 0) ), &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;x轴绝对最大值&lt;/span&gt;&lt;br/&gt;                    Math.max( Math.abs(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.gety(0) - height ), Math.abs(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.gety(0) - 0) ) &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;y轴绝对最大值&lt;/span&gt;&lt;br/&gt;                )*&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.proportion /&lt;span style="color: #000000;"&gt; calibration;&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;this.setFillColor('#d8d8d8');&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; fixed = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.proportion &amp;gt;= 1 ? &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(x){&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;对于绘制比例小于1 处理小位数&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; x;&lt;br/&gt;        } : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(x){ &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (x).toFixed(1&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;var&lt;/span&gt; j=0;&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; d = 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; sx=0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; sy=0&lt;span style="color: #000000;"&gt;; &lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.textBaseline = "middle"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.setFillColor('#d8d8d8'&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;=len;i++){&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;            j &lt;/span&gt;= String(fixed(calibration*&lt;span style="color: #000000;"&gt;i));&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;console.log(typeof j);&lt;/span&gt;&lt;br/&gt;            sx = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.getx(calibration*i);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;第一象限&lt;/span&gt;&lt;br/&gt;            sy = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.gety(0&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            &lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.drawLine(sx, sy, sx, sy-5&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.textAlign = "center"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.fillText(j, sx, sy+10&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;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            &lt;br/&gt;            sx &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.getx(-calibration*i);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;第3象限&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;sy = this.gety(0);&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.drawLine(sx, sy, sx, sy-5&lt;span style="color: #000000;"&gt;);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.fillText(j, sx, sy+10&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;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            sx &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.getx(0);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;第4象限&lt;/span&gt;&lt;br/&gt;            sy = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.gety(-calibration*&lt;span style="color: #000000;"&gt;i);&lt;br/&gt;            &lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.drawLine(sx, sy, sx-5&lt;span style="color: #000000;"&gt;, sy);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.textAlign = "left"&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.fillText(j, sx+5&lt;span style="color: #000000;"&gt;, sy);&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;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;            &lt;br/&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;sx = this.getx(0);//第2象限&lt;/span&gt;&lt;br/&gt;            sy = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.gety(calibration*&lt;span style="color: #000000;"&gt;i);&lt;br/&gt;            &lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.drawLine(sx, sy, sx-5&lt;span style="color: #000000;"&gt;, sy);&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.context.fillText(j, sx+5&lt;span style="color: #000000;"&gt;, sy);&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;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;    },&lt;br/&gt;    isIn:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x, y){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; x = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.getx(x);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; y = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.gety(y);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; x&amp;gt;=0 &amp;amp;&amp;amp; x &amp;lt;= &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width &amp;amp;&amp;amp; y&amp;gt;=0 &amp;amp;&amp;amp; y&amp;lt;= &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.height;&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;br/&gt;        获取真实x坐标&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    getx:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; parseInt(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jx+(x/this.proportion));&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;br/&gt;        获取真实x坐标&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    gety:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(y){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; parseInt(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.jy-(y/this.proportion));&lt;br/&gt;&lt;span style="color: #000000;"&gt;    }&lt;br/&gt;};&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/idche/aggbug/2473943.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idche/archive/2012/04/27/2473943.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idche/archive/2012/04/25/2469516.html</id><title type="text">如何判断一个拼图是否可还原！</title><summary type="text">在写完JS版本拼图游戏以后，偶然发现其实打乱顺序的拼图不是都能还原的。在一个3*3的拼图中，会把图片裁切成9块，然后打乱顺序，通过调换空格块与邻块的位置来还原图片。（图1）完全还原的拼图（设 8 号为空格位）0 1 23 4 56 7 8（图2）一个不能还原的顺序（拼到最后你发现6和7的位置倒了，而其他图片的位置正确）0 1 23 4 57 6 8如何判断一个打乱的拼图可还原？一个打乱顺序的拼图，把数字连起来可以组成一个排列（比如图2= 0123456768）。可以通过计算这个排列的逆序数个数加空格位置的坐标,最终得到的数的奇偶性判断。数学原理比较复杂您可以看http://blog.csdn.</summary><published>2012-04-25T03:34:00Z</published><updated>2012-04-25T03:34:00Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idche/archive/2012/04/25/2469516.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/archive/2012/04/25/2469516.html"/><content type="html">&lt;p&gt;在写完JS版本拼图游戏以后，偶然发现其实打乱顺序的拼图不是都能还原的。&lt;/p&gt;&lt;p&gt;在一个3*3的拼图中，会把图片裁切成9块，然后打乱顺序，通过调换空格块与邻块的位置来还原图片。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;（图1）完全还原的拼图（设 8 号为空格位）&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;0 1 2&lt;br/&gt;3 4 5&lt;br/&gt;6 7 8&lt;/div&gt;&lt;p&gt;（图2）一个不能还原的顺序（拼到最后你发现6和7的位置倒了，而其他图片的位置正确）&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;0 1 2&lt;br/&gt;3 4 5&lt;br/&gt;&lt;strong&gt;7&lt;/strong&gt; &lt;strong&gt;6&lt;/strong&gt; 8&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何判断一个打乱的拼图可还原？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一个打乱顺序的拼图，把数字连起来可以组成一个排列（比如图2= 0123456768）。&lt;/p&gt;&lt;p&gt;可以通过计算这个排列的&lt;a href="http://baike.baidu.com/view/184395.htm?fromTaglist" target="_blank"&gt;逆序数个数&lt;/a&gt;加空格位置的坐标,最终得到的数的&lt;strong&gt;奇偶性&lt;/strong&gt;判断。&lt;/p&gt;&lt;p&gt;数学原理比较复杂您可以看&amp;nbsp;&lt;a href="http://blog.csdn.net/tailzhou/article/details/3002442"&gt;http://blog.csdn.net/tailzhou/article/details/3002442&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: 800;"&gt;&amp;nbsp;&lt;/span&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;    判断一个打乱顺序的数字拼图是否可还原&lt;br/&gt;    &lt;br/&gt;    order: 打乱以后的数字顺序；比如[0,1,2,3,4,5,7,6,8]&lt;br/&gt;            order里的数字8表示空位&lt;br/&gt;    size: 3*3的拼图就传3就可以了&lt;br/&gt;    &lt;br/&gt;    返回值：true false  &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;span style="color: #000000;"&gt; solvability(order, size){&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; a;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; count = 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; m = 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; n = 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    &lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; len =&lt;span style="color: #000000;"&gt; order.length;&lt;br/&gt;    size &lt;/span&gt;= size || 3&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;[0,1,2,3,4,5,7,6,8]&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;len; i++&lt;span style="color: #000000;"&gt;){&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; a =&lt;span style="color: #000000;"&gt; order[i];&lt;br/&gt;        &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(a == 8&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            m &lt;/span&gt;= parseInt(i/size);&lt;br/&gt;            n = parseInt(i%&lt;span style="color: #000000;"&gt;size);&lt;br/&gt;        }&lt;br/&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; j=i+1; j&amp;lt;len; j++&lt;span style="color: #000000;"&gt;){&lt;br/&gt;            &lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(order[j]&amp;lt;&lt;span style="color: #000000;"&gt;a){&lt;br/&gt;                count&lt;/span&gt;++&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    count &lt;/span&gt;+=&lt;span style="color: #000000;"&gt; m;&lt;br/&gt;    count &lt;/span&gt;+=&lt;span style="color: #000000;"&gt; n;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; count%2 == 0&lt;span style="color: #000000;"&gt;;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/idche/aggbug/2469516.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idche/archive/2012/04/25/2469516.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idche/archive/2012/03/17/2403894.html</id><title type="text">【记录】javascript Object使用Array的方法</title><summary type="text">Array.prototype.pushpush向数组尾部添加一项并更新length ，返回数组长度。如果Object使用push会怎样？看下面代码, obj好像数组一样工作了。length会自动更新。var push = Array.prototype.push;var obj = {};push.call(obj, "hello"); // 返回值 1// obj {"0":"hello", length:0}push.call(obj, "world"); // 返回值 2// obj {"0&amp;qu</summary><published>2012-03-17T10:52:00Z</published><updated>2012-03-17T10:52:00Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idche/archive/2012/03/17/2403894.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/archive/2012/03/17/2403894.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Array.prototype.push&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;push向数组尾部添加一项并更新length ，返回数组长度。&lt;/p&gt;&lt;p&gt;如果Object使用push会怎样？&lt;/p&gt;&lt;p&gt;看下面代码, obj好像数组一样工作了。length会自动更新。&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; push = Array.prototype.push;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; obj = {};&lt;br /&gt;push.call(obj, "hello"); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回值 1&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; obj {"0":"hello", length:0}&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;push.call(obj, "world"); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回值 2&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; obj {"0":"hello", "1":"world",length:2}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Array.prototype.length &amp;nbsp;Array.prototype.splice&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;把length和splice 给Object&lt;/p&gt;&lt;p&gt;看下面代码：obj这货居然变成数组了？其实不然这可能是调试工具的一些输出检查问题。&lt;br /&gt;我们用 instanceof 测试 &amp;nbsp;obj instanceof Array //false&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; obj = {&lt;br /&gt;    length:0,&lt;br /&gt;    splice:Array.prototype.splice&lt;br /&gt;};&lt;br /&gt;console.log( obj ); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 打印：[]&lt;/span&gt;&lt;/div&gt;&lt;p&gt;继续看下面的代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;obj.push(0)&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回obj.length  1&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;obj.push(1)&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回obj.length  2&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;obj.splice(0, 1);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;删除第一项 返回删除项[0]&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;obj.length &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 1 splice删除一项的时候同样更新 length属性&lt;/span&gt;&lt;/div&gt;&lt;p&gt;这样obj的表现几乎和array一样了。不出意外slice,pop,shift,unshift什么的都可以正常工作在object中。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;不过如果直接设置length，在数组中会删除大于length的下表的项， 但里的obj并不不会更新。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;应用在哪？&lt;/strong&gt;&lt;br /&gt;jQuery对象表现像一个array，其实他是一个对象。这种对象如何new出来呢？&lt;br /&gt;实际jQuery把Array的方法借给Object,从而达到这个jQuery对象的效果，jQuery对象内部也直接使用push等Array的方法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;看看jQuery的部分源码 (注意&lt;strong&gt;加粗&lt;/strong&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; Start with an empty selector&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;selector: "",&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; The current version of jQuery being used&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;jquery: "1.7.1",&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; The default length of a jQuery object is 0&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;length: 0,&lt;/strong&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; For internal use only.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Behaves like an Array's method, not like a jQuery method.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;push: push,&lt;/strong&gt;&lt;br /&gt;sort: [].sort,&lt;br /&gt;&lt;strong&gt;splice: [].splice&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果你要把Object玩成Array，那么可能潜在的问题length属性不会和&amp;ldquo;数组&amp;rdquo;项总和对应起来。&lt;/p&gt;&lt;p&gt;所以直接使用length设置长度不会得到支持。&lt;/p&gt;&lt;p&gt;看下面jquery代码，虽然length更新了，jquery的对象并没更新。（当然这并不是jquery的问题）&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; jq = $('div') &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;假设我们在页面获取了40个div&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;jq.length &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 40&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;jq.length = 0;&lt;br /&gt;jq&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ? jq中仍然存放了40个dom对象 length属性不会和&amp;ldquo;数组&amp;rdquo;项总和对应起来。&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Object使用array的方法还能正常工作，实在有些意想不到，可能实际应用远不止这些。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idche/aggbug/2403894.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idche/archive/2012/03/17/2403894.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idche/archive/2012/01/31/2333125.html</id><title type="text">【分享】让AJAX不依赖后端接口</title><summary type="text">问题是怎么个情况？ 网页中的ajax请求越来越多，或者应用开始就一直使用ajax与后端进行数据交换。（目前我在公司参与的项目就是如此）N多接口前后端来回调试是个麻烦事。后端不可能短时间把所有的接口都写完，也不会为了前端测试而制造假的数据和接口，不仅耗费时间而且到了开发阶段返回的数据结构、接口名称也可能会有许多改动。那么后端一边写接口一边给前端，这看起来不错。但在具体实施过程中，后端未完成的接口可能有错误，你需要不停的和后端沟通不停的找原因，有可能中途还会停滞等待后端返回数据正 确才能继续。为什么会这样？ 1：前端在开发初期就依赖了未成形的接口。 2：后端不完全知道前端需要的数据项及数据格...</summary><published>2012-01-31T07:05:00Z</published><updated>2012-01-31T07:05:00Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idche/archive/2012/01/31/2333125.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/archive/2012/01/31/2333125.html"/><content type="html">&lt;p&gt;&lt;strong&gt;问题是怎么个情况？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;网页中的ajax请求越来越多，或者应用开始就一直使用ajax与后端进行数据交换。（目前我在公司参与的项目就是如此）N多接口前后端来回调试是个麻烦事。&lt;/p&gt;&lt;p&gt;后端不可能短时间把所有的接口都写完，也不会为了前端测试而制造假的数据和接口，不仅耗费时间而且到了开发阶段返回的数据结构、接口名称也可能会有许多改动。那么后端&amp;nbsp;&lt;/p&gt;&lt;p&gt;一边写接口一边给前端，这看起来不错。但在具体实施过程中，后端未完成的接口可能有错误，你需要不停的和后端沟通不停的找原因，有可能中途还会停滞等待后端返回数据正 &lt;br /&gt;确才能继续。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么会这样？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1：前端在开发初期就依赖了未成形的接口。&lt;/p&gt;&lt;p&gt;2：后端不完全知道前端需要的数据项及数据格式。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何解决？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1：需求确认会议中前后端充分讨论功能和接口。（需求明确的backlog，这个工作非常简单）&lt;/p&gt;&lt;p&gt;在有完善的backlog文档前提下，用户的每个操作都被记录成明确的功能。只要在最后的确认中开发人员一致认同这些条目，就很容易总结出需要的接口。&lt;/p&gt;&lt;p&gt;2：前端写接口文档（后端辅助）。&lt;/p&gt;&lt;p&gt;为什么是前端？&lt;/p&gt;&lt;p&gt;　1：前端完全了解页面需要展示的数据。2：前端完全了解需要的数据格式（如何处理错误码等等）&lt;/p&gt;&lt;p&gt;前端的接口文档可能是这样：（示例登录接口）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;1：用户登录&lt;br /&gt;                    url: ? （留给后端补充）&lt;br /&gt;                    请求方式：POST&lt;br /&gt;                    请求参数：email:String&lt;br /&gt;                          pwd:String&lt;br /&gt;                          checkCode:String&lt;br /&gt;                    返回数据：&lt;br /&gt;                        {&lt;br /&gt;                            code:&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;,&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;错误编码,登录成功为0 其他错误返回错误编码，没有result项&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                            result:{&lt;br /&gt;                                id:&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 用户ID&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                                name:string &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;br /&gt;                            }&lt;br /&gt;                        }&lt;/div&gt;&lt;p&gt;后端如何辅助？&lt;/p&gt;&lt;p&gt;1：补充请求url。2：修正返回数据的字段。如果返回数据项很多文档中的字段不符合后端的开发字段，那么后端需要修改过来。&lt;br /&gt;　修改文档是一个前后端讨论的过程，有任何疑问都可以沟通。文档完成以后各自一份。（文档中任何修改都可以使用其他颜色标注，提醒其他人员注意）&lt;/p&gt;&lt;p&gt;后端补充完整以后可能是这样：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;1：用户登录&lt;br /&gt;                    url: user/login.php (补充)&lt;br /&gt;                    请求方式：POST&lt;br /&gt;                    请求参数：email:String&lt;br /&gt;                          pwd:String&lt;br /&gt;                          checkCode:String&lt;br /&gt;                    返回数据：&lt;br /&gt;                        {&lt;br /&gt;                            code:&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;,&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;错误编码,登录成功为0 其他错误返回错误编码，没有result项&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                            result:{&lt;br /&gt;                                id:&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 用户ID&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                                user:string &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;br /&gt;                            }&lt;br /&gt;                        }&lt;/div&gt;&lt;p&gt;&lt;br /&gt;3：开发过程完全依照文档&lt;/p&gt;&lt;p&gt;文档完成以后，大家心里都很清楚我只要这样做，返回、使用这样的数据就一定没错。&lt;/p&gt;&lt;p&gt;后端开始写代码，完全不用理会前端，他根本不会来找你的麻烦。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;前端如何依照文档开始工作？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;接口都有了，返回数据也有了。那么接下来的工作就是构建一套可以使用模拟数据测试的框架。&lt;/p&gt;&lt;p&gt;如果使用jquery,一个简单的结构可能是这样。&lt;/p&gt;&lt;p&gt;用户点击登录按钮，前端模拟了文档中描述的数据，直接调用了回调函数。这跟真实情况一样。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('750183cf-e947-4f69-b63a-c27853317742')"&gt;&lt;div id="cnblogs_code_open_750183cf-e947-4f69-b63a-c27853317742" class="cnblogs_code_hide"&gt;Common = {    &lt;br /&gt;    post:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(url, data, success){&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;一个基本的post请求封装&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        $.ajax({&lt;br /&gt;            url:url,&lt;br /&gt;            type:"post",&lt;br /&gt;            data:data,&lt;br /&gt;            dataType:"json",&lt;br /&gt;            error:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Common.tip(TipData["1002"], 0);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;ajax错误提示&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            },&lt;br /&gt;            success:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(data){&lt;br /&gt;            &lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(data &amp;amp;&amp;amp; data.code != 0){&lt;br /&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Common.showError(data);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;错误处理code转换成文字提示给用户&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                };&lt;br /&gt;                &lt;br /&gt;                success &amp;amp;&amp;amp; success(data);&lt;br /&gt;            }&lt;br /&gt;        });&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; 1：用户登录&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; login(email, pwd, checkCode, callback){&lt;br /&gt;        &lt;br /&gt;        &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 = { &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;            code : 0,&lt;br /&gt;            result:{&lt;br /&gt;                id:'123456',&lt;br /&gt;                user:"lujun"&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;        callback(data);&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;return&lt;/span&gt; ;&lt;br /&gt;        &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;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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        Common.post("user/login.php",{email:email, pwd:pwd, checkCode:checkCode}, callback);&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;/span&gt;&lt;span style="color: #008000;"&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;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    $('#submit').click(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;    &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; email = $('#email').val();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; pwd = $('#pwd').val();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; checkCode = $('#checkCode').val();&lt;br /&gt;        &lt;br /&gt;        &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;        login(email, pwd, checkCode, &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(data){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(data &amp;amp;&amp;amp; data.code == 0){&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;ajax执行成功&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                data = data.result;&lt;br /&gt;                $('#userName').text(data.user);&lt;br /&gt;                &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;br /&gt;        });&lt;br /&gt;    });&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何更好的工作？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;全部功能接口都采用这样的方式工作，会发现整个应用不需要后端支持，完全用模拟数据就可以验收测试，是不是酷了一点呢！&lt;/p&gt;&lt;p&gt;一旦你准备链接正式数据，注释掉测试代码以后（这可能分布在代码的各个角落，10处或者更多）。你不能在测试环境、链接数据库的环境中快速切换！&lt;/p&gt;&lt;p&gt;这样的测试代码价值太有限。&lt;/p&gt;&lt;p&gt;我们可以把测试数据独立出来作为一个文件，使用方法覆盖的方式把最底层的AJAX请求方法覆盖。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('1ff967da-a345-457d-881e-b879e69dd112')"&gt;&lt;div id="cnblogs_code_open_1ff967da-a345-457d-881e-b879e69dd112" class="cnblogs_code_hide"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;testData.js 用来存放所有测试数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    TestData = {&lt;br /&gt;        "userlogin":{ &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;            code : 0,&lt;br /&gt;            result:{&lt;br /&gt;                id:'123456',&lt;br /&gt;                user:"lujun"&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;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&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; common.js&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 覆盖 Common.post 方法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    Common.post:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(url, data, success){&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;一个基本的post请求封装&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;把url进行MD5来作为key也是一个不错的想法，可以省去那么多判断&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(url == "user/login.php"){&lt;br /&gt;            success(TestData["userlogin"]);&lt;br /&gt;        }&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(url == "other"){&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: #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;br /&gt;        &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; 1：用户登录&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; login(email, pwd, checkCode, callback){&lt;br /&gt;        Common.post("user/login.php",{email:email, pwd:pwd, checkCode:checkCode}, callback);&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;/span&gt;&lt;span style="color: #008000;"&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;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    $('#submit').click(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;    &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; email = $('#email').val();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; pwd = $('#pwd').val();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; checkCode = $('#checkCode').val();&lt;br /&gt;        &lt;br /&gt;        &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;        login(email, pwd, checkCode, &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(data){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(data &amp;amp;&amp;amp; data.code == 0){&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;ajax执行成功&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                data = data.result;&lt;br /&gt;                $('#userName').text(data.user);&lt;br /&gt;                &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;br /&gt;        });&lt;br /&gt;    });&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面的代码很容易理解，想要模拟数据测试的时候就把最底层的ajax请求方法覆盖掉。&lt;/p&gt;&lt;p&gt;当然这只是其中的一种，你可能有更好的方法或者通过一个全局变量就可以切换两个环境，就好象 debug = false, debug = true 这样！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最后&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;方法说透了其实也非常简单，重要的是scrum中backlog的分解和理解。&lt;br /&gt; 我所在的团队现在采用这种方式工作非常顺利。&lt;br /&gt; 最后我一直在考虑一个合并混淆压缩有500K JS 的应用如何组织代码？&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idche/aggbug/2333125.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idche/archive/2012/01/31/2333125.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idche/archive/2011/11/29/2267566.html</id><title type="text">【记录】一些平时留意过的</title><summary type="text">CSScss outline 与border 重要区别，outline不参与到文档流中，即outline是不站位置的。最好为a标签的每一个状态都设置你需要的 text-decoration，不然各种悲催的浏览器表现不一样::selection这应该是一个新的伪类，定义了网页选中的背景颜色，在“又拍”发现的。两个同级的div 都设置了 inline-block，你会发现他们之间有一些间隙（ff,chrome大多A级浏览器都这样），非常莫名其妙。 这是由于代码换行导致的，强制把代码写在一行就行了。 具体为什么还真不知道，太BUG了。文章链接用label 包裹 input 不写for 不能聚焦到in</summary><published>2011-11-29T06:21:00Z</published><updated>2011-11-29T06:21:00Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idche/archive/2011/11/29/2267566.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/archive/2011/11/29/2267566.html"/><content type="html">&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;css outline 与border 重要区别，outline不参与到文档流中，即outline是不站位置的。&lt;/li&gt;&lt;li&gt;最好为a标签的每一个状态都设置你需要的 text-decoration，不然各种悲催的浏览器表现不一样&lt;/li&gt;&lt;li&gt;::selection&amp;nbsp;这应该是一个新的伪类，定义了网页选中的背景颜色，在&amp;ldquo;又拍&amp;rdquo;发现的。&lt;/li&gt;&lt;li&gt;两个同级的div 都设置了 inline-block，你会发现他们之间有一些间隙（ff,chrome大多A级浏览器都这样），非常莫名其妙。 这是由于代码换行导致的，强制把代码写在一行就行了。 具体为什么还真不知道，太BUG了。&lt;a href="http://www.qianduan.net/firefox-bug-inline-inline-block-gap.html" target="_blank"&gt;文章链接&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;用label 包裹 input 不写for 不能聚焦到input(IE6下)，其他浏览器可以！&lt;/li&gt;&lt;li&gt;一个关于z-index在IE下表现错误的测试。&lt;a href="http://www.planabc.net/2007/04/23/z-index_in_ie_bug/" target="_blank"&gt; 一篇博客&lt;/a&gt;&amp;nbsp; &amp;nbsp;&lt;a href="https://lh3.googleusercontent.com/-Werf9pG9BFE/Tp-FeoyCT4I/AAAAAAAAAKg/2g4sXbVSD5Q/s802/hello.jpg" target="_blank"&gt;看图更容易理解&lt;/a&gt;&lt;/li&gt;&lt;li&gt;一个微软的&lt;a href="http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx" target="_blank"&gt;文档&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;display:table;&amp;nbsp;&lt;br /&gt;在Chrome下可能引发横向布局算法发生变化。比如border宽度被计算到width内！&lt;br /&gt;---- 这可能是Chrome的一个BUG，firefox和其他浏览器表现正常&lt;/li&gt;&lt;li&gt;疑惑 ---&amp;nbsp;white-space 用来处理空白字符在浏览器中的表现，为什么有一个nowrap来控制文本是否断行，这个任务不是应该交给 word-wrap 、 word-break 吗？&lt;/li&gt;&lt;li&gt;div:nth-child(1){ &amp;nbsp;// 这个CSS3的新选择器需要纠结一会，有好几个类似也是这个规则&lt;br /&gt;font-size:24px;&lt;br /&gt;} / * 在容器第1个元素是div * /&lt;br /&gt;&lt;br /&gt;div:nth-of-type(1){&lt;br /&gt;font-size:36px;&lt;br /&gt;}/* 在容器中所有div中的第1个 */&lt;/li&gt;&lt;li&gt;行内元素（内联元素display:inline）,不接受宽度（width）,高度(height),上下外边距（margin-left，margin-top）,这很容易理解。&lt;br /&gt;但是postition:absolute|fixed;会改变这个状况,使其可以接受以上CSS属性。(IE6 fixed 出外)&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;javascript&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 发布以后这里的内容不见了,不再敲一遍了。哎&lt;/p&gt;&lt;div&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="line-height: 0px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="line-height: 0px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="line-height: 0px;"&gt;其他&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="line-height: 0px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span class="Apple-style-span" style="line-height: 0px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;IE 7上传一个jpg图片，PHP读取到的图片类型是 image/pjpeg。大多浏览器都是 image/jpg, image/jpeg 。据说IE6也有可能这样。&lt;strong&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idche/aggbug/2267566.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idche/archive/2011/11/29/2267566.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idche/archive/2011/10/30/2229153.html</id><title type="text">【分享】javascript 拼图游戏</title><summary type="text">近2个月来没有阅读技术书籍，感觉有点盲目。期间看了《明朝那些事儿》（1，2，3）、《FBI教你破解身体语言》 我看书很慢。现在又迷上了手机拼图游戏，写了一个JS版本的，本想可以利用小键盘在3*3的拼图上提高速度，最后发现其实在手机上才能最快。（一个普通的3*3数字拼图15内秒可以完成，30%可以10秒类完成）！JS版本的数字拼图在这里 GIT PUZZLE手机上的拼图游戏名字叫：拼图（数字）游戏（可以在市场中找到，LOGO是一朵花）顺便提供一下RAR 下载JS拼图游戏源码如下----------------------------View Code //一个puzz类 v...</summary><published>2011-10-30T03:36:00Z</published><updated>2011-10-30T03:36:00Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idche/archive/2011/10/30/2229153.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/archive/2011/10/30/2229153.html"/><content type="html">&lt;p&gt;近2个月来没有阅读技术书籍，感觉有点盲目。&lt;/p&gt;&lt;p&gt;期间看了《&lt;a href="http://book.douban.com/subject/1873231/" target="_blank"&gt;明朝那些事儿&lt;/a&gt;》（1，2，3）、《&lt;a href="http://book.douban.com/subject/3622446/" target="_blank"&gt;FBI教你破解身体语言&lt;/a&gt;》 我看书很慢。&lt;/p&gt;&lt;p&gt;现在又迷上了手机拼图游戏，写了一个JS版本的，本想可以利用小键盘在3*3的拼图上提高速度，最后发现其实在手机上才能最快。（一个普通的3*3数字拼图15内秒可以完成，30%可以10秒类完成）！&lt;/p&gt;&lt;p&gt;JS版本的数字拼图在这里 &lt;a href="https://github.com/jun-lu/puzzle" target="_blank"&gt;GIT PUZZLE&lt;/a&gt;&lt;/p&gt;&lt;p&gt;手机上的拼图游戏名字叫：拼图（数字）游戏（可以在市场中找到，LOGO是一朵花）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;顺便提供一下RAR &lt;span style="font-size: 16px;"&gt;&lt;strong&gt;&lt;a href="http://files.cnblogs.com/idche/puzzle.rar" target="_blank"&gt;下载JS拼图游戏&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;源码如下----------------------------&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('6a91285b-1dd3-4ad2-9f10-6bdb535dd811')"&gt;&lt;div id="cnblogs_code_open_6a91285b-1dd3-4ad2-9f10-6bdb535dd811" class="cnblogs_code_hide"&gt;    &lt;br /&gt;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;一个puzz类&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; Puzz = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(index, width, height, size, wrap, url, end){&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;顺序 宽度，高度，比例，父容器，url, 是否是最后一个元素&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.left = 0;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.top = 0;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.defaultBackground = "#fff";&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width = width;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height = height;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size = size;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.wrap = wrap;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.url = url;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.end = end;&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;this&lt;/span&gt;.index = index + 1;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.x = 0;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.y = 0;&lt;br /&gt;    };&lt;br /&gt;    Jun.mix(Puzz.prototype, {&lt;br /&gt;        init:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.create();&lt;br /&gt;        },&lt;br /&gt;        setLeft:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(value){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.left = value+'px';&lt;br /&gt;        },&lt;br /&gt;        setTop:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(value){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.top = value+'px';&lt;br /&gt;        },&lt;br /&gt;        setDefaultBackground:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(color){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.defaultBackground = color;&lt;br /&gt;        },&lt;br /&gt;        getProperty:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(key){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;[key];&lt;br /&gt;        },&lt;br /&gt;        move:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(x, y){&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;this&lt;/span&gt;.setLeft( x * &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width );&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.setTop( y * &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height );&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.update();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.x = x;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.y = y;&lt;br /&gt;        },&lt;br /&gt;        create:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; div = Jun.dom.create('div');&lt;br /&gt;            div.className = "puzz-item";&lt;br /&gt;            div.style.width = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width+"px";&lt;br /&gt;            div.style.height = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height+"px";&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele = div;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; lie = parseInt((&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.index-1)/this.size);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; row = parseInt((&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.index-1)%&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size);&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.url &amp;amp;&amp;amp; &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.end == &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;){&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.setShowBackground("url("+ &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.url +") no-repeat -"+(row*&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width)+"px -"+(lie*&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height)+"px");    &lt;br /&gt;            }&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;{&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.setShowBackground(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.defaultBackground);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.move(row, lie);&lt;br /&gt;&lt;br /&gt;        },&lt;br /&gt;        setShowInt:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; p = Jun.dom.create('p');&lt;br /&gt;                p.innerText = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.index;&lt;br /&gt;            Jun.dom.append(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele, p);&lt;br /&gt;        },&lt;br /&gt;        setShowBackground:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(background){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele.style.background = background;&lt;br /&gt;        },&lt;br /&gt;        update:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele.style.left = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.left;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele.style.top = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.top;&lt;br /&gt;        },&lt;br /&gt;        isOkay:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; parseInt((&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.index - 1) / &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size) == &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.y  &amp;amp;&amp;amp; parseInt((&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.index-1)%&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size) == &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.x;&lt;br /&gt;        },&lt;br /&gt;        drawing:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(x, y){&lt;br /&gt;            Jun.dom.append(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.wrap, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele);&lt;br /&gt;        },&lt;br /&gt;        click:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(callback, obj){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; _this = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele.onclick = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;                callback.call(obj, _this.y, _this.x);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; Puzzie = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(id, width, height, url, size, isNunber){&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;容器ID，宽度，高度，图片url, 拆分模块数量, 是否拼数字&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; dom = Jun.dom;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.dom = dom;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele = dom.$(id);&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.url = url;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width = width;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height = height;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size = size;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList = [];&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;全部item&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.listOrder = [];&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;this&lt;/span&gt;.isNunber = isNunber != &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt; ? &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt; : &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;undefined &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.init();&lt;br /&gt;    };&lt;br /&gt;    Jun.mix(Puzzie.prototype, {&lt;br /&gt;        init:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele.style.background = "url("+&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.url+")";&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemWidth = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.width / &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemHeight = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.height / &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList = [];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.create();&lt;br /&gt;        },&lt;br /&gt;        create:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; item = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; end = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; url = '';&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, len = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size * &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size; i&amp;lt;len; i++){&lt;br /&gt;                end =(i+1 == len ? &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt; : &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;                item = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Puzz(i, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemWidth, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemHeight, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.url, end);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;new 新的item&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                item.init();&lt;br /&gt;    &lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.isNunber == &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt; &amp;amp;&amp;amp; end == &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;){&lt;br /&gt;                    item.setShowInt();&lt;br /&gt;                }&lt;br /&gt;                &lt;br /&gt;                list.push( item );&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size == 3){&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.bindWindow();&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;br /&gt;        },&lt;br /&gt;        regEvent:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(x, y){&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;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; size = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; order = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.listOrder;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; j = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt; ;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(x &amp;gt; 0 &amp;amp;&amp;amp; list[order[x-1][y]].end){&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;                list[order[x][y]].move(y, x-1);&lt;br /&gt;                list[order[x-1][y]].move(y, x);&lt;br /&gt;                j = order[x][y];&lt;br /&gt;                order[x][y] = order[x-1][y];&lt;br /&gt;                order[x-1][y] = j;&lt;br /&gt;            }&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(y &amp;lt; order.length-1 &amp;amp;&amp;amp; list[order[x][y+1]].end){&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;                list[order[x][y]].move(y+1, x);&lt;br /&gt;                list[order[x][y+1]].move(y, x);&lt;br /&gt;                j = order[x][y];&lt;br /&gt;                order[x][y] = order[x][y+1];&lt;br /&gt;                order[x][y+1] = j;&lt;br /&gt;            }&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(x &amp;lt; order.length-1 &amp;amp;&amp;amp; list[order[x+1][y]].end){&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;                list[order[x][y]].move(y, x+1);&lt;br /&gt;                list[order[x+1][y]].move(y, x);&lt;br /&gt;                j = order[x][y];&lt;br /&gt;                order[x][y] = order[x+1][y];&lt;br /&gt;                order[x+1][y] = j;&lt;br /&gt;            }&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(y &amp;gt; 0 &amp;amp;&amp;amp; list[order[x][y-1]].end){&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;                list[order[x][y]].move(y-1, x);&lt;br /&gt;                list[order[x][y-1]].move(y, x);&lt;br /&gt;                j = order[x][y];&lt;br /&gt;                order[x][y] = order[x][y-1];&lt;br /&gt;                order[x][y-1] = j;&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.isOkay()){&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.success();&lt;br /&gt;            };&lt;br /&gt;            &lt;br /&gt;        },&lt;br /&gt;        start:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList;&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, len=list.length; i&amp;lt;len; i++){&lt;br /&gt;                list[i].drawing();&lt;br /&gt;                list[i].click(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.regEvent, &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;            };&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.shuffle();&lt;br /&gt;        },&lt;br /&gt;        sort:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(array){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; array.sort(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;                 &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; Math.random() - 0.5;&lt;br /&gt;            });&lt;br /&gt;        },&lt;br /&gt;        shuffle:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&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;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList.length == 0){&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.init();&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.start();&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; ;&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; order = [];&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;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;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size * &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size; i++){&lt;br /&gt;                order.push(i);&lt;br /&gt;            };&lt;br /&gt;&lt;br /&gt;            order = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.sort(order);&lt;br /&gt;            order = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.sort(order);&lt;br /&gt;            order = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.sort(order);&lt;br /&gt;                &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; size = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; listOrder = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.listOrder = [];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; itemList = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=0; i&amp;lt;size ; i++){&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;                listOrder.push(order.slice(i*size, (i+1)*size));&lt;br /&gt;            };&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=0,len=listOrder.length; i&amp;lt;len; i++){&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; j=0; j&amp;lt;listOrder[i].length; j++){&lt;br /&gt;                    itemList[listOrder[i][j]].move(j, i);&lt;br /&gt;                }&lt;br /&gt;            };&lt;br /&gt;&lt;br /&gt;        },&lt;br /&gt;        &lt;br /&gt;        isOkay:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; okay = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList;&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, len=list.length; i&amp;lt;len; i++){&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;( !list[i].isOkay() ){&lt;br /&gt;                    okay = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&lt;br /&gt;                };&lt;br /&gt;            };&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; okay;&lt;br /&gt;        },&lt;br /&gt;        success:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&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;this&lt;/span&gt;.itemList = [];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ele.innerHTML = '';&lt;br /&gt;        },&lt;br /&gt;        keyMove:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(index){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; lie = parseInt((index-1)/this.size);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; row = parseInt((index-1)%&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.regEvent(lie , row);&lt;br /&gt;        },&lt;br /&gt;        bindWindow:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; _this = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;var keyboard = {97:1,98:2,99:3,100:4,101:5,102:6,103:7,104:8,105:9};//正常键盘&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; keyboard = {97:7,98:8,99:9,100:4,101:5,102:6,103:1,104:2,105:3};&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;反转键盘 789 = 123  &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            document.onkeyup = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(event){&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; e = event || window.event;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; index = keyboard[e.keyCode];&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(index){&lt;br /&gt;                    _this.keyMove(index);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; PuzzTest = {&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 测试api&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        order1:[0,1,2,3,4,5,7,6,8],&lt;br /&gt;        shuffleOrder:&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(order){&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;按照order的顺序来刷新&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; size = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.size;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; listOrder = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.listOrder = [];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; itemList = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=0; i&amp;lt;size ; i++){&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;                listOrder.push(order.slice(i*size, (i+1)*size));&lt;br /&gt;            };&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.itemList;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=0,len=listOrder.length; i&amp;lt;len; i++){&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; j=0; j&amp;lt;listOrder[i].length; j++){&lt;br /&gt;                    itemList[listOrder[i][j]].move(j, i);&lt;br /&gt;                }&lt;br /&gt;            };&lt;br /&gt;        }    &lt;br /&gt;    };&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idche/aggbug/2229153.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idche/archive/2011/10/30/2229153.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idche/archive/2011/09/16/2178918.html</id><title type="text">【分享】javascript合并混淆压缩</title><summary type="text">公司项目上线需要混淆合并压缩javascript代码。原本有一个混淆压缩工具，因为内部服务器挂掉了工具也没有了。使用的压缩算法来自http://dean.edwards.name/packer/ 。 这里只是做了一些简单的合并调用。上面的算法有一些缺点，如果源码缺少必要的分号或者存在多余的逗号压缩以后的文件会出现语法错误。方案：可以先使用google的压缩工具压缩，它可以提示错误，找出一些潜在问题。然后再用混淆压缩！注意：这个压缩工具是运行在服务器环境下的（这里采用了PHP，合并以后要保存文件所以必须是服务器环境）使用的时候需要配置 bulid/config.js 就可以了。var confi</summary><published>2011-09-16T08:36:00Z</published><updated>2011-09-16T08:36:00Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idche/archive/2011/09/16/2178918.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/archive/2011/09/16/2178918.html"/><content type="html">&lt;p&gt;公司项目上线需要混淆合并压缩javascript代码。&lt;/p&gt;&lt;p&gt;原本有一个混淆压缩工具，因为内部服务器挂掉了工具也没有了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;使用的压缩算法来自&amp;nbsp;&lt;a href="http://dean.edwards.name/packer/"&gt;http://dean.edwards.name/packer/&lt;/a&gt;&amp;nbsp; &amp;nbsp;。 这里只是做了一些简单的合并调用。&lt;/p&gt;&lt;p&gt;上面的算法有一些缺点，如果源码缺少必要的分号或者存在多余的逗号压缩以后的文件会出现语法错误。&lt;/p&gt;&lt;p&gt;方案：可以先使用google的压缩工具压缩，它可以提示错误，找出一些潜在问题。然后再用混淆压缩！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;注意：这个压缩工具是运行在服务器环境下的（这里采用了PHP，合并以后要保存文件所以必须是服务器环境）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;使用的时候需要配置 bulid/config.js 就可以了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;var config = {&lt;br/&gt;"model1":{&lt;br/&gt;"base62":false,&lt;br/&gt;"shrink":false,&lt;br/&gt;"outputFile":"../helloworld.js",//文件路径相对于config.js 在压缩之前 先建立这个文件&lt;br/&gt;"jsList":[//文件路径相对于config.js&lt;br/&gt;"../helloworld/hello.js",&lt;br/&gt;"../helloworld/world.js"&lt;br/&gt;]&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;界面大约是这样&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/idche/245996/r_packe.jpg" alt="预览图片" width="640" height="312" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/idche/packer.rar"&gt;下载地址&lt;/a&gt;&amp;nbsp;（因为里面包含了compiler.jar google的压缩工具java包所以文件有5M）；&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;完毕&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;真完毕了&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idche/aggbug/2178918.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idche/archive/2011/09/16/2178918.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idche/archive/2011/08/09/2132337.html</id><title type="text">【分享】页面提示插件更新</title><summary type="text">Stip一个用于页面的提示插件。可以做表单验证，页面提示等。GITHUB：https://github.com/jun-lu/Stip演示地址：http://jun-lu.github.com/Stip/doc/index.html文档下载：下载--------效果----------------------------------感谢</summary><published>2011-08-09T07:17:00Z</published><updated>2011-08-09T07:17:00Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idche/archive/2011/08/09/2132337.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/archive/2011/08/09/2132337.html"/><content type="html">&lt;p&gt;Stip一个用于页面的提示插件。&lt;/p&gt;&lt;p&gt;可以做表单验证，页面提示等。&lt;/p&gt;&lt;p&gt;GITHUB：&amp;nbsp;&lt;a href="https://github.com/jun-lu/Stip"&gt;https://github.com/jun-lu/Stip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;演示地址：&amp;nbsp;&lt;a href="http://jun-lu.github.com/Stip/doc/index.html"&gt;http://jun-lu.github.com/Stip/doc/index.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;文档下载：&lt;a href="http://files.cnblogs.com/idche/Stip4.rar" target="_blank"&gt;下载&lt;/a&gt;&lt;/p&gt;&lt;p&gt;--------效果----------------------------------&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/idche/245996/r_stip1.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/idche/245996/r_stip2.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/idche/245996/r_stip3.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;感谢&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idche/aggbug/2132337.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idche/archive/2011/08/09/2132337.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idche/archive/2011/07/28/2119635.html</id><title type="text">【记录】动态加载script的执行顺序</title><summary type="text">通过createElement创建的 script 标签其属性async默认为true,直接写在页面上的script标签默认为 false;false能保证多个script的执行顺序，true不能保证。所以在动态插入多个script默认是不能保证执行顺序的！如果在创建的同时指定 async 为 false， 除IE(6789)不能保证顺序，其他A级浏览器都可以！另外：新建的script通过setAttribute设置async为false会失败。使用 script.async = false; 可以达到预期效果！：opera浏览器不鸟 async ，始终能保证执行顺序-------------</summary><published>2011-07-28T07:49:00Z</published><updated>2011-07-28T07:49:00Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idche/archive/2011/07/28/2119635.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/archive/2011/07/28/2119635.html"/><content type="html">&lt;p&gt;通过createElement创建的 script 标签其属性async默认为true,直接写在页面上的script标签默认为 false;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;false能保证多个script的执行顺序，true不能保证。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;所以在动态插入多个script默认是不能保证执行顺序的！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果在创建的同时指定 async 为 false， 除IE(6789)不能保证顺序，其他A级浏览器都可以！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;另外：新建的script通过setAttribute设置async为false会失败。使用 script.async = false; 可以达到预期效果！&lt;/p&gt;&lt;p&gt;：opera浏览器不鸟 async ，始终能保证执行顺序&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;-----------------测试了很久，发现了这些。基本都是用最新的浏览器&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2011-07-29&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;-昨天测试错误，async属性在IE下是没用的。所以不能保证顺序的有&amp;nbsp;IE6789&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idche/aggbug/2119635.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idche/archive/2011/07/28/2119635.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idche/archive/2011/07/15/2107297.html</id><title type="text">【分享】关于a标签的4个伪类</title><summary type="text">a:link{color:#f30;} a:visited{color:#000;} a:hover{color:#fff;} a:active{color:#f99;}上面是a元素4个伪类的正确顺序，简称 lvha(love-ha)。为什么这样才是正确的？ 首先4个伪类的特殊性（应用优先级）是同样的，CSS有一条规则“后出现的样式会覆盖前面的样式”，伪类同样适用这条原则，所以当两个伪类同时作用于同一个元素的时候，相同的CSS属性就覆盖了。比如把hover放在active后面，那么实际你在激活（active）链接的时候就触发了hover伪类，hover在后面覆盖了a...</summary><published>2011-07-15T05:22:00Z</published><updated>2011-07-15T05:22:00Z</updated><author><name>Jun.lu</name><uri>http://www.cnblogs.com/idche/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idche/archive/2011/07/15/2107297.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idche/archive/2011/07/15/2107297.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #800000;"&gt;    a:link&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;color&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#f30&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;    a:visited&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;color&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#000&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;    a:hover&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;color&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#fff&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;    a:active&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;color&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#f99&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;上面是a元素4个伪类的正确顺序，简称 lvha(love-ha)。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么这样才是正确的？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先4个伪类的特殊性（应用优先级）是同样的，CSS有一条规则&amp;ldquo;后出现的样式会覆盖前面的样式&amp;rdquo;，伪类同样适用这条原则，&lt;/p&gt;&lt;p&gt;所以当两个伪类同时作用于同一个元素的时候，相同的CSS属性就覆盖了。&lt;/p&gt;&lt;p&gt;比如把hover放在active后面，那么实际你在激活（active）链接的时候就触发了hover伪类，hover在后面覆盖了active的颜色，所以始终无法看到active的颜色&lt;/p&gt;&lt;p&gt;如果把visited放在hover的后面，那么已经访问过的链接始终触发visited伪类，根据第一条会覆盖hover里面的颜色。&lt;/p&gt;&lt;p&gt;最后 link visited 这两个伪类可以交换位置，因为他们不会同时出现&lt;/p&gt;&lt;p&gt;-----------------分割线&lt;/p&gt;&lt;p&gt;一个测试页面：&lt;a href="https://github.com/jun-lu/layout/blob/dev/csshtml/lvha.html"&gt;https://github.com/jun-lu/layout/blob/dev/csshtml/lvha.html&lt;/a&gt;&amp;nbsp;在GITHUB上的一个测试页面。&lt;/p&gt;&lt;p&gt;以上内容是自己最近看《css权威指南》&amp;nbsp;第3章后得出的结。如有不对还请指正。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idche/aggbug/2107297.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idche/archive/2011/07/15/2107297.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
