my blog my blog

Tag: JavaScript
Sails.js安装教程

 

很久不搞web了,学点儿新东西。最近打算学习node.js,做个小项目,找了下node.js的框架,感觉比较喜欢Sails.js,但是国内的Sails.js的资料实在是少之又少,于是乎,决定自己把Sails的教程整理下,也不知道能学到啥样,能做出啥东西来,一点儿点儿来吧,奶牛Sails.js折腾现在开始。

1.Sails.js需要node.js的支持,所以先安装Node.js。过程不详述。

2.安装Sails.js

  1. npm -g install sails 

3.使用Sails.js建立Sails.js项目

  1. sails new nenewTestProject 

4.启动Sails.js项目

  1. cd nenewTestProject 
  2. sails lift 

这时候如果sails正常运行会看到如下提示

  1. info: Starting app... 
  2.  
  3. info: 
  4. info:                .-..-. 
  5. info: 
  6. info:    Sails              <|    .-..-. 
  7. info:    v0.12.1             |\ 
  8. info:                       /|.\ 
  9. info:                      / || \ 
  10. info:                    ,'  |'  \ 
  11. info:                 .-'.-==|/_--' 
  12. info:                 `--'-------' 
  13. info:    __---___--___---___--___---___--___ 
  14. info:  ____---___--___---___--___---___--___-__ 
  15. info: 
  16. info: Server lifted in `C:\Users\Nenew\nenewTestProject` 
  17. info: To see your app, visit http://localhost:1337 
  18. info: To shut down Sails, press <CTRL> + C at any time. 
  19.  
  20. debug: -------------------------------------------------------- 
  21. debug: :: Sat Feb 27 2016 11:34:28 GMT+0800 (中国标准时间) 
  22.  
  23. debug: Environment : development 
  24. debug: Port        : 1337 
  25. debug: -------------------------------------------------------- 

至此,Sails.js已经安装运行成功,我们可以通过http://localhost:1337对Sails.js的默认页面进行访问。

JavaScript操作浏览器Cookie

 

最近在构思一个企业站建设的中英文页面问题,想到双语,我觉得两种方法实现起来比较好,一种是ajax直接把数据调用过来,但是对于有很多个div块儿的像首页这种的页面的话,可能要有几个ajax请求,所以,我觉得还是使用预先在页面的html中填写后通过cookie来控制比较方便。

使用cookie定义一个language的项,使用cn/en来区分语言,在页面的class中添加cn/en作为区分中文英文的标志,这样子,需要中文英文切换的时候,直接调用jQuery就可以方便的搞定了。

  1. $('.cn').hide(); //关闭中文 
  2. $('.en').show(); //开启英文 
  3. $('.en').hide(); //关闭英文 
  4. $('.cn').show(); //开启中文 

默认情况下显示中文,在页面载入完成后对页面进行cookie的判断,判断是否有定义,如果没有定义就不管了,如果有定义language项,那么就通过js控制启用cookie记录的语言。当页面浏览的时候,监视页面的语言选择按钮,这样子,在切换语言的同时将对应的cookie记录下来,并设置一个较为长久的过期时限即可。对于cookie的操作呢,使用js的document.cookie也可,也可以使用轻量级封装的类库jquery.cookie,当然咯,还是类库方便一些,通过api直接查直接用,但是对于cookie的理解还需要知道两点的:

  1. cookie默认是以session为周期的,会话结束,cookie亦失效。 
  2. cookie可以设置过期日期的(常用的记住密码就是用这个实现) 
  3. cookie的删除操作其实就是将cookie的过期日期设置在过去,然后cookie就自动失效删除了 

剩下的就不多说了,直接去https://github.com/nenew/jquery-cookie 拿类库来用吧,要不复杂结构的cookie手动拆析分离太麻烦了。

Holo风格圆盘进度条knob使用教程

 

jQuery Knob是一款可以实现圆盘风格进度条的小插件,使用很方便,api也比较全面。先上个效果图:

jquery knob

这个是奶牛自己写的一个小效果图,下面说说knob。knob的实现的效果是HTML5的canvas。兼容性上Chrome, Safari, Firefox, IE 9.0都可以,还蛮不错的。更多效果可以看http://anthonyterrien.com/knob/。

下面说说使用:

1.下载knob可以去https://github.com/aterrien/jQuery-Knob,也可以直接

  1. git clone git://github.com/aterrien/jQuery-Knob.git 

2.嵌入html中js代码

  1. <script src="js/jquery.knob.js"></script> 

3.使用,knob是通过对<input>进行处理来实现canvas绘图的。先在页面中插入一个input

  1. <input class="knob" type="text" value="30" data-width="150" 
  2. data-fgColor="#009100" data-skin="tron" data-thickness=".1" 
  3. data-angleOffset="0">  

我这个里面已经加了一些参数,等下解释。

4.通过js脚本来对knob进行初始化

  1. $('.knob').knob(); 

这是最简单的操作,当然,根据官方的文档,初始化里面是可以提供参数的。也就是说上面input里面的data-的参数都可以通过初始化来完成。如格式:

  1. $(".knob").knob({ 
  2.                 'width':150 
  3.                 ,'fgColor':"#009100" 
  4.                 ,'thickness':".1" 
  5.                 ,'angleOffset':"0" 
  6.                 }); 

这样子,其实input里面只要标识出class或者id以及value供使用就可以了。

5.关于演示页面中的skin的使用,奶牛看了下代码,是通过如下方式实现的。

  1. $('.knob').knob({draw : function () { 
  2.  
  3.                     // "tron" case 
  4.                     if(this.$.data('skin') == 'tron') { 
  5.  
  6.                         var a = this.angle(this.cv)  // Angle 
  7.                             , sa = this.startAngle          // Previous start angle 
  8.                             , sat = this.startAngle         // Start angle 
  9.                             , ea                            // Previous end angle 
  10.                             , eat = sat + a                 // End angle 
  11.                             , r = true
  12.  
  13.                         thisthis.g.lineWidth = this.lineWidth; 
  14.  
  15.                         this.o.cursor 
  16.                             && (sat = eat - 0.3) 
  17.                             && (eateat = eat + 0.3); 
  18.  
  19.                         if (this.o.displayPrevious) { 
  20.                             ea = this.startAngle + this.angle(this.value); 
  21.                             this.o.cursor 
  22.                                 && (sa = ea - 0.3) 
  23.                                 && (eaea = ea + 0.3); 
  24.                             this.g.beginPath(); 
  25.                             thisthis.g.strokeStyle = this.previousColor; 
  26.                             this.g.arc(this.xy, this.xy, this.radius - this.lineWidth, sa, ea, false); 
  27.                             this.g.stroke(); 
  28.                         } 
  29.  
  30.                         this.g.beginPath(); 
  31.                         this.g.strokeStyle = r ? this.o.fgColor : this.fgColor ; 
  32.                         this.g.arc(this.xy, this.xy, this.radius - this.lineWidth, sat, eat, false); 
  33.                         this.g.stroke(); 
  34.  
  35.                         this.g.lineWidth = 2
  36.                         this.g.beginPath(); 
  37.                         thisthis.g.strokeStyle = this.o.fgColor; 
  38.                         this.g.arc(this.xy, this.xy, this.radius - this.lineWidth + 1 + this.lineWidth * 2 / 3, 0, 2 * Math.PI, false); 
  39.                         this.g.stroke(); 
  40.  
  41.                         return false; 
  42.                     } 
  43.                 } 
  44.             }); 

这样子一个可行的绘图就出来了,下面说说怎么修改值:

  1. $('.change').change(function(){ 
  2.                 $('.knob').val($('.change').val()).trigger('change'); 
  3.             }) 

比如我们还有一个input的class为change,那么只要change以改变,就直接反馈到canvas绘图上了。更详细的api可以参考https://github.com/aterrien/jQuery-Knob。

小结

 

1.button

js监听一个button的click事件,preventDefault()无效,不一定是js没写对,而是button有没有定义type=“button”,在一个form表单中,button如果不定义的话,默认就做submit处理了,所以请求直接就发出去了,监听也没用。

2.hibernate查询分页

最简单的还是hibernate的query直接在querystring中进行限定,限定setFirstResult()和setMaxResults()。比如我们要从第11条记录开始查询,那么我们可以这样子写

  1. String queryString = "select m from Profile as m where m." 
  2.                     + propertyName1 + "= ? and m." + propertyName2 + "= ?"
  3.             Query queryObject = getSession().createQuery(queryString) 
  4.                     .setFirstResult(10).setMaxResults(10); 
  5.             queryObject.setParameter(0, value1); 
  6.             queryObject.setParameter(1, value2); 
  7.             List<?> s = (List<?>) queryObject.list(); 
  8.             return s; 

这样子返回一个查询结果的list,然后迭代出来就可以了,当然,这只是查询部分的,如果要写分页的话,还需要count()等来辅助进行。

3.jquery的.on()

如果我们直接用$(document).ready(function(){})来做的话,对于使用ajax调用产生的新的dom元素,用一般的.click()等事件监听是不会起到作用的,在老版本的jQuery中使用.live()可以来进行对未来元素和现有元素的监听工作,但是新版本的建议是使用.on()来进行处理,这样子新生成的元素也就自然而然的可以监听到了。

4.jquery的遍历

遍历的话jquery的方法真的很好用,特别是选择器,很方便,.parent()、.children()、.prev()、.next()用起来非常省事儿。

5.jquery的ajax

  1. var data = {"userid" : $('input[name="userid"]').val(), 
  2. "phonenum" : $('input[name="phonenum"]').val(), 
  3. "email" : $('input[name="email"]').val() 
  4. }; 
  5. $.post('profile-update', data, function(data, textStatus, jqXHR) { 
  6. if (jqXHR.success(function() { 
  7.     alert("success"); 
  8. }) 
  9. ); 

当然,也可以直接连缀上一个.success()来处理,可以看http://api.jquery.com/jQuery.post/

6.hibernate的casecade级联

对于一对多或者多对多的情况,如果删除主表中的记录,那么以主表的主键做外键的其它表就会产生错误,导致删除失败,需要设置hibernate的配置文件casecade为delete,这样子删除的时候就可以自动把这些也删除了,当然还有其它的选项,感兴趣的话可以直接查找casecade的相关内容。

TinyMCE多输入框手动激活解决方案

 

昨晚弄那个TinyMCE编辑器,对于单输入框的时候还是比较好处理的,直接自动生成实例就激活了,但是当一个页面有多个输入框的时候就变得很复杂了。比如有三个四个的输入框,默认生成实例激活的话会很难看很乱,我们的目标是当一个输入框onfocus状态的时候激活TinyMCE编辑器,激活另一个输入框onfocus状态的时候,已激活的TinyMCE编辑器关闭,并在新的输入框中显示编辑器。

对于已经初始化好的textarea我们可以通过如下调用textarea id的方法进行显示和关闭:

  1. tinyMCE.get('nenew').show(); 
  2. tinyMCE.get('nenew').hide(); 

但是如果直接在tinymce的tinymce.init()之后调用会发生error,因为tinymce的实例可能还并没有初始化完成,所以我们需要一个回调,TinyMCE的API还是很全面的,虽然昨晚用的那个API有点儿小麻烦,不过已经折腾成功,经验分享下。

This option should contain a function name to be executed each time a editor instance is initialized. The format of this function is: initInstance(inst) where inst is the editor instance object reference.

Example of usage of the init_instance_callback option:

  1. function myCustomInitInstance(inst) { 
  2.         alert("Editor: " + inst.editorId + " is now initialized."); 
  3. tinyMCE.init({ 
  4.         ... 
  5.         init_instance_callback : "myCustomInitInstance" 
  6. }); 

上面是init_instance_callback的回调接口,但是还是得仔细读读那段说明:“这个选项在每个编辑器实例初始化完成后都要执行一次,这个function的格式是function callback(inst),而这个inst就是刚刚初始化完成的实例。”

可能看到上面的话你会觉得有些绕,对于后半句的那个功能是针对实例初始化完成后调用的,这是我们所需要的,但是请注意,这个回调是在每个实例初始化完成后都执行的,换句话说,你有4个textarea这个callback就要执行四次,但是如果你在这个callback中执行了针对未初始化的实例的操作,就会发生错误导致js无法继续进行初始化。

针对我们上面所说的,我们的目的是在所有textarea实例初始化完成后执行对于实例的隐藏,所以如果我们有三个实例的话,我们只要在第三个实例初始化完成后执行一次就可以了。直接上代码:

  1. <form> 
  2. <textarea id="1"  
  3. onfocus="tinyMCE.get('1').show();tinyMCE.get('1').focus();tinyMCE.get('2').hide();tinyMCE.get('3').hide();"> 
  4. </textarea> 
  5. <textarea id="2"  
  6. onfocus="tinyMCE.get('2').show();tinyMCE.get('2').focus();tinyMCE.get('1').hide();tinyMCE.get('3').hide();"> 
  7. </textarea> 
  8. <textarea id="3"  
  9. onfocus="tinyMCE.get('3').show();tinyMCE.get('3').focus();tinyMCE.get('1').hide();tinyMCE.get('2').hide();"> 
  10. </textarea> 
  11. </from> 

这个是表单的形式,也就是在每次onfocus状态的时候tinymce的激活关闭与选中,下面是javascript的初始化

  1. <script src="editor/tinymce.min.js"></script> 
  2. <script type="text/javascript"> 
  3.     tinymce 
  4.             .init({ 
  5.                 selector : "textarea", 
  6.                 plugins : [ 
  7.                         "advlist autolink lists link image charmap print preview anchor", 
  8.                         "searchreplace visualblocks code fullscreen", 
  9.                         "insertdatetime media table contextmenu paste" ], 
  10.                 toolbar : "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image", 
  11.                 autosave_ask_before_unload : false, 
  12.                 max_height : 200, 
  13.                 min_height : 160, 
  14.                 height : 180, 
  15.                 init_instance_callback : "hidetinymce" 
  16.  
  17.             }); 
  18.     var i = 3
  19.     function hidetinymce(inst) { 
  20.         if (--i == 0) { 
  21.             try { 
  22.                 tinyMCE.get('1').hide(); 
  23.                 tinyMCE.get('2').hide(); 
  24.                 tinyMCE.get('3').hide(); 
  25.             } catch (error) { 
  26.  
  27.             } 
  28.         } 
  29.     } 
  30. </script> 

我们用一个变量i来做计数器,当实例3初始化完成后执行try内的内容,然后即可完成实例初始化完成后执行隐藏。

PS:tinymce的新版本还是蛮好看的,跟bootstrap的白色主题很搭,让人很喜欢。

关于XMLHttpRequest状态的讨论及处理方法

 

这两天把html5的Drag 、File API 和XMLHttpRequest Level 2的一些东西看了下,写了几个小demo,可以实现文件拖放进入浏览器,文件预览以及文件上传,打算过几天好好整理下,然后推到github上做个开源小项目。

今天主要是讨论下XMLHttpRequest的响应状态问题。我们知道,XMLHttpRequest的响应阶段有5个,分别是:

  1. 请求未初始化 
  2. 服务器连接已建立 
  3. 请求已接收 
  4. 请求处理中 
  5. 请求已完成,且响应已就绪 

我们是通过onreadystatechange来进行判断的,我们可以得到的状态只有4个。就是从服务器链接已建立到请求完成。昨天也搜索了下网络,对这个状态的分析并不是很多,奶牛自己测试了下,分享下。

首先,正常情况下,我们可以得到4个阶段的情况,一个成功的请求并得到响应的readyState及status如下:

  1. readyState:1   status:0 
  2. readyState:2   status:200 
  3. readyState:3   status:200 
  4. readyState:4   status:200 

也就是说,当请求到达“请求已接收”阶段的时候就已经反馈回来了http status,就是我们看到的200,这个是正常的状态。

我们来设想这样一种情景:我们请求交互的服务器与我们的网络并不连通,或者说目标服务器已经下线、服务器无响应,会是种什么状态呢?应该如何处理呢?这是不是响应超时呢?我们来测试下:

  1. readyState:1   status:0 
  2. POST http://127.0.0.1/upload 
  3. readyState:2   status:0 
  4. readyState:4   status:0 

通过结果我们可以看出,我们的请求已经发出,但是由于服务器对接收到的请求并没有应答,因此我们并没有得到服务器的响应状态,并且服务器的处理状态我们也不得而知,也就是为什么没有readyState3的原因,而在readyState4的阶段,我们得到的status是0,这也就是我们需要来处理的状态,即readyState == 4 && status == 0(xhr.readyState == 4 && xhr.status == 0),这个状态我们应该归结为error、abort、timeout还是其它呢?

奶牛把它分类到其它里面,处理方法在onreadystatechange里面处理。

  1. xhr.onreadystatechange = function() { 
  2.      console.log("readyState:"+xhr.readyState+"   status:"+xhr.status); 
  3.      if (xhr.readyState == 4 && xhr.status == 200) { 
  4.           console.log("Request successful!");}; 
  5.      if(xhr.readyState == 4 && xhr.status == 0){ 
  6.           console.log("No response from server!"); 
  7.      }; 
  8. }; 

对于服务器无应答无响应或者错误状态的处理方法都应放在onreadystatechange,http status有很多,可参考http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

在XMLHttpRequest Level 2里面有新增加一个timeout的设置及处理方法,超时是指request请求并没有在规定的时间内完成的一种情况,设置方法如下:

  1. xhr.timeout = 3000
  2. xhr.ontimeout = function(event){ 
  3.         alert('time out !'); 
  4.       } 

这样子,如果在3秒内交互未完成,则提示超时并终止,我们假设一种极端的情况,既在1ms内服务器未能完成请求,这种状态很容易得到,我们来看下反馈信息:

  1. readyState:1   status:0 
  2. POST http://127.0.0.1/upload 
  3. readyState:4   status:0 

当然,在非极端的情况下,也就是说在变化阶段2、3的时候如果超时,则readyState == 4的时候也有 status ==0 ,所以,我们可以把超时归结到readyState == 4 && status == 0(xhr.readyState == 4 && xhr.status == 0)的状态,但是并不能把readyState == 4 && status == 0(xhr.readyState == 4 && xhr.status == 0)的状态说是超时,因为超时是在服务器有反馈的时候才有效的,即在readyState ==2 时候status有具体响应值的时候,所以readyState == 4 && status == 0(xhr.readyState == 4 && xhr.status == 0)的状态是包含超时状态的。

而对于readyState == 4 && status == 0(xhr.readyState == 4 && xhr.status == 0)的状态可以用上文中的方法进行处理。

JavaScript forEach方法

 

最近看了一些html5和js方面的书,受益匪浅,因为看的东西比较多,却都没有怎么静心来做整理,慢慢来吧,可能最近自己有点儿小紧张。今天跟大家分享下JavaScript的forEach方法(其实是从《HTML5程序设计》这本书里看到的一种方法)。

首先说下JavaScript的forEach的标准格式。

为数组中的每个元素执行指定操作。

array1.forEach(callbackfn[, thisArg])

参数

定义

array1

必需。 一个数组对象。

callbackfn

必需。 一个接受最多三个参数的函数。 对于数组中的每个元素,forEach 都会调用 callbackfn 函数一次。

thisArg

可选。 可在 callbackfn 函数中为其引用 this 关键字的对象。 如果省略 thisArg,则 undefined 将用作 this 值。

如果 callbackfn 参数不是函数对象,则将引发 TypeError 异常。

对于数组中的每个元素,forEach 方法都会调用 callbackfn 函数一次(采用升序索引顺序)。 不为数组中缺少的元素调用该回调函数。

除了数组对象之外,forEach 方法可由具有 length 属性且具有已按数字编制索引的属性名的任何对象使用。

回调函数语法

回调函数的语法如下所示:

function callbackfn(value, index, array1)

可使用最多三个参数来声明回调函数。

回调函数的参数如下所示。

回调参数

定义

value

数组元素的值。

index

数组元素的数字索引。

array1

包含该元素的数组对象。

修改数组对象

forEach 方法不直接修改原始数组,但回调函数可能会修改它。

 

好吧,上面是从微软的http://technet.microsoft.com/zh-cn/ff679980%28v=vs.85%29页面copy过来的,有兴趣的直接去那里看就好了。也就是说一般方法的格式是:

arrayx.forEach(function(value,index,arrayy){…})

但对于NodeList要用下面的写法。

 [].forEach.call(lists,function(valule.index.arrayy){…})

Why can’t I use forEach or map on a NodeList?

NodeList are used very much like arrays and it would be tempting to use Array.prototype methods on them. This is, however, impossible.

JavaScript has an inheritance mechanism based on prototypes. Array instances inherit array methods (such as forEach or map) because their prototype chain looks like the following:

myArray --> Array.prototype --> Object.prototype --> null (the prototype chain of an object can be obtained by calling several times Object.getPrototypeOf)

forEach, map and the likes are own properties of the Array.prototype object.

Unlike arrays, NodeList prototype chain looks like the following:

myNodeList --> NodeList.prototype --> Object.prototype --> null

NodeList.prototype contains the item method, but none of the Array.prototype methods, so they cannot be used on NodeLists.

实例

  1. [].forEach.call(document.querySelectorAll('section[data-bucket]'), function(elem, i) { 
  2.   localStorage['bucket' + i] = elem.getAttribute('data-bucket'); 
  3. }); 

 

bootstrap的tooltip需要手动激活才会生效

 

我说怎么按照官方的代码写都不出效果呢,你妹,原来tooltip要手动激活的好不好,还有那个popover,需要tooltip跟手动激活。

下面来说说那个tooltip的使用,先引用下官方的原话:

  1. For performance reasons,  
  2. the tooltip and popover data-apis are opt in,  
  3. meaning you must initialize them yourself. 

翻译过来就是:出于性能原因的考虑,tooltip和popover的data-apis是可选的,这就意味着你必须手动初始化它们。好吧,手动就手动吧,让人好伤感的手动,而且也没有预留的可选api,就自己写了一个最简单的,js新手,能用就好了。

打开bootstrap.js,搜索tooltip,然后在tooltip的最后添加如下代码:

  1. /* TOOLTIP API 
  2.  * =================== */  
  3. $('a[data-toggle=tooltip]').mouseover(function() { 
  4.  $(this).tooltip('show'); 
  5.   }) 

然后使用方法是:

  1. <a href="#" data-toggle="tooltip" title="http://www.nenew.net">奶牛博客</a> 

在a标签中增加data-toggle=“tooltip”,title为描述,然后就可以看到tooltip的效果了。

PS:JQuery确实好用很多,比如依据tag的选择,而且代码更加简练,好吧,希望有时间可以细致的学习下,最近看了好多东西,脑子有点儿乱,实现一样是一样吧。

最近做的一些事儿

 

开学到现在是第四周了,不得不说,时间真得好快,我还没太缓过来。

最近奶牛挺充实的,经常去图书馆,从开学到现在已经啃了两本书了,都还不错的,跟大家分享下:一本是《JavaScript DOM编程艺术》,一本是《java web 开发与应用》,第一本比较出名,第二本是郭克华主编的,在豆瓣上竟然我是第一个评论的,好吧,但是那书还不错,可以让你对jsp有个基本了解,基本可以用。

因为毕业设计做一个在线管理系统,所以要学一些后台的东西,但是主要方向又是用户界面,好吧,啥都要学,最近打算看mysql的书,初步定《mysql cookbook》这本吧,图书馆没有,下了电子书,看标价120真的舍不得哇,现在的书好贵。

前端的bootstrap最近也在用,发现人家框架虽好,但是不可能完全用人家的框架哇,很多东西还是要自己做修改的,还有很多css要自己搞定,很多效果要自己写js实现,不过有个框架确实挺好的,因为很多东西自己设计出来毕竟感觉不如人家那个大方。

周五是开题,看样子好像只是走个过场,好吧,那就走个过场吧,不必太紧张,一周前开题报告就准备出来了,就呼呼啦啦说说就可以了应该,对于那个在线系统的技术实现,奶牛没有太大压力,虽然很多东西都要重新学,但是看到同组的一些人连开发环境还没配置起来呢,我也就放心了。(不许偷笑)

最近看电影少了,估计是春天还挺冷吧,最近手一直比较冷,大学就是一个摧残生命的地儿,好多生活习惯真的来到大学就又回去了。好吧,反正只有两三个月了,就这么过吧。

明天是个特别的日子:3月28日,不解释。

最近看开了很多东西,感觉自己还是踏踏实实的学技术吧,总是觉得自己的底子不够结实,有很多要学的。回想下大学,好像折腾了不少东西,能拿得出手的却寥寥无几。

现在生活挺充实,看书写代码,吃饭睡觉,cs go基本可以戒了,没有大屏幕,没有不掉线的网络,找什么枪感哇,毕业第一件事儿就是给自己弄个显示器。

好吧,就扯淡这些吧,最近用了下git hub,好吧,确实挺好用的,只是我真心写代码不多,不是毕设,估计奶牛用github都不会太多。有空把自己的github的东东整理下。

一些网络课程分享

 

1.Github开放了教学页面,可以申请学习。

教学页面地址:http://training.github.com/

2.Codecademy增加了一些教学内容,现在包括:

JavaScript:http://www.codecademy.com/tracks/javascript

Python:http://www.codecademy.com/tracks/python

Ruby:http://www.codecademy.com/tracks/ruby

Web Fundamentals:http://www.codecademy.com/tracks/web

JQuery:http://www.codecademy.com/tracks/jquery

呃,最近重新开始看Codecademy的JS课程,前几天看了一些DOM,现在终于对于JS的应用能有一些概念了,再重新看下。课程还都蛮好的,只是,呃,需要你英文水平过得去。好了,不多说了,各位自己看咯。