自定义样式的radio控件

先看效果

image

 

在有些地方默认的radio效果已经不能满足很多交互需求

 

image

 

如果抛弃默认的radio控件又会丢失很多重要的属性,比如后退或者F5之后表单信息的存储.

 

利用label与input的对应关系,把radio隐藏,显示label标签

 

然后根据name属性利用js对表单分组处理

 

原理就是这样的

 

html代码:

CSS部分:

.form .tb-radio {
	display: none;
	width: 0;
	height: 0;
	margin: 0;
	padding: 0;
	position: absolute;
}
.form .tb-radio-label {
	line-height: 26px;
	height: 26px;
	border: 1px solid #ddd;
	display: inline-block;
	padding: 1px 17px;
	outline: none;
	cursor: pointer;
	margin-top: 15px;
}
.form .tb-radio-label.crt,
.form .tb-radio-label:hover,
.form .tb-radio-label.hover,
.form .tb-radio-label:focus {
	border: 2px solid #ff6600;
	line-height: 26px;
	*line-height: 27px;
	_line-height: 26px;
	height: 26px;
	padding: 0 16px;
	background-color: #eaeaea;
	outline: none;
}
.form .tb-radio-label.crt {
	background: url(images/sprites.png) no-repeat 100% -702px;
	background-color: #eaeaea;
}

JS部分:

			KISSY.ready(function(S){
				//代码开始
				var DOM = S.DOM,
					Event = S.Event;
				var TBRadioLabels = S.query('.J_Radio');
				//从checked状态中读取选择情况
				S.each(TBRadioLabels,function(i){
					var t_radio = getInputByLabel(i);
					if(t_radio.checked){
						DOM.addClass(i,'crt');
					}
				});

				//点击或者回车触发选择
				Event.on(TBRadioLabels,'click keydown',function(ev){
					if(!S.isUndefined(ev.keyCode) && ev.keyCode != 13 && ev.keyCode != 0) return ;
					var radioGroup = DOM.attr(getInputByLabel(ev.currentTarget),'name');
					S.each(TBRadioLabels,function(i){
						if(DOM.attr(getInputByLabel(i),'name') === radioGroup){
							DOM.removeClass(i,'crt');
						}
					});
					getInputByLabel(ev.currentTarget).checked = true;
					DOM.addClass(ev.currentTarget,'crt');
				});
			//通过label获取对应的input
			function getInputByLabel(label){
				var inputId = '#'+DOM.attr(label,'for');
				return S.get(inputId);
			}

		});

附上demo:http://lansepink.appspot.com/media/aglsYW5zZXBpbmtyDQsSBU1lZGlhGJqJJAw/radio.htm

一种基于P2P的web服务器模型

云是有一个个的细微颗粒组成的,每个颗粒虽然是微小的,但是它们组合起来却可以遮天蔽日,具有强大的能力。

最近bitcoin的出现让我觉得基于p2p的web服务器应该也是可以实现的吧。以下是我个人的一些想法。

实现的效果

· 用户在安装客户端程序之后会自动与其他网络节点之间取得联系,获取一些必要的信息(这些信息待定)

· 用户在浏览器中输入127.0.0.1或者localhost即可访问这个基于p2p的网络服务器。(当然可以不使用80端口)

· 这个web服务器是一个平台,用户可以在上面创建自己的网站,比如搭建wordpress等等,使用的人越多该用户的网站获取的资源就越多。极端情况是如果这个人的服务只有他一个人使用那么他的数据不会扩散到P2P网络。

首先一个应用需要两个基本的东西

A、 存储空间

B、 运算资源(CPU资源)

clip_image001
每个用户就是一个网络节点,这点与P2P网络没有区别。(为了鼓励节点用户分享足够的资源,可以采用积分制度,甚至与bitcoin绑定。)

其次解决与传统服务器不同的结构

A、 传统服务器控制权在网站站长手里,可以防止数据被恶意篡改,但是现在所有的数据要分布存储在不同的计算机物理存储设备中,怎样防止错误的信息扩散到P2P网络中。
我想到的是基本原则是让信息PK,假设正确的信息序列是ABCDEFG,而有人攻击网络将一部分节点的信息改为ABBDEFG了。

clip_image002
PK之后

clip_image003
只要错误的信息少于正确的冗余数量就可以消灭错误的信息。

B、 数据存储的连续性,在传统硬盘上面文件存储的结构改变了,需要定义一种新的文件系统File System。用于解决数据查询。
(在这里可以解决文件缓存问题,比如web上面一些常用的静态文件可以直接存在用户节点,且竟可能少的存放用户不需要的资源。

C、 CPU资源的分散,需要网络自动将一些运算分解开,发布给节点CPU运算。

最后

还有很多一些细节的想法,但是自己对计算机底层不是很了解,比较喜欢生物的存在方式,相信世界的本源都是简单到极致的,不喜欢直接就创造一个庞然大物,喜欢用微小的元素组成一个有机体。

另外对现在的云计算走的道路不是很赞同,觉得不应该把所有的计算、存储集中在服务器,而是储存与计算都分散到每个用户。用户有需求自然产生云。

欢迎大家拍砖~

这个想法很早就有了,但是一直没有敢写出来,最近又看到一些BT的资料,觉得还是很可行的。

附上一些资料:

http://www.udpwork.com/item/5164.html

http://wenku.baidu.com/view/ee91580216fc700abb68fcae.html

micolog反向代理后IP的获取

总所周知GAE的博客是需要反向代理的,否则只能翻墙访问了。

但是反向代理之后评论等等地方显示的ip都全部是反向代理服务器的ip了。

开工:

需要改两个文件:

blog.py

第一处:

self.remote_ip = ”
try:
    if self.remote_ip == ”:
        self.remote_ip = self.request.headers['x-forwarded-for']
    if self.remote_ip == ”:
        self.remote_ip = self.request.headers['Proxy-Client-IP']
    if self.remote_ip == ”:
        self.remote_ip = self.request.headers['WL-Proxy-Client-IP']
except:
    if self.remote_ip == ”:
        self.remote_ip = self.request.remote_addr

image

 

第二处:

image

第三处:

image

第四处:

image

第二个文件是rpc编辑的时候用的,可以不用修改。

api_rpc.py

image

注意:一定要小心空格或者是tab,micolog是采用的tab,如果采用空格来分隔会报错的。

javascript中两种函数的创建方式差异

js中有两种创建函数的方式:

function testA(){……}
var testB = function(){……};

一、看代码:

testA();
testB();
function testA(){alert("I'm A!");}
var testB = function(){alert("I'm B!");};
//运行结果是只有A执行了
//原因是A的定义方式会javascript解析器提到最前面执行
//所以testA可执行,二testB还没定义

二、依然看代码:

//继续测试另一特性
alert(testA);
alert(testB);
//结果是输出了两个函数的源代码,相当于调用了toString方法
//不同的是ie的是直接输出,FF下会帮你排好版
//验证一下
alert(testA.toString());
alert(testB.toString());

这个不能算是差异,利用这个特性可以正则匹配来获取函数名。

三、好吧无耻的请大家继续看代码:

//继续验证另一个
alert(testA.name);
alert(testB.name);
//结果是FF,chrome支持函数的name属性,会返回testA,testB是空
//IE下都是undefined
//testA是一个有名字的函数,而testB则是一个引用,引用的一个匿名函数的内存地址

 

over。

图片、文本框、单选框、复选框、文本、超链接在行内的对齐

a) 什么多不做在FF3.6下面是这样的

clip_image002clip_image003

b) 首先解决图片对齐问题:我是用的

处理后:

clip_image004

可以看到图片还是有点偏下,实际上偏差1px,检查原因是图片是16*16的,而文本框们的高度是21px(默认情况,修改样式不算),所以文本框计算应该中点在10.5px位置,图片的中心计算应该是四舍五入了,所以强制吧图片设置成奇数高度15试试:

clip_image006

clip_image008

现在图片对齐解决了

c) 接下来是单选按钮和复选框:

他们都自带margin属性,单选按钮是3 3 0 5,复选框是3 3 3 4(都是在FF下测试的)。

所以他们看起来很不和谐,那就把margin去掉:

clip_image009

依然没有对齐,再添加vertical-align: middle;

clip_image010

同样由于奇数问题没有绝对对齐,差距1px。可以采用把这些控件设置为偶数高度来解决,比如设置input{height:20px;}:

clip_image011

这样就是标准的对齐了。

d) 接下来是文本与这些控件的对决了,不处理情况是这样的

clip_image012

修正后:

clip_image013

这个修正方法是放狗搜的,具体原理与字体的样式有关,后面的这个是设置 font-family: Tahoma;(看来以前只是顾着用好看的字体,原来这些字体的设计也是很讲究的)

e) 最后是超链接的对齐:

clip_image014

好吧,不用处理了~不过在ie下面如果没有设置字体那么可能会出现对不齐的现象。

最后是结果:
FF: clip_image016

          

IE6: clip_image018

          

IE7: clip_image020

            

IE8: clip_image022

IE9: clip_image024

在chrome下面还是有些对不齐,不过参看了facebook等网站,如果是表单一般都采用table嵌套,不会直接写form表单,最有用的可能只有图片和文字在行内的对齐,而正好这个解决方式是比较成熟的,很多地方都采用。