I am MT.

最近心情较沉重,说了些谎话,真话和不该说的话,也为这些话付出代价。

算是学习了,在这个心计和手段各异的年代,单纯的谎话,信任间的真话以及想当然不会有问题的不该说出来的话都是像风中的云彩一样被越吹越大,慢慢变形,以及于成为另一个东西。最后,你也需要为这些事情负责,只要是你生成的,毕竟是要落在你的身上的。

先思考,再说话。

没有任何理由,不能说谎。

相互间再信任,该藏着的就不要让它见光。

那些会有影响的,不能想当然地说出来,就算你有100%的把握没有影响也决不允许。

 

2012年4月6日,以此为证,不做 “大嘴巴”。

 

IE下微软雅黑的引起的问题

今天在项目中遇到一个诡异的问题,我的IE6下标题与订阅按钮是对齐的,可是QA测试的时候发现在他的IE6下没对齐。一直在找原因,加了各种hack,可是问题依然是两边出现样式还是不能一致。

后来仔细地看,发现两边的字体不一致。后来全部改为“宋体”,并把前面加的各种hack去除掉,发现能够对齐,并用各浏览器保持一致。

写了纯净的页面去测试,发现一些问题,记录一下:
所有浏览器:
微软雅黑同样大小的字会比宋体高,粗,而且“padding”较大,设置了line-height后更明显。
IE下:
设置容器的vertical-align:baseline;若一个容器中两个字体不一样时,微软雅黑会下部不会跟其它字体的文字对齐,会多出一块。

总结:
字体不一致引起的各浏览器下的展现问题还是要引起注意,不然到时去追问题的时候,发现加了各种hack其实都是白忙活。而且还增加了维护成本。

删除表单元素的问题

chrome,firefox 下使用 removeChild删除表单元素或者直接给表单元素赋值null,甚至delete 表单元素,form 仍然保存着该元素的引用,无法删除。

先看下这段代码吧:

//给form添加一个元素

function add(){

	var inp = document.createElement('input');
	var form = document.getElementById('testform');
	inp.type='hidden';
	inp.value='test';
	inp.name='test';
	form.appendChild(inp);
}

//删除添加的表单元素

function del(){

	var form = document.getElementById('testform');
	var inp = form.test;
	//输出inp
	console.log(inp);
	if(inp){
		form.removeChild(inp);
		form.test=null;//(或delete form.test 或者 form.test=undefined)
		console.log(inp)
	}

}
//添加元素
add();
//删除
del();
//再删除
//预期:因为不存在form.test,应该不会做任何操作
del();

添加表单元素后,执行del删除添加的表单元素,第一次是能够删除的,但是再执行的时候报错了:

testFormDel.html:25  Uncaught Error: NOT_FOUND_ERR: DOM Exception 8

第二次删除的时候做了判断是否存在form.test,预期第一次删除时并把这个值删除或者赋值为null了,应该是不存在的,但是chrome,firefox 都抛出了错误,removeChild后打印form.test仍然有输出,说明这个值并没有被删除。

使用了form.test = undefined或者delete form.test甚至form.test.removeNode(true)皆不能删除form.test的引用(最后无奈地使用document.getElementById(…)来判断是否存在这个表单元素)。

今天在项目中发现了这个问题,调了很长时间,一直不知道是啥原因,而且虽然这个form.test一直存在,但是在提交表单的时候却不会带上。

在各种搜索引擎查找原因,只在mozilla的bug平台找到了别人提的类似的bug(https://bugzilla.mozilla.org/show_bug.cgi?id=307415),而且这个bug05年就被提出来了,却没找到为啥浏览器要如此做。

 

技术回归与总结:本地存储

本地存储现在已经到处都在使用,各个视频网站的观看历史,编辑器的自动保存。

目前主要的本地存储方式有:

localStorage:chrome、firefox、safari、IE9、IE8支持

localStorage支持较大容量的数据存储,chrome、firefox、safari、IE9、IE8原生支持,易用;但是安全性较差(所以请勿使用localStorage保存敏感信息);

Flash使用Flash SharedObject来存储,不存在兼容性问题,可跨浏览器,需要flash环境,且需要页面加载一个flash文件。

User Data: <=IE6支持

由于对flash基本没有涉及过,所以对于这一块也一直没有去实现过。主要回归一下localStorage与UserData吧。

说说两者的共同点:

1,都是以key-value方法存储数据的,提供的接口分别如下:

localStorage:

getItem(key):获取指定key本地存储的值

setItem(key,value):将value存储到key字段

removeItem(key)::删除指定key本地存储的值

localStorage同时提供了一个storage事件,在存储的值改变后触发。

使用localStorage在原生的浏览器环境中直接使用localStotage这些接口即可。

userData: 

setAttribute(attr,value):设置指定的属性attr的值为value

getAttribute(attr):  获取指定的属性attr值

removeAttribute(attr):移除对象的指定属性attr

load(userDataObj):从 userData 存储区载入存储的对象数据

save(userDataObj):将对象数据存储到一个 userData 存储区

继续阅读

纯洁的更新

很久没有更新了,今天换了个皮肤(还没换完,先这样吧,周末再继续。嘿嘿)。纯更新下博客吧,让世界知道我还没有挂掉,一直想写点东西来着,一打开就不知道该啥。上张前段时间拍的照片,闪人。