通过设置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。

PHP Fatal Error重定向跳转

在前端生产环境下,我们需要error_reporting(0)来禁止对用户输出任何错误信息;与此同时,如果能在不可预见地发生Fatal errors和Parse errors的时候跳转到其他页面,而不出现空白,那就能在一定程度上保证用户体验。
我们发现,PHP的error_handlers不能用来处理Fatal errors和Parse errors,于是就有了下面这个方法。
在php.ini文件中可以找到:

; String to output before an error message.
;error_prepend_string = "html code"
; String to output after an error message.
;error_append_string = "html code"

那么我们可以把error_prepend_string或者error_append_string前面的分号去掉,把它的值设置为”<script>window.location.href=’another_page.php’;</script>”,在出错的时候使用javascript的redirect到另一个页面。
但是这种做法似乎不太优雅…正在寻找通过服务器302临时重定向的方法。

PHP SPL File Browser

俗话说不想偷懒的程序员不是好程序员。
所以为了向“好程序员”靠拢,我们要自觉地在工作中偷懒…当然不是要你偷工减料,而是要用程序员应该有的方式来“偷懒”,提高工作效率。
我所在的公司使用的PHP demo环境,出于安全方面的考虑,设置了禁止访问网站目录(列出目录文件列表),造成了我没有办法通过浏览器直接访问目录,查看到目录下的文件列表。上传了个php探针到demo服务器上,发现PHP的系列文件操作函数都被禁用了。这样我也没有办法写一段php脚本通过opendir、chdir、scandir等函数来遍历目录下的文件,输出文件列表到浏览器。
好在经过测试,发现并没有禁用PHP的SPL(SPL是Standard PHP Library的缩写)。这样我们就可以通过SPL中的DirectoryIterator来遍历目录了。
于是就有了下面这个小工具,我想可以把它叫做PHP SPL File Browser或者PHP SPL Directory Browser。它强大得放在任意子目录下都可以浏览整站目录。代码写得很乱,就不献丑了,有需要的童鞋可以发Email给我。

受doctype影响的内嵌img标签的td高度

在工作中遇到一个问题,在html5页面下,使用table布局,td包含img标签,如果td内还含有空白字符,那么td的高度就会出错,导致页面出现空白/间隙,设置了img的vertical-align:top问题依然存在。google了一下,发现stack exchange上有人早就在一年多以前发现doctype在XHTML 1.0 strict下存在该问题并有了解决方案:把空白字符去掉或者设置line-height:1px,img{display:block;}也可以。
原因是在块级元素中单个字符(包括空格)都要占用一个单行,所以块级元素至少要暂用一行的高度,把行高设置成1px就了。
http://stackoverflow.com/questions/1450274/why-td-height-not-equal-to-img-height-inside-of-it-when-doctype-is-xhtml-1

The size of block-level element (td, div, etc) if not specified will only be as big as needed, according to the space taken by its content. If specified, it will try to expand accordingly, except if the content is bigger, in which case it will expand as necessary.
In your example, the cell contains a single character (the non-breaking space), which take the size of single line. Hence, the block element must be at least 1 line-height high; it can’t assume any smaller size. This is why your height declaration was ignored.

一键禁用所有扩展——重量级的chrome扩展

今天给大家推荐一个我自己写的chrome扩展——一键禁用所有扩展

One Key Disable Plus

扩展安装地址:https://chrome.google.com/webstore/detail/ejhdjfmkegkpenillofhpmikailkjpkb

之所以写这个扩展是有原因的。作为一名前端开发者,我使用Chrome和Firefox进行调试,同时装了很多功能强大的扩展/插件。然而我发现在使用Chrome进行调试的过程中,很多插件都会往页面加入一些额外的标签,这样就不利于我们调试和查看页面源代码。我需要一个能够一键禁用所有扩展的插件。后来经过用户调研,发现作为前端开发者和发烧友,可能还需要方便地对扩展进行逐个关闭、开启、乃至卸载的操作,于是就有了这个扩展。

现在这个扩展支持一键禁用/开启全部扩展展,也支持扩展的逐个禁用、开启、右击卸载扩展,支持中英两种语言。

大家有什么功能上的需求还可以与我联系,欢迎交流。

jQuery图片对比插件jPictureCompare

发布一个自己写的基于jQuery的图片比较插件:jPictureCompare。高手们就当看看笑话吧……是模仿网易新闻频道报道的《日本地震前后对比图像》做的(http://news.163.com/special/ribendizhen_duibi/)鼠标移动图片上滑动观看。

调用依然很简单,只需一行,可能我对需求考虑得还不够周到…

$(function(){
        //参数:图片的尺寸
	$('.jPictureCompare').jPictureCompare({'width': 940,'height': 529,});
})

demo在此

下载地址

饭鱼一刀

添香楼?名闻天下的添香楼?因一道“游鱼戏水”而惊动大内御厨的添香楼?有先帝御赐“添香夜宴天下绝”的添香楼?
是的,正是此添香楼。楠木为栋,梨木为梁,上下三层,一十二间。间间铁木为桌,铁木为凳,汇聚天下名贵瓷器的添香楼。
听说添香楼早以不复当年盛况,那些瓷器早在战火中毁坏殆尽,那些曾经光亮如镜的铁桌也早已被金兵的铁剑划出了道道刻痕。
那些又算得了什么?只要饭鱼还在,添香楼就永远是添香楼,添香楼的游鱼戏水就永远失传不了。
听说他昔年做“添香夜宴”曾引得万人空巷一时传为美谈,可惜自金兵破城后就再也没有听说过他的名字。莫非,他又出现了?
寒门柴草贫家事,锦衣华服帝王家。
越过紫环朱漆的大门,穿过雕梁画柱的回廊,修竹摇曳的一座庭院出现在眼前。
四面青石案几,几上清水一盅,盅后各坐一人。
人,众人皆默,目注场中。
一张永远看不出表情的脸,一双冷冰冰不沾尘事的眼,一双拢在袖中看不见指甲的手。
灶塘里没有火,铁锅里没有油,厨子手里没有铲,这样怎能做出菜?
火升起来了,一尺长五寸宽在八月的烈日下暴晒整整一个月的一点就着的凤梨木,红通通的火苗生起来足有一丈高。
油下了锅了,一两二钱银子一两的脆香坊今晨刚运到的阳光照射时间最长雨水最好秦岭芝麻酿出的小磨香油,倒一滴进锅里逸出的香味足可以飘出三层楼。
铲?没有铲。饭鱼做菜从不用铲。用铲做出的菜也绝不是饭鱼做的。饭鱼擅长一柄五寸三分薄刃带弯滴水不沾的小刀,用时手出袖刀出手,片刻之间挥划而就。
一斤二两一条的青鱼,肉白质嫩,刚由渔夫自水清见底的昙溪捕了送来。养在青釉蓝瓷白底的圆盆里,跳跃之间,便似有三斤的鱼性。
火,越烧越旺;油,四溅散香。
饭鱼已经站在了鱼盆前。青鱼似乎预见到自己的命运,在盆里不安分的游动,越游越快,终至跳动起来。就在青鱼跳起来又将落入盆中的一刹那间,衣袖挥动,刀已出手。
随着溅起的油香,片片鱼球便如雪片似滚入锅中。饭鱼刀未入袖,就势转身,以迅捷无比的动作将葱、姜、蒜、盐、糖抖入锅中。
芳香四溢,鱼已就碗。
饭鱼一脸平静的站在那里。那姿势,竟仿佛未动分毫。
“好!饭鱼一刀果不其然!”说话之人一身紫裘裹住健硕的身材,四方脸,浓眉,一双眼虽在笑中仍如有雷霆之火,不怒而威。正是当日率兵攻破京师的大将军宗恕。
“宗将军有所不知,饭鱼神技不仅在此,请将军移步。”站在宗恕身边之人一身蓝衫,青巾裹头,观其面貌本当极为俊朗,却因带有一股阿谀奉承之气,整个人气势顿时减了几分。
“哦,莫非还有奥妙不成?玉林你倒知道的清楚!”宗恕随玉林来到围宴中间。
青釉蓝瓷白底的圆盆里,青鱼竟娓娓而游。
水清,瓷白,鱼青,随着鱼尾的晃动,清水,白瓷,青鱼仿佛都在动,都是富有生命力的。
宗恕不由睁大了双眼。
“将军请再看这里。”玉林躬身一揖。
白玉碗里,一粒粒滚圆的鱼球竟像被一只无形的手操纵,在热油翻滚中成一个圆环在碗里转动。
“真神技也!”
“将军请回座。”饭鱼端起白玉碗。
“闻这香味已足够回味三生,想必吃起来更是冠绝天下。今天宗某有幸要一尝为快了。哈哈哈哈!”
宗恕回到座位之上。“玉林,听说这道菜名为‘游鱼戏水’……”
正说话间,饭鱼将白玉碗端至宗恕面前。
“这就是‘游鱼戏水’?”宗恕似乎有点失望,原来盛名之下未必是真。碗中鱼球浑圆,何来游鱼之说?但方才看他挥刀破鱼,鱼仍可游动也可称绝天下了。
“将军请借此盅中水一用。”青石雕成的水盅就在宗恕的案上。盅中盛自玉泉山中新取之水,清冽透亮,甜而不浮。
“请!”
饭鱼将盅中清水缓缓注入白玉碗中。
仿若奇迹,原本浑圆天成的鱼球竟慢慢舒展开来,渐至展成鱼形,头,尾,身,翼,无不俱全,在水中翕张游动,仿若天生。而玉碗中油则滴滴如雨滴荷叶般浮在水上。
青釉蓝瓷白底的圆盆,一斤二两一条的昙溪青鱼。盆,还是那个盆;鱼,也仍是那条鱼。
水,清澈见底;鱼,娓娓游动。
四个锦衣裘服的人围着圆盆坐了足足有一个时辰。
“好鱼!”
“好刀功!”
“手非常稳!”
“冷静得可怕!”最后开口的,正是紫衫裘服的大将军宗恕。
“当时在场的,连我在内一共二十五人,他们分别站在饭鱼前后左右不到五丈的不同位置,可说从任何一个角度都绝对可以看清他的出手;这二十四人无论武功,身手,眼力都可说是铁卫队里百中挑一的好手,我相信即使我施展全部的武功也绝难逃过这二十四人的围攻,就算我逃过他们的围攻我施展的武功招式也必定落入他们的眼睛;更何况我就坐在离饭鱼最近的地方,这个位置是我精挑细选的,我确信只要他手一出袖我必定能看清楚他的招式。可惜……”
“可惜?”
“可惜!可惜这二十四人并我在内竟未能看清他的招式。”宗恕一声长叹。
“哦?”
“当时我已感到他的刀气,生冷,凌厉,当他的手挥动时我几乎要一跃而起,我告诉自己,如果他鱼刀一出,我将避无可避。”他似乎又看见了饭鱼那一刀。
“他有三次机会均未出手?”
“是的,三次。仅有的三次机会,但……”
“但你并未感觉到一丝杀气,既没有杀气他当然也就不会出手,你又何必戒备?”
说话之人身倚窗棂,背对众人,黑发束起,腰肢细长挺直,身上披一件团云盘龙的金黄长袍,语声轻而带有一种威仪。这人自打他们进屋就一直未动身形。但是,即使他没有移动过一分,在坐的每一人也都觉得他在看着自己,就仿佛他的后背上也长着一双眼睛,这眼睛就盯着自己。
“是,他未动,臣也不敢擅动。” 宗恕小心翼翼。
“先发制人,后发则受制于人。宗恕呵宗恕,昔**领奇兵孤军直下,铁蹄所到之处无不披靡,而今你的雄风安在?你何时变得谨慎起来了?”年青人转了过来,一张苍白的脸上竟没有年轻人应该有的朝气。他的脸上虽也含着笑意,但这笑意却并没有到达他的眼中,这令他的笑容也生冷了许多。
“臣不敢不谨慎。”身形健硕的宗恕在他面前竟也仿佛矮了一截,宽阔的额头上竟冒出了滴滴的冷汗。
“我大金开疆裂土靠的是英勇无畏,若都似宋人怯弱怕战,今日之宋都又岂是我等能踏足的?”年青人目光在四人脸上一转,四人均暗觉心中一凛,暗想“我圣宗当可算上目光如炬了。”
“朝闻道,夕可死。能见识破鱼一刀,又岂畏死?”年青人目注宗恕。
“滋味如何?”年青人将头复转了出去。窗外暗黑的夜色中开始飘起了雪。
“鲜美润滑,单是那精美已足膛目。”
“飞雪一落,河面结冰,青鱼将难以捕捉。宗恕,叫饭鱼后日进宫来罢。”年青人挥手令四人退出屋外。
“玉林,你已是第几次看饭鱼做菜了?”良久,圣宗缓缓道。
“禀圣宗,已是第三次了。”清秀俊朗的玉林一身蓝衫未变,不知何时出现
在屋里。而屋里的四角也早已升起炭火,令得整间屋子温暖如春。
“仍是一无所获么?”
“圣宗,玉林无法看出破绽。”
“你看!”圣宗伸出一只手。他的手,修长细致,手指曲伸,两指中夹着一条青鱼。
玉林看着他手中的那尾青鱼。一斤二两的青鱼纵然离开了水也有二斤的鱼性,此刻夹在圣宗左手的两根手指中间竟动弹不得。圣宗右手轻轻在鱼身抚过,只见鱼身两边各竖起三道被刀划出后掀起的鱼鳞,鳞未散而鱼肉已缺。
“挥刀,破鱼,成球,入锅,仅在一瞬之间。”圣宗手指一抖,已将青鱼弹入盆中,鱼入水,而滴水未溅。
“鱼身划了6刀而鱼似未损,此人刀功非凡。”圣宗以一条雪白的手绢搽拭手指。“据说徽宗曾品尝过他的游鱼戏水,并赐字?”
“是。”
“徽宗书画妙绝天下,可惜因画误国,如今在五羊城虽身陷樊笼但仍可作画,也算对得起他了。”
“是,圣宗仁慈。”
“听说你曾在徽宗身边服侍?你看我比之徽宗何如?”
“玉林不敢。玉林虽曾服侍徽宗但为远侍,只在殿外伺候,徽宗与圣宗……不可同日而语。”玉林一直低垂着头。
“是么?……你也下去吧。”
“圣宗……”
圣宗意兴阑珊,竟似再也不愿多说一个字,挥挥手径自往屋里走去。
雪白的绢纸。
未干的墨迹。
一枝湖州钟氏所做玉管小毫横陈纸上。
画中,是一树傲雪而开的白梅。遒劲的枝干,乍开的梅花,凌乱的雪花。
雪花虽乱,但又怎及人的心乱?
圣宗站在窗前,似有千头万绪,想仰首一啸,欲振臂一呼。
多少日了,那种独立云霄罕匹敌手的感觉。
冬月初三。雪住,风冷。
圣宗在玉华殿。
四面屏风围住寒风,殿内温暖如春。
新锅已架起,凤梨木噼里啪啦烧得正欢,青鱼在圆盆里自由自在的游来游去。
白玉碗,青石盅一一摆在案上。
宫中的太医过来用银针一一试探,他逐一细致地检查了每一件器皿,向立在一边的铁卫首领摇了摇头,退下。
圣宗对眼前的一切很满意。
他一直很想亲眼看一下饭鱼。此刻饭鱼就站在他面前的台阶下。样貌并不太出众,身材也只是中等,一双眼睛细长。此刻他正用一种平静而内敛的眼光看着自己。他突然觉得自己找到了一直在寻而未得的某种东西。是什么?脑海里一闪而过,却无法抓住。
“饭鱼,你可以开始了。”玉林看了看圣宗,圣宗的眼睛里有某种期待。
饭鱼转身向灶边走去。他的步伐稳重而坚定,每一步跨出的都是那么的自然,充满了信心。
青鱼跳起,饭鱼袖挥手动刀出,鱼球落入锅中,青鱼落回水中。一切是那么的自然。
圣宗双目盯着饭鱼的衣袖。
调料,盛碗,做汤,一气呵成。
“游鱼戏水!”圣宗看着眼前的鱼球慢慢舒展。白玉碗里,六条饭鱼活灵活现的游动,油滴在水上轻盈的晃动,眼前简直是一个绝美的奇迹,又教人怎生下箸?
生似不忍破坏这一切,圣宗素手一拈,一滴鲜汤落入喉中。
就在此刻,饭鱼衣袖一挥,手已探出。就在他动的同时,圣宗突然也动了,素手连弹,后发而先至已一击点在饭鱼胸前。
“哦?”圣宗一惊,手往回缩。
就在他手将缩未缩之际,玉林已如猛虎扑林一跃而来。手中霍然一柄锋利至极的薄刃宝刀。
刀身直没至背。
“护驾!”站在殿下的铁卫首领大声道。宗恕等并殿外的铁卫蜂拥而至。
“你?”
“为什么?”圣宗的语气中有着太多的不相信与愕然。
“玉林,孤王自问待你不薄,自你入宫以来孤王对你信任有加,你为何背叛孤王?”
“饭鱼,你为什么要这么做?”圣宗看着在铁卫的剑戟下已满身血痕的两人。
“饭鱼你的手艺天下无双,只要你愿意,孤王可以封你为御厨,搜罗天下珍禽供你尽情发挥,你尽可以创造出诸如游龙戏水,单凤朝阳这样的旷世奇菜,你的绝技将名列膳食谱,你的盛名将代代相传,你可愿归顺我大金?”
“孤王一向爱才惜才,只要你二人降服,孤王对今日之事可以既往不咎。”
“我只有一事不明,尚盼告之。”良久,圣宗道。
“你的刀功破鱼是为一绝,以宗恕之眼力,原可断定饭鱼绝非会武功之人,你明知宗恕乃我大金一员猛将,他一生乃是在戎马中度过,统领军士无数,可谓阅人无错,你为何要显露你的刀功?如果你在宗恕府不施展出来,我原本不会在意你挥刀的动作,更想不到你原来丝毫不会武功。”
饭鱼浅笑,他松开了一直紧握住的手,也就是他方才在案前突然挥动引起圣宗随之而动的手。
饭鱼的手由于常年握刀变得坚毅无比,短而粗的手指上充满了力度。
此刻在他摊开的手掌中间并没有握有鱼刀,而是轻柔的握着一条饭鱼,一条以青鱼肉挥划而做成的游鱼。
原来他方才挥手只不过是自碗里取了一条游鱼。
“我明白了,你知我定然防你,故意取鱼吸引我视线,好教玉林一击得中。可惜你计谋虽好,孤王早已洞悉其谋,否则,又岂会容你近孤王身侧?”圣宗苍白的脸上此刻由于兴奋而变得红润。
“至于你,玉林,你又岂是孤王敌手,你刺向孤王的一剑又岂能伤孤王分毫?”圣宗双臂一振,玉林插在他背上的短剑已抖落地上。
“玉林,你又有何话说?”他得意的转向玉林。
“金贼毁我河山,残我百姓,凶行历历,凡我大宋百姓人人恨不得食汝之肉,可恨我功亏一篑,未能斩杀你于刀下!”玉林恨恨地将目光转向一旁。
“可惜你宋朝无人,我大军到处无不披靡,那继任的新君已躲在新都向我俯首称臣,你二人又何必在此枉送性命?”圣宗面色数变。
“你错了。我大宋义士就如过江之鲤斩杀不尽,我二人不过是马前小卒而已!”
“义士?是,汉人崇尚此风。可惜天佑我大金,你们的计谋终是不能得逞。”圣宗以睥睨的目光忘向二人。“我还可给你们一次机会。”
“休要得意!只我二人就可将你杀死!”一直没有开口的饭鱼道。
“是么?”圣宗一脸的不信。他注目饭鱼。
突然,他又看到了饭鱼眼中那种平静而内敛的神色,那种稳重而坚定,充满了信心的表情。
是什么环节出了错?有什么他没有注意到的细节?圣宗的内心不安起来。玉林转首看向饭鱼,神色开始平静,再不复刚才的冲动。
电光火石之间,圣宗面色狂变,他跃下座椅一把抓住饭鱼衣领。“快说,你在鱼汤里下了什么?”
“鲜汤一碗入君喉,包君无愁亦无忧。”饭鱼曼声轻吟。
“快说!”铁卫的剑戟再次抵住二人。
“一碗鱼汤就叫圣宗变了颜色,可笑啊可笑。圣宗自以为会万寿无疆么?”玉林看着他,饭鱼的笑容原也可以这么洒脱的。
“至毒之毒,无药可解!”玉林的嘴角含着冷笑。
“饭鱼!”圣宗心念数转,终颓然放弃。
“圣宗!”宗恕等人跪倒在大殿上。
“将此二人斩首,添香楼夷为平地。”圣宗坐回座椅,望着被拖走的二人,神色渐复平静。
“游鱼戏水自此失传矣!可惜我朝无此智勇双全之侠士。宗恕听令,示众三日后将二人盛殓。

三日后,金圣宗 殁。

Flash和PHP交互中同步session

今天在使用Uploadify和thinkphp进行多文件上传时遇到一个问题,在选择上传的文件并自动上传完成之后,弹出警告窗口提示“http 301”或者“http 302”重定向。后来发现是因为通过Flash插件发起的请求是另外一个客户端发起的,跟浏览器的会话不一致,而我的服务器后端代码恰好是有登录认证的。这就需要我们把当前的session_id通过url或者post的方式传递给php。

一开始我设想将session_id作为query_string传递给php后(即$_GET['session_id']或者$_POST['session_id']),通过session_destory()、session_id($_REQUEST['session_id'])、session_start()系列函数,将flash的会话同步为和浏览器一致。而一技术群里有高手提醒说只要把php.ini中的session.name作为参数传递,PHP就会自动处理了。也就是$_GET或者$_POST或者$_COOKIE数组里有一个“PHPSESSID=当前会话的id”,就能让php自动处理、实现会话的传递了。就是这样:

$("#uploadify").uploadify({
    'uploader'       : '/xxx/xxx/uploadify.swf',
    'script'         : '/xxx/xxx/xxx.php',
    'scriptData'     : {'PHPSESSID' : ''},
    ....

或者:

$("#uploadify").uploadify({
    'uploader'       : '/xxx/xxx/uploadify.swf',
    'script'         : '/xxx/xxx/xxx.php?PHPSESSID=',
    ...

不过谁能告诉我Flash的Cookies要怎么清除啊。。因为这个原因调试过程中一直困难重重。哈哈。。实在太笨了

淘宝商城轮播(幻灯片)效果的jQuery实现及反思

淘宝网的前端开发团队是业界最优秀的前端开发团队之一。淘宝网和淘宝商城的每一个页面都凝结了淘宝前端开发者的心血——他们关心用户操作和感受,力求给用户最好的体验。

KISSY是淘宝前端团队自主设计的一个Javascript 类库,其设计原则是“小巧灵活、简洁实用,使用起来让人感觉愉悦”。KISSY还封装了一些常用的组件,比如图片轮播等各种Switchable组件,被广泛的应用到了淘宝网和淘宝商城的各个角落,但今天的主角……呃……好像是它,也许不是它,这并不重要,先让我们来试试基于jQuery的仿淘宝网图片轮播效果的实现,并作一些浅显的反思。

博主曾写过一个简单的jQuery幻灯插件Xslider。那么能不能通过对Xslider的定制,制作出符合我们要求的轮播效果呢?答案是可以的。下面我们看代码以及Demo:
Code:


Demo:

可以看到,通过对博主的Xslider插件进行简单的定制,我们貌似就可以做出类似淘宝商城的各种轮播特效。
然而实际工作中,需求往往是变化多端的,我们还应该考虑在其他情况下插件的可重用性:比如图片轮播每次不是切换单一张图片,而是多张图片;比如轮播的形式不仅仅是图片,有可能是文字,甚至每张幻灯片的版面都截然不同;再比如怎么去构建一个本质上与轮播类似的tab(标签)页(可能还要实现内容的AJAX加载)——诸如此类的情况我们在插件设计的时候也应该尽量考虑到。
反观博主自己开发的Xslider插件,一旦有新需求,往往会比较依赖对css、HTML结构、甚至是插件代码的修改以适应新需求,代码可重用的程度仍然比较低,而且长期这么修修补补,代码也容易变臃肿。其根本原因就是没有去分析这些特定需求、场景,从而进行不同层次的抽象,真正达到组件化。
当然,这么做也有好处就是,只进行了一层抽象,结构清晰,比较容易理解。
说到这里,竟免不了要拿jQuery的插件与KISSY的组件进行一番比较。可博主没有用过KISSY,只看过少量的文档,进行这番比较难免断章取义,所以留给读者和自己将来再作对比,暂且打住……mark here
那么在前端代码中,我们应该怎样做才能确保插件(组件)的可重用和扩展性呢?下面一段摘自《行进中的前端类库:KISSY》,供大家参考。

KISSY的组件严格遵守适度灵活原则,在特定的场景下进行设计。任何抽象场景,都有不同的抽象层次。比如淘宝首页的图片轮播,至少有以下三种层次的抽象:

  1. 图片轮播是可轮播的多张图片
  2. 图片轮播是可切换的一组内容
  3. 图片轮播是对命令的响应

第一种抽象,会让我们做出像TBra里的SimpleSide类似的组件,功能很纯粹单一。大部分站点用jQuery等代码实现的图片轮播,也是基于这种简单明了的抽象。

第二种抽象,会让我们思考更多。比如图片轮播和标签页切换的关系,从这一层的抽象来讲,标签页和轮播图片本质上一样的,都是一组可切换的内容。在这一层抽象上,我们就可以实现Switchable(可切换)组件,有了Switchable,所有可以抽象为可切换内容的可视化组件,就都可以快速基于Switchable来实现,而不是全新写一个。在淘宝首页上,大部分可视化组件都是Switchable组件,非常便捷。

第三层抽象,很抽象,但抽象层次越高,落地越难。基本所有交互组件,都可以抽象成为对用户行为的响应。适度灵活原则,能避免我们掉入过度抽象的陷阱。

改进Smarty的缓存过期检测

Smarty仍然是被广泛采用的模板引擎,国产的开源网店程序Ecshop就是使用Smarty作模板引擎,它广泛采用了Smarty的静态缓存技术。

然而,Smarty检查缓存新旧居然是通过往缓存文件的开头写入经过一串经过序列化的数组(记录着缓存的过期时间等信息)——检查的时候把第一个“<”出现之前的字符串读入并unserialize(),从而获取原本数组中记录着的缓存过期时间,进而来判断是否更新缓存。

这么做有一个缺点,就是每次检查缓存是否过期的时候都要进行一次读取文件和unserialize()操作,势必影响了效率,我们不妨用以下方法来取代Smarty默认的缓存机制:

$compile_file = '../temp/compile/index.html';
if (file_exist($compile_file))
{
    $filestat = stat($compile_file)
    if (time() - $tmp['mtime'] < $smarty->cache_lifetime) //如果缓存未过期则直接输出
    {
        echo file_get_contents($compile_file);
        exit(1);
    }
    //如果缓存过期了 生成缓存+输出
    do_some_db_query(); //一些数据库查询操作
    $html = $smarty->fetch($compile_file,$smarty->cache_id);
    file_put_contents($compile_filel);
    echo $html;
}

此外,根据“在输出缓存之前,永不加载没用的东西”这条原则,Smarty类的引入和实例化应该放在过期检测之后,而不是放在init.php里,这样,如果缓存存在,就直接输出缓存并终止代码的运行,能最大化的提升应用的效率。

在网上找到了篇牛人写的关于此方法的测试和改进:
http://www.9enjoy.com/optimize-smarty-html-test/