my blog my blog

Category: 建站心得
关于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的选择,而且代码更加简练,好吧,希望有时间可以细致的学习下,最近看了好多东西,脑子有点儿乱,实现一样是一样吧。

Bootstrap离线帮助文档下载

 

前几天大双评论说bootstrap很好用,看了两天,试了下twitter的这个web前端框架,果然灰常强大,很多东西直接套用代码就可以了,前端直接可以不用浪费太多时间去搭配css什么的了,当然,有能力的自己修改、配色什么的也当然是没问题的咯,反正css就放在那里,想怎么处置就怎么处置咯,还有一些js也包含在里面了,直接用就可以,省去我等js小白的麻烦。

今天发上来官方的帮助文档的离线文档,以后写东西就可以直接看离线文档了,不用开网页找了,页面跟bootstrap的页面完全一样的,因为是git clone回来的,嘎嘎~~~

打个小包发上来:

在线版本:http://twitter.github.com/bootstrap/

离线版本:点此下载

蛋疼的godaddy

 

好吧,说说俺曾经很喜欢的godaddy,现在各种贵+各种麻烦了。

先说续费,从前的买一个月空间可以1.99刀注册或续费的优惠没有了

正常购买,用7.99优惠码,竟然还要手动设置付款为US刀,在右下角,否则不显示支付宝付款。

估计以后transfer会成为一种热潮。

附赠godaddy的优惠码一枚,com7.99:iapdom799t

【底价¥100】域名拍卖:linuxman.me

 

RT,出自己去年买下的一个域名linuxman.me.

价格没打算要高,带价来就可以~

给我你觉得自己可以出的最高价格,如果合适域名就归你了。

如果你只是想拥有一个像奶牛博客这样子的博客,可以免费提供空间代购+博客搭建服务(前提你是linuxman.me的购买者)

联系方式可以微博私信,也可以Q奶牛

现在已经改成拍卖方式,底价¥100,谁要谁拿走。地址http://item.taobao.com/item.htm?id=18704511783

2013,我们要让自己充实起来

 

转眼转眼转眼,2013来了。

跨年是个辛苦的事儿,为了能轻松的度过那一天,你要煎熬365天,虽然偷懒神马的是必不可少的功课,但是真心学到些什么才是最重要的。眼看着大学的最后一节课上完了,最后一门考试考完了,之后就是最后的课程设计,还有最后的毕业设计,我知道,接下来很多东西其实都是个形式了,很舍不得过完这一年,但是,我们总要面对新生活不是。

————————-学校————————-

记得去年过春节的时候,看着春晚,聊着手机QQ还很不亦乐乎,跟兄弟们一起大聚了两次都很happy很畅快。之后就是大三的下学期了,是我学到最多东西的一个学期,也是大学中最充实的学期,功课也很努力,还自己买了个单片机的板子像模像样滴每天鼓捣下。有点儿感兴趣的东西学着总是很幸福的事儿,至少比起为了达到某种目的的学习要来得轻松,所以我一直是觉得兴趣最重要,因为它会让你有主动性,而非被动无奈滴学习接受。

下半年就是这个快过完的大四上学期,就两门课,一门学了,一门没怎么学,不过最后突击的时候还是了解了很多东西,因为对硬件的兴趣不大,对软件的兴趣也不大,所以,o(︶︿︶)o 唉,不扯淡了,过了就好。感觉自己学东西总是太松散,什么都没有太深入,其实感觉深入下linux系统应该挺有搞头的,特别是那么强大的定制型,搞个神马自动控制家庭各种设备的东东应该会拽,但是,说实话,有些浮躁了。估计是最近两个月干的活让人比较蛋疼吧,没有时间干自己想干的事儿,不过总算熬过来了,现在一身轻松,可以想做些什么就做些什么了。嘎嘎~~~

————————-感情————————-

感情上不是太顺利,年初的时候矛盾就开始有了各种苗头,然后,果然,半年之后分手了,到现在我也很难释怀,很难走出来,总觉得一切都还在昨天,只是,我们需要一些时间把各自的坐标确定下,然后,一切就又都会正常一样。也不晓得之后之后之后会是什么样子。我耐心等着,还在这里,只等你累了回头看。

————————-朋友————————-

身边的朋友真的越来越少了,个人都有个人的忙,还是宿舍好一些,至少有人陪下会让人不那么寂寞。现在只有Raya每天陪着自己说话,挺感谢她滴,难得有很多共同的爱好,心里开心或者不开心都会互相吐槽互相安慰,写着一头奶牛跟一只猫的故事。

同学呢,虽然在一起的时候有时候觉得某某人会很傻x某某人做事儿很磨叽某某人各种不讲理,但是呢,他们都出去了,还真挺想他们的,也许就是那些傻乎乎磨磨唧唧不讲理才是生活的乐趣。没了还就真的会想念。估计明年这个时候就只剩下怀念了。

————————-目标————————-

1.工作

2.出去走走

3.开始学怎么玩儿跟生活(发现我是个极其不会娱乐的人,而且生活一团糟)

4…….待续

圣诞快乐

 

Merry Christmas Guys.

世界末日已过,那些该珍惜的是不是已经在你心中更加明确了,那些该忘却的是否真的已经淡出你的生活,重生下总是好的,至少在心理上我觉得我们都应该更坦然一些了。

时光荏苒,马上就2013了,马上就要毕业了,2012年奶牛收获很多,奶牛也失去很多,我不想自己明年仍旧这么无法自拔滴度日。

工作吧,让自己踏实下来,现在最最希望的就是有稳定的生活,仿佛一年老了很多呢,不再那么想着想那的了,只觉得稳定些比什么都好。

看着自己瘦的时候还是蛮好滴,现在胖到自己都不想看自己了,讨厌讨厌,明年一定要瘦下来才行。减掉三十斤俺就知足了。

平安夜,木有苹果,吃个橘子凑合下了~~~

关于锚链接跟页面分页

 

很多东西总是用,总是忘,让人很无奈。锚链接的东西自己至少已经查过三次了,还是老忘,继续记录。

锚链接比较常见的应用就是在页面内上下的切换,比如你的回到顶部/底部功能,页面内链接跳转,都可以用锚链接来做。具体实现方法是:

1.建立锚点

锚点就是你链接想到达的目的地,建立方法是定义一个id给<a></a>,比如回到顶部的话,我们需要在最顶部放置一个锚点。

  1. <a id=top>Homepage</a> 

2.建立锚链接

锚点有了,直接把链接挂过去,就是直接引用锚点的id

  1. <a href="#top">back to top</a> 

搞定。

下面说说页面分页,这里是指打印时候的一个分页,页面上看不出来,实际是一个css的属性。可以在<>中直接引用或者自己定义page-break-before的css。

  1. style="page-break-before:always" 

 

感恩节

 

话说对洋节呢也一直没有太大的兴趣,就连生日神马的奶牛也不是太重视,不过这个感恩节呢还是有些意思的,至少我们应该在这个时候适当滴表达下自己的感恩之情。

首先感谢博客跟微博的朋友们这几年来对奶牛的支持,虽然最近更新缓慢没什么内容,但是博客还是会继续开下去滴,优质原创文章也会持续更新。

回首大学四年,特别想感谢下身边的一些朋友,毕业的几位学长,同届社团的与非社团的一些朋友,虽然交流一直不是太多,但是感觉能碰到一些志同道合的人就很好了。

感谢那些让我成长、成熟的人,可能明天擦肩既是路人,又怎样,依旧很感谢你们曾经的陪伴与真心的付出,对与错都不那么重要了。

感谢自己的亲人对自己的支持,虽然有时候我很希望可以自己去选择一些,但是大多数时候你们都帮我选择完毕。

Thanks for all the people who helped and encouraged me and best wishes for all of you.