Monthly Archive for 四月, 2011

老婆,快出来见上帝:cnBeta月光宝盒

呵呵,本来是想自己知道就好,低调点。但既然有那么有趣的网友,那我也幽默点吧。
baby come out see the god
不知从何时开始,cnBeta上的评论有了48小时的保鲜期,过了48小时,任何曾停留在页面上的喧嚣,都会消隐不见。
cnBeta月光宝盒——轻轻一点,昨日重现(甚至都不用点)。
cnBeta月光宝盒-screenshot

扩展安装地址:https://chrome.google.com/extensions/detail/nkgjnkanhkhlallldojlbekikmeefcje
目前服务端暂放在SAE,万一哪一天被X了,或者“云豆”不够用了,那么“cnBeta月光宝盒”将何去何从呢,这是一个要考虑的问题…

(低调地)再发布一个chrome扩展_腾讯微博Chrome地址栏发布工具

一键禁用所有扩展cnBeta月光宝盒之后,哥的第三款chrome扩展——腾讯微博地址栏发布工具正式发布。。
PS:其实这个创意是来自我的师兄天祁小朋友的新浪微博地址栏客户端,欢迎大家关注他的微博@代码诗人天小祁。。
你可以在chrome地址栏 按 T+空格+内容+回车来发微博!
用T+空格+@+来查看和回复最新@me
用T+空格+home+来查看和回复最新微博
腾讯微博地址栏客户端
安装地址:https://chrome.google.com/extensions/detail/fhnonpihhkcldnjmhpjljkahoegilaep

Javascript惰性函数函数的应用

function addEvent(element, type, func) {
	if (document.addEventListener)
		element.addEventListener(type, func);
	else
		element.attachEvent(type, func);
}

上面的函数在每次调用的时候都会检测document.addEventListener是否存在,并用它绑定一个事件,如果不存在,就使用ie的方式绑定事件。
这个函数工作得很好,尽管它在浏览器的兼容性检测上还不够完善。但从性能的角度出发上,我们可以做得更好:只执行一次检测,就是在函数第一次被调用的时候。
为了达到这个目的,我们使用一个javascript的惰性加载特性(http://peter.michaux.ca/articles/lazy-function-definition-pattern)

function addEvent(element, type, func) {
	if (document.addEventListener) {
		addEvent = function(element, type, func) {
			element.addEventListener(type, func)
		}
	}else{
		addEvent = function(element, type, func) {
			element.attachEvent(type, func)
		}
	}
	return addEvent(element, type, func)
}

Kissy中jsonp api的bug

在相邻的代码里多次调用Kissy的jsonp方法,调用十次大概会出现六次的:Uncaught ReferenceError: jsonp1302852733609 is not defined(anonymous function).同事仙羽查看源码发现,是kissy的jsonp api是调用太快了,产生了同一个时间戳。。两次请求返回的都是同个函数调用,但是kissy里面的jsonp有个垃圾收集的处理,结果把这个函数给删了,第二次再调用的时候就调用不到了。算是kissy的bug吧,应该用guid的。出错代码如下

for(var i=0;i<10;i++){
    KISSY.jsonp('http://110.75.14.39/home/recommendTmallSpu.htm?appID=87&num=4&key=110202',function(data){
        console.log(data);
    })
}

问题就出现在ajax模块下的这行代码:

jsonp = c['jsonpCallback'] || JSONP + S.now();

贴一段jQuery源码中的实现:

// 默认的发起jsonp请求的设置 即url中callback=?的情况 回调函数也是"jsonp_"+时间错
jQuery.ajaxSetup({
	jsonp: "callback",
	jsonpCallback: function() {
		return jQuery.expando + "_" + ( jsc++ );
	}
});

// 装载jsonp的callback函数
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {

	var dataIsString = ( typeof s.data === "string" );

	if ( s.dataTypes[ 0 ] === "jsonp" ||
		originalSettings.jsonpCallback ||
		originalSettings.jsonp != null ||
		s.jsonp !== false && ( jsre.test( s.url ) ||
				dataIsString && jsre.test( s.data ) ) ) {
                //响应容器
		var responseContainer,
			jsonpCallback = s.jsonpCallback =
				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
			previous = window[ jsonpCallback ],
			url = s.url,
			data = s.data,
			replace = "$1" + jsonpCallback + "$2",
			cleanUp = function() {
				window[ jsonpCallback ] = previous;
				// 当有请求时调用callback
				if ( responseContainer && jQuery.isFunction( previous ) ) {
					window[ jsonpCallback ]( responseContainer[ 0 ] );
				}
			};

		if ( s.jsonp !== false ) {
			url = url.replace( jsre, replace );
			if ( s.url === url ) {
				if ( dataIsString ) {
					data = data.replace( jsre, replace );
				}
				if ( s.data === data ) {
					// Add callback manually
					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
				}
			}
		}

		s.url = url;
		s.data = data;

		// 装载callback
		window[ jsonpCallback ] = function( response ) {
			responseContainer = [ response ];
		};

		// Install cleanUp function
		jqXHR.then( cleanUp, cleanUp );

通过设置p3p头来实现跨域设置cookie[转]

转自:http://huaidan.org/archives/1526.html
今天在w3网站上看到了一篇介绍p3p的文章(http://www.w3.org/TR/p3p/),利用这个可以实现跨域访问cookie,我也试验一下。

其实很简单:试验用了2个域名readlog.cn和diaor.com

首先在readlog.cn下放置一个文件setcookie.php 内容:
PHP代码

header(’p3p: CP=”CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND

PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV”’);//p3p
setcookie(“Testcookie”,”test”,time()+3600,”/”,”.readlog.cn”);//设置cookie

再放置一个readcookie.php 内容:

然后在diaor.com下放置setcookie.php ,内容:
JavaScript代码

1. <script src=”http://www.readlog.cn/setcookie.php”></script>

然后访问http://www.diaor.com/setcookie.php 抓取数据包可以发现,在readlog.cn域下生成了一个cookie ,名称是Testcookie,值是test

下面访问http://www.readlog.cn/readcookie.php 来验证一下,可以发现,cookie确实设置成功了。

有兴趣可以去掉header(’p3p: CP=”CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IN

D PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV”’);这句,试一下就会发现cookie能设置,但是在readlog.cn读不到这个cookie。