页面伪装异步加载中...
返回首页 mail me! 订阅rss Follow me

Archive for 编程思考

Javascript复制JSON数据

复制数据很简单。

var a = jsonobj;

简单的就将jsonobj的值复制到了变量a中,但如果jsonobj是个json数据的话,你会发现修改a的值时,jsonobj也会跟着改变。

如果你对javascript中的prototype那套机制比较了解的话可能就会大概明白是怎么回事,是的,因为json其实也是个object,所以var a = jsonobj 赋值时,中间有个原型链会将两个关联起来。

要达到想要的复制数据也很简单:

var a = JSON.parse(JSON.stringify(jsonobj));

将json序列化为string再还原成json,因为中间产生了新的对象,所以两者不再关联。

这种写法看起来很不科学,但应该是比较好的办法了。

关于win8 metro版的Quick Note

随着US时间1月8号M$第一波参赛程序的提交截止,Quick Note for Win8的开发也算是告一段落,中间因为一些各种准备不充分问题,虽然这次提交的版本还没达到最完美的我想要的最完美的状态,但总算顺利的完成任务。

这之间有很多波折,从最早的win8 developer preview发布时,我曾第一时间在我的笔记本上直接硬盘安装win8,大概的了解了metro界面和以前传统desktop的区别,并简单的从visual studio 11 preview中创建了一个split的javascript metro项目,build,整个过程很顺利,简单的浏览了项目文件的组成,当时评估是基于web的APP很好移植,甚至你可以简单的理解成使用javascript build的metro程序其实就是封装了一个全屏的IE10而已(现在开来,这句话理解也确实没有错)。

凭着这个了解,粗略的评估了quick note应该是比较容易移植到win8 metro下,而因为preview中的win8 app store并没有开放,当时得到的消息是今年的2月份开放,所以这事情搁置了一旁,然后投入到另一个项目的开发中。

然后上个月下旬的时候得到一个消息说,M$在5个国家地区(不包括CN)有个第一波提交metro app的评选,将会出现在win8 beta版本的store中预置,这是个绝好的先机,所以迅速将重心转移到这边。

首先要思考的第一个问题是quick note数据的存放问题,因为考虑之前偶尔会有用户抱quick note chrome版本数据丢失的问题,所以这次想找个比较稳妥的数据储存模式,在了解懂啊winRT并没有提供SQL的数据库支持,并在一些第三方的选择比如winrtsql等,最后还是选择了使用html5中的indexdb,第一,这是metro中唯一有文档的数据库级别的储存,第二,之前在firefox中的quick note也是使用indexdb储存,移植应该会很顺利。

然后是文件的迁移,并解决一些列bug,以及一些IE10的兼容问题,以及一些metro app的一些特殊兼容问题,比如不允许直接使用innerHTML之类的方法(当然也包括jquery的.html()方法),debug,竟然出奇的顺利,两天时间就能把chrome的quick note移植到win8中,并还有和diigo的云同步功能。

事情转变在某天晚上看了win8 build大会的视频后,重新认识了metro UI的设计。

因比赛的评分使用metro UI的分值比重是50%,看了视频后,直接推翻直接准备在基于split view的模板上重新设计quick note。

和UI nancy简单的讨论后,然后开始迅速的搭建HTML结构原型。

并尽量的去使用metro winJS中提供的UI,比如app bar ,setting ,listview之类的东西。

后来又添加上了系统层的share,search之类的东西。

因为时间问题,中间取舍了很多,最后提交的版本中,里面有个indexdb的小bug也未来得及解决,只是用了一些hack的办法去处理(关于什么bug,和firefox中indexdb的区别,我后面会专门开文章介绍)。

虽然赶在了截止之前提交了程序,但是是否能入围,只能祈祷。我自己做出来的东西,我只能打70分,如果给我更充裕的时间,我能研究透win8的API,应该能把quick note做的更完善。

祈祷能入围吧。

javascript 处理二进制流

在javascript中,二进制流一般是一个[object ArrayBuffer]的对象,一般的javascript方法是没法处理这个object的。

要处理它,我们需要用Uint8Array将它转换成一个8位的整形数组。

当然,如果你需要,你还能将它还原成string

1
2
3
4
5
6
7
8
// t is a arraybuffer
 
var uInt8Array = new Uint8Array(t);
//转换为二进制数组 例如 var byte3 = uInt8Array[4]
 
for(i=0;i<uInt8Array.length;i++){
  d+=String.fromCharCode(uInt8Array[i])
}

CSS3最新中文手册

来自其他网站的,这个比较全:

http://css.doyoe.com/

JS 获取浏览器版本

在写JS时,很多情况我们需要知道浏览器的版本来做一些工作。

javascript获取浏览器版本方法:

1
2
3
4
5
6
7
8
//获取浏览器名
navigator.appName    // Microsoft Internet Explorer / Netscape 等等
 
//针对IE 获取详细浏览器版本
navigator.appVersion.split(";")[1]   // MSIE 8.0 / 7.0 /6.0
 
//其他获得浏览器详细版本
navigator.appVersion

在chrome/firefox中,navigator 这个全局对象还提供了更多的关于客户端的信息,有兴趣可以console一下或者each一下。

Page 1 of 111234567...Last »