Life Need More COLOR :)

HTML5本地存储初探(三)0

完成了数据的本地存储,就要将文件存储也搞定。为了实现文件的本地存储,html5搞了一个叫 manifest 的文件,这个文件就是一个缓存清单,把需要缓存在客户端的文件告诉浏览器。manifest是一个mimetype为 text/cache-manifest 的 纯文本文件。注意,这点很重要。

下面是一个manifest文件的例子:

manifest

NETWORK, CACHE, FALLBACK 都是可选的。

manifest文件必须以 CACHE MANIFEST 开头

其后需要下载并缓存的文件使用相对或绝对路径皆可,每个资源一行。

NETWORK段表明一些在线资源所在的域,所有这个域下的资源都不会被缓存,即使客户端处于离线状态,也会尝试去请求基于这些域的资源。

CACHE段还不是很明白

FALLBACK段下面每行都包含两部分内容,用空格分隔。后半部分是当前半部分路径不能访问时的备选路径(很拗),如上图就是,如果demoimages目录不能访问时,尝试访问images目录。

manifest文件介绍就到这里,下面创建我们自己的manifest文件:

我们只需要缓存两个文件即可,nbStyle.css 和 nbScript.js。还有index.html 本身,由于manifest文件会默认缓存引用自己的文件,所以index.html 不能在缓存列表中写出来:

CACHE MANIFEST
# version: 2010-01-20 22:30

nbStyle.css
nbScript.js

就是这么简单了,我们将他保存为 notebook.manifest 文件,并和其它文件一起放在根目录。

最后一个问题,如果将notebook.manifest的mimetype标识为 text/cache-manifest 类型呢?我知道有两种方法:

1. 在站点根目录建立 .htaccess 文件,在其中声明.manifest 的mimetype ,这个需要修改下服务器的配置文件,我没有尝试成功。

2. php环境在apache目录寻找一个为 “mime.types” 的配置文件,在其最后添加一行:

text/cache-manifest            manifest

然后在index.html文件引用它:
引用manifest
搞定了这些东西,你就可以尝试用webkit访问你的应用,然后离线,再尝试使用它,程序应该也可以照常运行。

至此,html5的离线存储基本介绍完了,下面附上打包的代码,代码本身没有什么难度,只是我写的太烂了:

代码下载

其实还远没有完,缓存下来的文件如果被更新了怎么办呢?如何通知客户端更新缓存其实也有api,慢慢的再探索吧。非常期待与大家探讨html5相关的问题。

HTML5本地存储初探(二)0

完成了UI,我们就需要对数据进行处理了。

在开始“数据”的本地存储之前,我们先来了解一下client-side database storage API:

the client-side database storage API allows web applications to store structured data locally using a medium many web developers are already familiar with – SQL.--webkit blog

目前只有webkit核心的浏览器支持这一特性。你甚至都不能在w3c的html5工作草案中找到 (cs-db)client-side database 的详细描述。

首先我们要尝试建立一个数据库链接:

try {
	if(!window.openDatabase){  //检测浏览器是否支持cs-db
		alert('not supported cs-db!');
	} else {
		var shortName = 'noteDB';
		var version = '1.0';
		var displayName = 'Note book database';
		var maxSize = 65536;
                //创建一个数据库
		var db = openDatabase(shortName,version,displayName,maxSize);
	}
} catch(e){  //尝试捕获错误
	if (e == 2){
		alert('Invalid database version.');
	} else {
		alert("Unknown error "+e+".");
	}
}

如果以上代码无误,你就会在safair或者chrome的开发者工具中看到这个数据库:

创建的数据库

在右侧区域可以直接执行一些sql查询,但是我总是得到 “发生意外错误“0”。” 这样的结果,不知道是不是RP的问题。

接下来就是创建表,以及执行一些sql语句进行增删改查。

js执行sql的基本语法大致是这样的:

db.transaction(
	function (transaction){
		transaction.executeSql(sqlquery,[],dataHandler, errorHandler);
	}
);

其中transaction.executeSql中参数依次为:sql查询字符串,传递给sql查询的参数,数据处理句柄,错误处理句柄。其中只有第一项为必选,其余都为可选项。

第二个参数的用法大致是这样的:

transaction.executeSql("UPDATE people set age=? where name=?;",[ age, name ]);

查询字符串中的“ ?” 会被后面数组中的变量依次替换。

注意:以上我用了“大致”这个词,因为没有官方的文档W3C-web database),只是从一些其它文献以及自己判断得来,若有错误还请指正。

下面我们创建一张用来存储note的表:

db.transaction(
	function (transaction){
		transaction.executeSql(
                'CREATE TABLE IF NOT EXISTS notes (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,titel TEXT, note TEXT NOT NULL, date DATE);',errorHandler);
	}
);

errorHandler是这样的:

function errorHandler(transaction, error){
	alert('Error was: '+ error.message +'(Code:'+ error.code +')');

	var fatal_error = true;
	if(fatal_error){
		return true;
	}
	return false;
}

error.message 是一段错误描述,error.code 是错误代码 (详情)

再看看如果从db中检索出数据并显示到页面上:

db.transaction(
	function (transaction){
		transaction.executeSql("SELECT * from notes;",[],dataHandler, errorHandler);
	}
);

function dataHandler(transaction, results){
	var string = "";
	for (var i = 0; i" + row['titel'] + "

";
	}
	var listConts = $('listCont');
	listConts.innerHTML = string;
}

可以看出,基本上和php之类后端语言操作大同小异。
更多代码可查看示例程序,不再一一罗列。

搞定了数据的本地存储之后,接下来就要看看如何将文件储存到本地。

HTML5本地存储初探(一)2

html5带给我们的不仅仅是更多语义丰富的标签,还有更多更牛逼的特性,比如“离线存储”。 对于台式电脑来说,或者它并没有带来什么惊喜,但是对于移动设备来说离线存储简直就是一个神迹。对于任何拥有支持离线存储浏览器的移动设备,比如iphone,ipod touch,离线存储使得web前端工程师可以很容易的针对它们开发应用程序。

前面吹嘘了一段,不过说实在的,html5本地存储就目前来说还是很受限的。其一,浏览器限制,目前只有 Safari 3.1 and later, and in iPhone OS 2.0 and later. 提供了javascript database 原生支持,不过也有 Taffy DB 可以曲线救国。(还没有用过,不敢妄下结论。)。 其二,服务器端需要修改配置,旦如果是自己的服务器就很简单了。

下面就以一个简单的offline web app-note book 为例,记录一下为iphone/ipod touch开发web app的过程。不是经验,只是初探。

  1. 建立适合 iphone/ipod touch 的UI
  2. 数据的本地存储
  3. 文件的本地存储
  4. 完善这个app (不打算完善它了,有时间做一个实用的app专门介绍 iphone web app 的开发吧)

首先,适合iphone/ipod touch 的UI 它并不是本文的重点,有兴趣的同学可以移步这里 。这里只强调一点:你默认做的页面,放到iphone看会变的很窄,字很小。这是因为iphone用它320px宽的屏幕显示了一个默认980px宽的页面,你的内容被按比例缩小了。要解决这个问题很简单,只要在html的head区域加一个meta标记,具体语法请看这里 。 也就是这样:

viewport

这个问题解决之后我们就可以肆意的使用html5和css3来打造界面了,(针对设备开发可以不考虑兼容性,真是畅快淋漓呀。)

我大概做了个丑陋的界面:

app UI

html代码CSS代码 (其实你可以不用看,最后有打包的代码)

这篇先到这里,太长了你看着累我写着也累,咱慢慢来。:)

Asaph-私人的网络菜篮子2

首先感谢何必呢共享他的delicious给我,里面确实有不少好东西,Asaph就是其中一个。说白了他就是一个网络资源收集器。可以把喜欢的图片,文字,网站以“碎片”的形式储存到一个个人微博,作为自己的资源库备用。
Asaph的官方网站在这里:http://www.phoboslab.org/projects/asaph 。 这个是作者的演示站点:http://www.phoboslab.org/projects/asaph
使用很简单:

  • 下载Asaph程序
  • 修改lib/asaph_config.class.php 里面的 $domain,$absolutePath 以及 $db 变量。
  • 将这个目录上传至自己的php空间,并建立数据库。(需要将data目录权限改为777)
  • 访问admin/install.php进行安装并设置用户名密码。
  • 完成后访问 admin/ 目录,在界面左下角有一个“ASAPH”的Bookmarklet,将其拖放至你的收藏栏。
  • All Done 以后见到想收藏的内容就点收藏栏上的ASAPH书签,然后点选你感兴趣的内容部分就发布到你自己的ASAPH网站了。

ASAPH的网站有段视频,看看就明白了。
Bookmarklet是个很不错的工具,完全可以用它来做一些浏览器小插件。

2010, Do More!2


 

201020102010201020102010

RLOG

2010201020102010201020

  • Do More!
  • Do Better!
  • Think Deeper!
  • Think Farther!

 

第三期web标准化交流会杂感6

会上气氛相当不错,但唯一不足我们后来FB时提到,同学们做自我介绍时须加上“单身否”一项。

关于DTD我有一疑问没来得及问,为什么html5取消了dtd声明?也就是说w3c觉得dtd并不是那么重要的东西?

关于验证,我很同意greengnn,因为验证可以提供一条基线,使大家有最起码的标准可依。关于语义化其实有很多同学还是存疑的,它在目前来看存在的意义到底是什么?我觉得还是会后winter的解释很有说服力:我们先撇开对机器友好不谈。对于开发者来说任何编程语言都需要语义的,如果你一个页面全用div,那么后期维护,或者别人接手你的项目时,有什么样的感觉呢?很难找到哪里是哪里,就好比其它开发语言中使用无语义的变量一样让人恼火。试试读一段变量混淆过的js,你就知道了。读一段无语义的html就好像读一篇没有标点的文章,多郁闷。

微格式,可能大家觉得平时用到的比较少,就没有太重视,我觉得语义化标签与微格式是相互补充的。或者可以说,微格式是对html语义的一个扩充。微格式可用使得你的html代码可以被更多设备识别并使用。《精通HTML》第5,6章有详细的描述,推荐大家读读。其实如果用同学用过IE8的网页剪辑功能,其实那段代码就是一种可被IE8识别的微格式子类,还有qq空间首页上也使用了微格式,你可用尝试使用ff的插件Operator 将这些vCard微格式导出为hCard,供outlook之类的通讯软件使用。tommy有两篇文章可看看。aoao的blog也有不少微格式相关的文章。

最后,一点建议:可能是讨论的点有点多,所以很难深入进去讨论。希望下次能围绕一两个,或者两三个问题深入的探讨一下。

很遗憾没有时间进行html5和css3的讨论,希望下次有机会和大家一起再聚。

HTTP Headers 入门17

非常感谢 @ytzong 同学在twitter上推荐这篇文章,原文在此

本文系统的对HTTP Headers进行了简明易懂的阐述,我仅稍作笔记。

什么是HTTP Headers

HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比如这篇文章。

HTTP Headers是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。


More »

We are Catalysts4

Mozilla Labs

看标题你或许一头雾水,这篇其实是关于Mozilla Labs的“枪文” (如果Mozilla愿意付钱给我的话)Mozilla Labs的几款新应用让人激动不已。如果说互联网改变了我们的生活方式,那么Mozilla作为这种改变的催化剂当之无愧。来看看几款神奇的应用吧:
More »

漫画:混乱的标记语言XHTML2/HTML512

转自:Yes! B/S !

点击下方图片或者混乱的标记语言漫画链接,可以打开更大、更清晰的大图。

混乱的标记语言漫画
混乱的标记语言XHTML2/HTML5漫画

漫画中提到两个链接地址:

jQuery入门之–属性(一)1

Closure我来讲解属性部分, 这是相当有用的, 可要认真上课.

首先,jquery中对html标签属性进行操作的关键词是 attr .没错,就4个字母, 不要告诉我你记不住.

用法一: $(选择器).attr(属性名) 它的作用就是获取指定元素( $(选择器)部分 )的指定属性的值. 看例子:

有这样一段html:

<img src=“http://t.douban.com/lpic/s3791510.jpg” alt=“变形金刚海报” width=“500″ height=“300″ />

那么你要获取到图片的地址该怎么办呢? 这样: $(“img”).attr(“src”) 就这么简单, 你用alert或者其它形式输出一下就看到图片的地址了. 那么我要取得图片的描述呢? 这样: $(“img”).attr(“alt”) .够简单吧. 它不但可以取到html本身有的属性, 而且也能取到你自己定义的属性, 比如上例中的 funny属性, 自己试试能不能获取到它的值. 注意: 如果你要获取的属性是不存在的, 那么jquery就会返回一个 undefined .

用法二: $(选择器).attr(属性名, 属性值) 它的作用是为所有匹配的元素设置一个属性值。

假如页面中有一堆这样的html:

<img /><img />

我们写一句这样的jquery代码: $(“img”).attr(“src”,”http://t.douban.com/lpic/s3791510.jpg”) 这样上面一堆无意义的img标签就变成了:

<img src=“http://t.douban.com/lpic/s3791510.jpg” /><img src=“http://t.douban.com/lpic/s3791510.jpg” />

很容易理解吧. 假如我们想给图片设置高度,那么只要 $(“img”).attr(“height”,”300″) . 再要设置宽度就这样: $(“img”).attr(“width”,”500″) . 如此看来是没有什么问题, 但是当要设置多个属性时, 一个一个的这样写真是太麻烦了, 那么我们来看第三个用法.

用法三: $(选择器).attr(Map) 它的意思就是给指定元素设置多个属性值, 我们重点看一下 Map 是什么意思. 它其实是这样一种序列:

{属性名一: “属性值一” , 属性名二: “属性值二” , }

那么我要实现用法二中的例子只要这样写:

$(“img”).attr({src:“http://t.douban.com/lpic/s3791510.jpg” , height: “300″ , width : “500″})

以上我们学会了获取属性值, 设置属性值, 那么怎么删除属性呢?

jquery中删除属性的关键词是: removeAttr 注意A是大写的. 看看怎么用的:

同样是用法一中的html代码, 我想删掉图片的高度属性, 那么就这样:

$(“img”). removeAttr(“height”);

嗯,就这么简单. 聪明的同学一定看出了, attr 其实就是原生js中 getAttribute 的简化实现, 而removeAttr 就是 removeAttribute 的简写了.

今天就到这里, 下节我们玩玩class 属性, 因为class和css有密不可分的关系, 我们就可以利用它做一些好玩的东西.