全国爆笑人名
刘产
扬伟
赖月京(还是个男的)
范剑
姬从良
范统
夏建仁
朱逸群
秦寿生(亏他父母想的出)
庞光
杜琦燕
魏生津
矫厚根
沈京兵
排名第一的:史珍香
当你在因个人兴趣爱好而开发PHP程序时,面对可以达到你的目的却长达千行以上的js脚本,你有精力去用php重写它么?想用PHP模拟用户行为么?但却 遇到js泛滥的站点……一个不为人所知的php扩展项目可以满足这些需求,这个扩展的目的就是在php内解释javascript。
项目主页 http://aurore.net/projects/php-js/
php-js-ext是mozilla javascript解释器和php之间的一座桥梁,因此我们除了需要下载最后版本为0.1.2的php-js-ext,还需要下载最新版本为1.7.0的mozilla
js,链接如下(php-js-ext 0.1.2发布时是配合js-1.5工作,但经我测试,也可以配合js-1.7工作)
CODE:
wget http://aurore.net/projects/php-js/php-js-ext-0.1.2.tar.bz2
wget http://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz
系统是CentOS 4.5
1.安装mozilla js
解开js-1.7.0.tar.gz
CODE:
tar zxvf js-1.7.0.tar.gz
cd js/src
开始编译(如不能完成编译见最后说明)
CODE:
make -f Makefile.ref
拷贝libjs.so到/usr/lib
CODE:
cp Linux_All_DBG.OBJ/libjs.so /usr/lib
ldconfig
拷贝头文件到/usr/include
CODE:
cp jsapi.h jscompat.h jslong.h jsosdep.h jsotypes.h jspubtd.h jstypes.h jsproto.tbl jsconfig.h Linux_All_DBG.OBJ/jsautocfg.h /usr/include/
自此mozilla js的安装工作就完成了,下面开始进行php-js-ext的安装
2.安装php-js-ext
解开php-js-ext-0.1.2.tar.bz2
CODE:
tar jxvf php-js-ext-0.1.2.tar.bz2
cd php-js-ext-0.1.2
创造环境并设定扩展版本(如有一个以上的php存在,需要输入phpize的完整路径)
CODE:
/path/phpize
配置并编译安装(如有一个以上的php存在或configure无法找到php的位置,需要在configure的时候指定-with-php-config=/path/php-config)
CODE:
./configure
make && make install
如果一切无误,js.so已经在你的php的lib目录
最后,修改你的php.ini,在相应的位置加入extension=js.so,并确认extension_dir的设定正确。
输出一个phpinfo的结果,以查看js.so是否被正确加载和可能的错误信息。
如果一切无误的话,我们就可以开始使用这个功能了。
这里附上官方网站的使用说明:
QUOTE:
A simple ./configure; make; make install should do the trick. Make sure to add an extension=js.so line to your php.ini/php.d. Note: you need to install libjs first. If you’re using a Redhat-esque system, you can use the SRPM provided above, else, use the TBZ.
Then, just use js_eval to evaluate your JavaScript. js_eval returns the value returned by the JavaScript interpreter to PHP.
For example:
js_eval(”var a = 123;”);
js_eval(”var b = 456;”);
$c = js_eval(”[a, b];”);
echo “a is “.$c[0].”\n”;
echo “b is “.$c[1].”\n”;
js_eval(”var sum = function(x, y) { return x + y; }”);
$d = js_eval(”sum(a, b);”);
echo “The sum of a and b is “.$d.”\n”;
Would produce:
a is 123
b is 456
The sum of a and b is 579
js_eval takes an optional boolean argument, assoc, which returns objects as associative arrays instead of PHP objects.
The php-js execution environment provides two built-in JavaScript system functions:
* print
* gc
print outputs its argument to the php output stream.
gc forces garbage collection within the JavaScript environment.
(非 Redhat的linux发行版可能会在mozilla js的编译过程中产生错误,是因为连接器和内核已经不对a.out提供支持,我们需要用gcc来生成一个共享库而不是ld了。打开 js/src/config/Linux_All.mk,将第50行的 MKSHLIB = $(LD) -shared $(XMKSHLIBOPTS) 更改为 MKSHLIB = $(CC) -shared $(XMKSHLIBOPTS) ,make -f Makefile.ref clean后再次尝试编译。)
来源:SunGod
| LRC概述 |
| LRC 歌词是一种包含着“[*:*]”形式的“标签(tag)”的、基于纯文本的歌词专用格式。最早由郭祥祥先生(Djohan)提出并在其程序中得到应用。这种歌词文件既可以用来实现卡拉OK功能(需要专门程序),又能以普通的文字处理软件查看、编辑。当然,实际操作时通常是用专门的LRC歌词编辑软件进行高效编辑的。以下具体介绍LRC格式中的“标签”。 |
| 时间标签(Time-tag) |
| 形式为”[mm:ss]”或”[mm:ss.fff]”(分钟数:秒数)。数字须为非负整数, 比如”[12:34.5]”是有效的,而”[0×0C:-34.5]”无效。 它可以位于某行歌词中的任意位置。一行歌词可以包含多个时间标签(比如歌词中的迭句部分)。根据这些时间标签,用户端程序会按顺序依次高亮显示歌词,从而实现卡拉OK功能。另外,标签无须排序。 (如果我们的网站不错,请把“九九Lrc歌词网 =>www.99lrc.net”网址推荐给你的朋友使用,谢谢!) |
| 标识标签(ID-tags) |
| 其格式为”[标识名:值]”。大小写等价。以下是预定义的标签。
[ar:艺人名] 样例 [ar:unknown] |
| 开发标准(供程序员阅读参考) |
| 以下列出了开发支持LRC格式的软件时应遵守的一些标准。 |
|
原版:
我是个成熟男人
但是我的长相显年轻
体形魁梧,给人一种大哥的感觉
我事业成功,是个老板
走到哪里都拎着笔记本
我坐的车比林肯车还宽敞
多年在北京大学的熏陶,成就了我的文化品位
我闲遐时研究中国古代史,尤其是清史
我也跟得上时代的潮流
经常看美国电影
特别是那种探讨人生的社会伦理片
喜欢揣摩电影人物的心理活动
经常跟上流社会打交道,我很厌烦
所以也经常体察下情
我很关心普通老百姓的生活细节
关心老百姓的富裕水平
我注意调节贫富不均
引起社会的强烈反响
听说有人想采访我
这种采访我以前做得太多了
就去外地躲清静
正好修身养性
你们知道,我这个层次的人是肯定不会坐火车去的
不过因为我的名气太大,全国都知道我
还是被请去做访谈
还管吃管住
免费健身
回来后我经常上网
我对理想伴侣的要求并不高
你来了以后我会给你吃很多冰激淋
也要跟你一起建立家庭
我绝不会对你强硬
晚上要跟你一起看星星
亲爱的你来吧,你第一眼看到我,就会很满足!
这样描述,正好是你梦寐以求的人生伴侣,于是当天就见面了
见面以后才发现,原来他说的跟现实有出入。可是当我问他为什么要骗人,他却把他的自我介绍拿出来,一句一句给我解释,我才发现原来。。。。。。(请往下看)
注释版:
我是个成熟男人—————————57岁
但是我的长相显年轻———————–满脸粉刺
体形魁梧,给人一种大哥的感觉————–武松的大哥
我事业成功,是个老板———————-冷饮摊老板
走到哪里都拎着笔记本———————是记录冷饮销售量的笔记本
我坐的车比林肯车还宽敞——————-公共汽车
多年在北京大学的熏陶,成就了我的文化品位—-曾在未名湖旁边卖冷饮
我闲遐时研究中国古代史,尤其是清史———爱看《还珠格格》
我也跟得上时代的潮流———————知道今年哪种冷饮好卖
经常看美国电影—————————美国A片
特别是那种探讨人生的社会伦理片————乱伦A片
喜欢揣摩电影人物的心理活动—————-经常幻想自己是A片主人公
经常跟上流社会打交道,我很厌烦————北大校长多次跟我讲:“湖边禁止摆摊!”
所以也经常体察下情————————只好去居民小区摆摊
我很关心普通老百姓的生活细节————–看谁家门窗没关好
关心老百姓的富裕水平———————入室以后,看有哪些值钱的东西
我注意调节贫富不均————————把值钱的东西拿回自己家
引起社会的强烈反响————————小区居民对连环盗窃案既愤怒又恐惧
听说有人想采访我————————–警察要来抓我问话
这种采访我以前做得太多了——————-被抓过很多次
就去外地躲清静—————————–逃窜
正好修身养性————-修理跳窗时落下的伤口,养几个性伙伴,你们知道,我这个层次的人是肯定不会坐火车去的—-骑三轮车去天津,不过因为我的名气太大,全国都知道我—-上了公安部的“全国追逃”互联网
还是被请去做访谈————————–终于被抓
还管吃管住——————————-三年有期徒刑
免费健身———————————-劳动改造
回来后我经常上网————————–继续找419
对理想伴侣的要求并不高——————-只要比我高就可以
你来了以后我会给你吃很多冰激淋————-当天卖不掉,快融化的
也要跟你一起建立家庭———————-你要帮我盖窝棚
我绝不会对你强硬————————–阳萎多年
晚上要跟你一起看星星———————-窝棚没有屋顶
亲爱的你来吧,你第一眼看到我,就会很满足!—-不想再看第二眼。
我在这个区玩过两个号,一个68鬼王╄永恒╄云天 ,一个60青云云天帅帅,对冲级也算有些心得,在这里写出来给大家分享.(鬼王号因为感情上面出了些问题,所以我没玩了,练了个小青云,虽然我两个号都没到75,但是好多朋友都75了,我向他们请教过的,而且只要掌握的冲级的方法,也可以说有冲75的经验了,
)
这个游戏杀怪的经验相对较少,任务经验相对比较高,也就是说,任务越快,升级就越快.因为大部分任务都能共享,所以组队刷任务成了升级的最快法门,即使刷传功任务,也是组队刷才划算.
在这里先介绍一下诛仙里的各种任务.
诛仙任务:黄金色任务。经验高,但是跑路多.
游历任务:蓝色任务。经验高,也是跑路多。到一定级别就能接到相应的任务(多使用查找最新任务这个功能)。经验颇高,而且有称号奖励。
挑战任务:红色任务。。很难接到,经验颇高,有几率得到物品奖励比如:魔影(天工宝鉴)。
寻宝任务:橘黄色任务。很低等级可以接到,完成任务需要的道具都要从寻宝任务中随机获得。很难接到,经验一般。有物品奖励。
但是好浪费时间
平妖任务:暗绿色任务,经验高,容易接到。
试练任务:白色任务,接得最多的任务.60级以前有概率得到紫星石,60以后有概率得到暗月石,刷当级别传功必备.
诛仙任务和游历任务的特点就是经验奖励高,但是做起来麻烦,很耗时间.建议有效率队伍的时候不要做诛仙任务和游历任务,队伍效率的时候刷任务管理员那里接的任务,那是最快的,一满队人,10来分钟就可以刷一轮任务(5个任务接满).但是人总有落单的时候,你不可能永远在效率队伍里的,特别是级别冲到了前面就比较孤单了,队伍很难组了,这种时候就做诛仙任务和游历任务比较划算了.
要什么样的队伍才算效率呢?我个人觉得职业无所谓,因为这个游戏的职业平衡比武林好,组满队以后,每种职业都可以做为输出,都可以贡献自己的力量,所以我组人一般都不分职业.在我的概念里,大家级别差不多,都努力打怪不偷懒,5到6个人的队伍就是效率队伍了.
有了效率的队伍以后,就是升级的路线了,下面介绍一下我升级的路线,供大家参考.
1到15级就很简单了.做完这个级别的诛仙和游历就差不多14级了,到了14级没有诛仙任务和游历任务了,就组好队伍去任务管理员那里接试练任务吧,这个级别主要刷去草庙村路上的怨灵和凶灵这两种怪的任务,大概个把小时不到就可以到15级了,选择好自己的门派组转职去吧.
转好职业就该去青云混了,做完青云地图的诛仙任务和游历任务,你也差不多23级了,这时候刷野猪,通臂猿的任务升到24.
24到28:组好效率队伍,在青云任务管理员那里接剑奴和剑魔的任务,接满5个,就去青云后山刷怪了,如果队伍好,大概10分钟就可以刷完任务回去交了.这个级别就不停的刷这里的任务.
28到30:在后山升到了28就可以接到猫女,神火教护法,幼齿猫女的任务了,因为这几种怪的位置距离城里比较远,路上很容易造成队伍分散,所以建议队伍里的人一起接任务一起去刷,然后一起回来交任务.在这里刷到30以后就换装备吧,准备去天音咯.
30到34:30级以后,诛仙任务和游历任务在升级的时候占的比例比较小了,所以在有效率队伍的时候建议先不做,等每队伍的时候再做.这个级别就接门口的鸦人和黑熊兽妖的任务,也是接满5个任务直奔怪点去刷,经验相当快.
34到38:这个级别主要接骷髅魔兵和山贼的任务,最近的骷髅魔兵和山贼在天音地图的仙姝林,这个级别段也是比较好冲的.
38到42是天音地图最难冲的,因为这个级别要刷的是流寇和骷髅魔兵,而这两种怪的任务相对比较少,任何一种怪的任务都接不满5个,所以一般接三个流寇任务,两个骷髅射手的任务,而最让人郁闷的是,这两种怪是分开的,不象前面的怪在一个区域.所以队伍很容易分散,因此还是建议大家统一行动,一起接任务,一起交任务.
42到45是比较好冲的,前面刷了那么多任务,这个时候你的紫星石应该不少了吧,做做传功,做做游历和诛仙任务,很容易就44了,到44以后建议不要刷传功,因为44级可以接到很多人梦想的马牌任务,所以建议44以后接凶鸦和嗜血妖僧的白任务刷,这样刷到马牌的概率大,而且冲级也快.
到了45级就去河阳自己的门派使者那里接转职任务吧(顺便鄙视一下完美,鬼王的转职要杀500个比自己级别高的蜘蛛,而且是在换装备之前杀,太变态了,偶当时杀了一个下午啊)
做完转职就该去流波混了,升级没其他法门,还是组起效率队,队伍效率才是升级的王道.
45到49:到了流波以后我几乎就放弃了做诛仙任务和游历任务了,这个级别段就不停的刷门口的蜘蛛(毒蜘蛛和5花蛛),组好队伍接好任务,就开始冲级吧.
49到53:这个级别主要刷螃蟹(铁背蟹和横行蟹),怪也在门口,螃蟹和蜘蛛都在门口,离村子里好近的,所以这段时间冲级显得很轻松.
53到57:这个级别主要刷海女和流波海贼.这里的任务在地图上看起来好象离村子比较远,其实并不远的,因为渡口那里有个传送,那里传送过去很快就到鱼澄溪和流波水塞之间那块沙滩就是这两种怪的最近点,我一般都组队伍去那里刷,因为近嘛,所以刷任务快些的.
57到60:这个级别段比较难升,任务比较难接,而且是血蜘蛛,流波海盗和远古犀甲人这三种怪的任务,最变态的就是血蜘蛛了,技能多多,还是主动攻击的,可怜我的小青云,云天帅帅在那里挂了N次咯(网络卡,米办法).所以我一般都接海盗和犀甲人的任务去那里刷,能不接血蜘蛛的就尽量不接(偶怕怕).要想尽快结束这段非人的生涯,紫星刷传功是必不可少的,不过那是有钱人的玩法,仅贡参考哈.
到了60去死亡沼泽,升级又开始变容易了.
60到65:以前一直是接耕地任务,接了任务跑到任务地点,然后回来交,一分钟可以做两次,升级很快的,不过现在更新了之后,貌似耕地任务每以前那么好接了,以前60级到75级,有这个任务都是必接的.现在不好接到耕地任务了,就只要刷门口的死泽孤魂和死泽巨鳄好了,怪点里城近,升级刷任务都很容易,还有暗月石(60级以后的传功任务必须)拿.
65到68:这个级别刷的是蚂蚁(蜢毒蚁和腐尸蚁),怪在长生堂废墟处,接好任务组好队就开始刷吧,跟前面升级也没什么两样.
68到72:主要刷死泽铁鳄和毒血飞芒,怪在毒蚁巢处,65到68刷的怪都离村子不算远,练起来也算比较容易吧,只是升级需要的经验多了,花的时间当然也要多些,但是这个是一种必然,没办法解决的.68级以后打怪好耗药,因为怪的攻击太高了,但是打出来的东西也很值钱,比如75的配方,一个就可以卖 10来金,再比如75的材料,那也是高价啊,所以在这里是不会穷的,放心大胆的喝药冲级吧.
72到75:到了72,你也是个高手了,也不用我多说什么,就接死泽野鬼和死泽鱼人的任务刷,怪在内泽那里,离城里也不算远,但是这个时候升级需要的经验实在是太多了,需要的时间也太多了,不过好在前面应该刷到了不少暗月石,刷传功应该可以帮助你升一级,如果你有钱,也可以收暗月石刷,如果没钱,那就只好和时间赛跑,和队伍效率赛跑了
以上这么多,总结成一句话就是,效率队伍刷同等级怪的任务是升级的王道(如果你是有钱人,可以不停刷传功,那你可以是例外,但是刷紫星也要效率队伍才划算,效率的队伍始终是冲级的必须).
打了5600多字哇,大家看完一定要顶哦.
==== 15天学会jQuery ====
<html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 11) — 使用不苛刻的javascript代码实现多文件上传</div></html>
好几个月以前,当我在追逐互联网上AJAX热潮的时候,我在 [[http://www.fiftyfoureleven.com/resources/programming/javascript|FiftyFourEleven网站]]上发现了一篇使用创新的javascript代码实现当时正在困扰我的“ [[http://the-stickman.com/web-development/javascript/upload-multiple-files-with-a-single-file-element/|单文件元素实现多文件上传]]”的文章。
所以当我想写作《15天漫游jQuery》的时候,我第一个想到的就是用jQuery实现这个功能。
**__接触易用性狂热爱好者__**
几天前当我检查网站记录的时候,发现了一条遗漏的文章trackback。跟过去看的时候我发现我的两篇jQuery文章被作者引用来证明他为什么讨厌javascript。
根据这个人的说法,任何工具或技术如果没有将易用性放在第一位都将成为垃圾。
尽管我很不同意这位仁兄一杆子打死的态度,但他还是让我对这篇详细教程有所留意。当我在编写一个简单网页效果的时候,我会尽量小心谨慎的处理。这样如果网站访客们决定关闭javascript代码执行功能的时候,他们仍然可以正常使用网站的功能。
**__关于第一价值的两个教程__**
* 使用一个文件输入元素实现多文件上传,并让整个交互过程流畅舒适。
* 让多文件上传更加人性化,但要避免以牺牲可用性为代价。关键在于使用不苛刻的javascript代码制作多文件输入区域。
**__演示__**
* 只有一个文件输入元素,但添加了jQuery和其他代码实现较为亲近用户的多文件上传功能。
[[http://15daysofjquery.com/examples/multiFile/demo1.php|演示一地址]]
* 在页面(x)html代码中使用了多个文件输入元素,但通过jQuery调整为与第一个演示类似的显示页面效果。优点是代码是不苛刻的。。。即使关闭了javascript执行,用户也能上传多个文件。
[[http://15daysofjquery.com/examples/multiFile/demo2.php|演示二地址]]
**__解释__**
**单文件输入框**
jQuery的$(document).ready() 函数的工作有两个:
在文档下载量最大的时候创建一个div元素。
查找文件上传框(假设这里只有一个),然后给它附上一个onChange事件。
<code java>
$(”input[@type=file]”).change(function(){
doIt(this, fileMax);
});
</code>
doit()函数(简单又好记,呵呵~)检查是否达到了最大文件数量限制,如果不是,它会隐藏当前文件输入框,在父div里添加一个新的文件输入框,将输入框内的文件名使用id “files_list”作为标记,在最后添加一个“删除”按钮。
在DOM树中导航,我使用jQuery的parent()函数,然后用remove()函数移除元素。我还使用了append()和prepend()函数分别添加文件名和新的输入框。
两个关键点
- 最大文件上传数量设定:
<code java>
var fileMax = 3;
</code>
- 输入框必须有适当的定位措施:
<code java>
<input type=”file” class=”upload” name=”fileX[]”/>
</code>
这样弄以后输入框可疑由访问者决定添加还是删除,没有任何关于id或名称的操作。当这个窗体代码发送给服务器端脚本的时候,相关信息就已经被存放在了一个数组中了。
**__多文件输入框__**
首先,文件允许上传的数量由页面中的文件输入框的数量决定。其次,你仍然需要通过某种方法为每个输入框接收到的内容用一个数组存放。
<code java>
<input type=”file” class=”upload” name=”fileX[]”/>
</code>
第二个演示跟前面的比起来最大的不同在于,我遍历了每个文件输入框并在其内容有改动时执行doit()函数。通过遍历每一个输入框,我可以为我的代码添加有用的额外信息:输入框内容在“堆栈”中的顺序。
换句话说,当这段代码执行时,它会特别指定第一个输入框,或者第二个,抑或第三个。
代码见下:
<code java>
$(”input[@type=file]:nthoftype(”+
n+”)”)
</code>
jQuery的灵活性允许我们使用CSS和XPath描述语句定位指定的元素位置。
你会发现当一个文件被选中时,文件输入框都会被文件名称覆盖。点击文件名就可以选择其他不同的文件。
—-
<html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 12) — jQuery Lightbox (插件)</div></html>
Cody Lindley 移植的第一版“ [[http://codylindley.com/Javascript/257/thickbox-one-box-to-rule-them-all|Thickbox]]”让我第一次感受到了jQuery的魅力。后来他又做了一些 [[http://codylindley.com/Javascript/257/thickbox-one-box-to-rule-them-all|代码升级]]以修复若干跨浏览器的兼容性问题。
**__一些需要注意的地方__**
$(document).ready 取代了TB_init() 函数,作用是在每个包含对象名“thickbox”的链接上附加一个onClick事件。
<code java>
function TB_init(){
$(”a.thickbox”).click(function(){
var t = this.title || this.innerHTML || this.href;
TB_show(t,this.href);
this.blur();
return false;
});
</code>
当这些链接被点击时,TB_show()函数就将执行。
<code java>
$(”body”)
.append(”<div id=’TB_overlay’></div><div id=’TB_window’></div>”);
$(”#TB_overlay”).click(TB_remove);
$(window).resize(TB_position);
$(window).scroll(TB_position);
$(”#TB_overlay”).show();
$(”body”).append(”<div id=’TB_load’><div id=’TB_loadContent’><img
src=’images/circle_animation.gif’ /></div></div>”);
</code>
如你所见,在文档body元素前添加了两个div元素。换句话说,这两个div元素将被添加在页面html代码的body关闭元素前。
覆盖的div将使用一个特定的包含不透明外表的CSS文件指定表现。TB_window的代码用来通过AHAH在页面中放置一张图片或者加入另一个页面。$(window).resize 和$(window).scroll 告诉jQuery在用户重新调整窗口大小或者拖动页面翻页的时候执行TB_position函数。这是保证Thickbox始终保持在窗口中心部位的手段。
接下来,Cody查询url的后缀。
<code java>
var urlString = /.jpg|.jpeg|.png|.gif|.html|.htm|.php|.cfm|.asp|.aspx|.jsp|.jst|.rb|.txt/g;
var urlType = url.match(urlString);
if(urlType == ‘.jpg’ || urlType == ‘.jpeg’ || urlType == ‘.png’ || urlType == ‘.gif’){//code to show images
</code>
如果这是一个图片文件,则jQuery的append函数会添加html代码到适当位置。
<code java>
$(”#TB_window”).append(”<a href=” id=’TB_ImageOff’ title=’Close’><img
id=’TB_Image’ src=’”+url+”‘ width=’”+imageWidth+”‘ height=’”+imageHeight+”‘
alt=’”+caption+”‘/></a>”
+ “<div id=’TB_caption’>”+caption+”</div><div
id=’TB_closeWindow’><a href=’#’ id=’TB_closeWindowButton’>close</a></div>”);
$(”#TB_closeWindowButton”).click(TB_remove);
</code>
另外,远程文件将使用jQuery的load()函数导入。
<code java>
$(”#TB_ajaxContent”).load(url, function(){
</code>
—-
<html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 13) — jQuery 表格</div></html>
一位叫Klaus的朋友编写了一个小插件, 用jQuery实现可用性极佳的[[http://stilbuero.de/2006/05/13/accessible-unobtrusive-javascript-tabs-with-jquery/|javascript表格]]。
设置好正确的(x)HTML 和CSS后,你可以像下面那样创建表格:
$.tabs(”container”); // first tab on by default
如果你像在默认位置“上方”再添加一个表格:
$.tabs(”container”, 2); // second tab on
Klaus这里 [[http://stilbuero.de/demo/jquery/tabs.html|示例]],你可以看看最终效果。
**__我的改版__**
我稍微修改了Klaus的代码,[[http://15daysofjquery.com/examples/jqueryTabs/|添加了一个简单的表单用来生成表格的表头]]。
**__用法:__**
非常简单。只需要输入每个表格的表头(最多5个),然后点击表单下方的按钮。下一个页面将生成结果HTML代码,你可以复制然后粘贴到文件中。
你还需要 下载Klaus网站的[[http://stilbuero.de/2006/05/13/accessible-unobtrusive-javascript-tabs-with-jquery/|CSS文件]],做些你自己的修改,当然还要上传jQuery框架库到你的服务器上。
[[http://15daysofjquery.com/examples/jqueryTabs/|这里]]是表格生成器的地址。
—-
<html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 14) — Javascript 工具提示</div></html>
Cody Lindley ,Thickbox的作者,日前发布了 [[http://codylindley.com/Javascript/264/jtip-a-jquery-tool-tip|jTip - jQuery]] 工具提示。
我对其中很多[[http://www.codylindley.com/blogstuff/js/jtip/|想法和思路]]拍案叫绝。我知道你已经看过很多类似的工具提示代码了。但是,Cody 的方法已经在我的工作中显露出了闪光点。
当我检查HTML代码时,我发现了一个大问题,可访问性。链接在javascript关闭的时候无法工作。我并不是倾向于一定要实现全面的可访问性,只是在这里我认为可以有其他更具亲和力的方式实现相同的功能。
尤其是,我个人不喜欢那种为了可访问性而去牺牲可用性来实现在提示框上链接另一个页面链接的方法。我喜欢这个提示框 - 不是对Cody不尊重,只是在我这里我“需要”它能够在各种情况下工作。
今天我要提供给大家的是Cody的工具提示代码的小小修改。如果你不是Cody工具提示的爱好者的话,我的改版对你来说也许不是很在意。但如果你喜欢他的作品同时希望它可以在javascript关闭的时候照常工作,这个也许是你需要的。
**__我的改动__**
让我产生修改想法的,是他的代码在Yahoo上的应用。我不喜欢他使用的代码:
<code java>
<a href=”yahoo.htm?width=175&;link=http://www.yahoo.com”
name=”Before You Click…”
id=”yahooCopy”
class=”jTip”>Go To Yahoo</a>
</code>
所以我重写了他的部分代码,成了现在这个样子:
<code java>
<a href=”http://www.yahoo.com”
rel=”yahoo.htm?width=175&link=yahoo&name=Before%20
%20You%20Click…”
id=”yahooCopy”
class=”jTip”>
Go To Yahoo</a>
</code>
[[http://15daysofjquery.com/examples/jqueryTooltips/demo2.php|我的示例]]
**__改进:HTML标准校验__**
我的代码可以通过w3.org的测试
**__改进:命名__**
在我修改Cody的代码的时候我发现他使用了一个用来存储链接名称的叫做“title”的变量名,这会导致一些混淆。
我标出了这个命名问题,即使我认为这不过是个小小的失误。
**__改进:可用性__**
使用我的代码,你可以让每个提示框都含有真实链接地址到另一个文档,不管内部的还是外部的。或者你只是想要那个提示框,不想关心可用性,你同样可以让链接部分留空。
选择权在你。
**__感谢__**
Cody提供了伟大的代码,帮助我节省了大量的时间和精力。我的修改只是对原有代码的轻微“调整”,希望朋友们喜欢。
—-
<html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 15) — 拖拽效果和选择器</div></html>
==== 15天学会jQuery (6-10) ====
<html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 6) — 更安全的Contact Forms,不带CAPTCHA</div></html>
这次的教程内容贴近我擅长的技术方向:安全的contact forms。
就像我在前一篇教程中提到的那样,一个最普通的contact forms可以帮助访客同你进行通信来往而不需要暴露你的电子邮件地址给那些可恶的垃圾邮件制造者们。
但如果spammer们已经盯上你,没有什么比一个不安全的contact foms更糟糕的了。想象一下你的网络空间提供商发给你一封措辞强烈的电子邮件,通知说:他们发现你的网站发送了大批量的性药广告以及其他垃圾邮件,另外,直到你停止这种行为之前,你的网站都将处于离线状态–谢谢!
那么,今天我要在这篇教程里告诉大家的是一种在任何contact forms上添加一个额外安全层的简单方法-即使你没有使用我提供的超级安全、超级灵活的Ultimate Form Mail。
**__当前状况__**
你意识到spammer们已经通过远程探测技术发现了你的contact forms的弱点,而你希望他们走开。
**__难点__**
你不想使用CAPTCHA(Completely Automated Public Turing Test to Tell Computers and Humans Apart),因为你明白,让你的访客先去阅读那些歪七扭八的字母数字才能发送消息只能抑制他们想要互动的欲望,而不是促进它。(数字验证的缺陷)
{{jquery中文指导:captcha.png|}}
关键点:你希望那些坏家伙们堵车到天黑,同时希望那些好孩子们一条大道通罗马。
**__解决方案__**
你将学会在页面加载的时候使用jQuery来给你的contact forms添加一些隐藏的标签信息。当窗体信息被提交到服务器端的时候,你可以用一些简单的php代码实现如下的步骤:
隐藏的标签被识别出来
隐藏标签的信息与你的网站访客下载到浏览器上的cookie里的某项标志相一致
隐藏标签的有效时间还未过期
换句话说,你的访客们只有在一段有限的时间内才可以填写窗体并进行发送。如果一个spammer尝试通过远程调用来提交窗体信息到你的服务器,他们将会发现自己踢到了一块又厚又硬的铁板,不付出点代价休想通过。
我将要告诉你的这种方法是从一位非常聪明的同事Chris Shiflett提供的蓝本基础上修改而成的。他是位专业的安全专家,对php程序员经常遇到的安全问题了如指掌(我怎么感觉他又要忍不住提到他的Ultimate Form Mail 了~~汗)。
**__教程__**
基于上次那篇《斑马线表格轻松制作》的反响良好,我决定再次制作一次类似的“手把手图文教程”。虽然要花费些时间,但很值得这么做。
[[http://15daysofjquery.com/examples/contact-forms/|手把手教程]]
[[http://15daysofjquery.com/examples/contact-forms/code/demo.php|DEMO]]
[[http://15daysofjquery.com/examples/contact-forms/code/|源代码]]
**__银弹?__**((解决一切问题的方法))
<code java>银弹是软件领域的说法,意为解决一切问题的方法。这个来源于欧洲的传说,说是只有银弹可以消灭狼人。</code>
“那么,现在我的窗体就是100%安全的,可以假设任何免费的cntact forms程序,然后高枕无忧了?”
呃。。。非也。
这种安全模式基于一个关键的假定:**Spammer们总是会拿软柿子捏,浪费时间去解决一个狡猾的对手对他们来说就是浪费金钱。**
现在, 好好听着,我的朋友们:
这个技术,尽管相当健壮,但仍然不是解决目前脆弱的窗体处理程序问题的灵丹妙药。
我的这些安全建议的目的是为了让spammer们知难而退。小偷们入室盗窃之前总会进行仔细踩点,他们只对那些可以用最小代价获取最大利益的房间感兴趣。
换句话说,如果在他们动手之前有99%的机会挡住他们的试探,而且实现起来相当容易,为什么不试一试呢?这才是此项技术要实现的目标。
但这还是治标不治本,不能解决所有问题。
—-
<html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 7) — 样式表切换</div></html>
我第一次看到样式表切换器是在[[http://alistapart.com/|A List Apart]]或者[[http://www.simplebits.com/|Simple Bits]],那是两个设计师最应该去的网站。
从那以后,我找到了很多可以让访客通过鼠标点击某个地方切换样式表的方法。但最近我要写一篇如何 使用jQuery编写简单代码实现它的教程。
我将向你们逐步解说整个的过程,不仅仅因为要展示jQuery代码的简介,同时也要揭示jQuery库中的若干高级特性。
**__首先,代码__**
<code java>
$(document).ready(function()
{
$(’.styleswitch’).click(function()
{
switchStylestyle(this.getAttribute(”rel”));
return false;
});
var c = readCookie(’style’);
if (c) switchStylestyle(c);
});
function switchStylestyle(styleName)
{
$(’link[@rel*=style]’).each(function(i)
{
this.disabled = true;
if (this.getAttribute(’title’) == styleName) this.disabled = false;
});
createCookie(’style’, styleName, 365);
}
$(document).ready(function()
{
$(‘.styleswitch’).click(function()
{
switchStylestyle(this.getAttribute(”rel”));
return false;
});
var c = readCookie(’style’);
if (c) switchStylestyle(c);
});
function switchStylestyle(styleName)
{
$(‘link[@rel*=style]’).each(function(i)
{
this.disabled = true;
if (this.getAttribute(‘title’) == styleName) this.disabled = false;
});
createCookie(’style’, styleName, 365);
}
</code>
其他这里没有提到的部分是你将在后面看到的创建和读取cookie的函数。
**__熟悉的开篇__**
<code java>
$(document).ready(function()
{
$(’.styleswitch’).click(function()
</code>
告诉jQuery“以最快的速度查找所有包含对象名‘styleswitch’的元素,并在他们被鼠标点击时执行一个函数”。
看起来不错。当鼠标点击预先指定的元素时,switchStylestyle函数将被调用。从现在开始是重点。
这句话什么意思?
第一次看到这句代码的时候我的脑子有些卡壳:
$(’link[@rel*=style]’).each(function(i)
{
在互联网上搜索了一下后我空手而归。最后不得不找到了jQuery的作者John Resig,向他咨询。
他直接给了我一个[[http://jquery.com/docs/CSS/|jQuery网站的页面]]地址,里面讲解了若干jQuery提供的[[http://jquery.com/docs/XPath/|高级特性(xpath)]],可以用来查找并操作页面中的若干元素。
如果你看过这些东西你就能明白上面那句神秘的代码的含义是告诉jQuery“查找所有带rel属性并且属性值字符串中包含‘style’的link链接元素”。
嗯?
让我们看看如何编写包含一个主样式表,两个备用样式表的页面:
<code java>
<link rel=”stylesheet” type=”text/css” href=”styles1.css” title=”styles1″ media=”screen” />
<link rel=”alternate stylesheet” type=”text/css” href=”styles2.css” title=”styles2″ media=”screen” />
<link rel=”alternate stylesheet” type=”text/css” href=”styles3.css” title=”styles3″ media=”screen” />
</code>
我们可以看到所有样式表都含有一个包含‘style’字串的rel属性。
所以结果一目了然,jQuery轻松定位了页面中的样式表链接。
**__下一步?__**
each()函数将遍历所有这些样式表链接,并执行下一行中的代码:
<code java>
this.disabled = true;
if (this.getAttribute(’title’) == styleName) this.disabled = false;
</code>
“首先禁用所有的样式表链接,然后开启任何title属性值与switchStylestyle函数传递过来的字串相同的样式表”
一把抓啊,不过很有效。
现在我们需要保证的是那些样式表存在并且有效。
**__完整代码和演示__**
既然 Kelvin Luck已经编写了这些代码,我就不在这里重复了。
[[http://www.kelvinluck.com/assets/jquery/styleswitch/|DEMO]]
我相信Kelvin的灵感是从 这个网站那里得到的,我们正好可以看看使用其他工具实现这个功能是否要比jQuery更加复杂冗长。
—-
<html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day
— 使用Javascript(jQuery)实现圆角边框</div></html>
当我看到这些实现圆角边框的HTML源代码的时候,我发现这很适合用来写一篇jQuery教程–使用wrap()、prepend()、append() 函数。
这里是原先的HTML代码,我们将从这里开始:
<code java>
<div class=”dialog”>
<div class=”hd”>
<div class=”c”></div>
</div>
<div class=”bd”>
<div class=”c”>
<div class=”s”>
<main
content goes here >
</div>
</div>
</div>
<div class=”ft”>
<div class=”c”></div>
</div>
</div>
</code>
现在我们怎么使用jQuery来精简这段代码呢?
首先,我们需要一个“钩子”,一个特殊的HTML元素,或者一个id,或者一个对象名–来告诉jQuery处理的目标。
现在我们改成了这个样子:
<div class=”roundbox”>
<main
content goes here >
</div>
下一步,我们使用jQuery来将剩下的代码添加进去:
<code java>
$(document).ready(function(){ $(”div.roundbox”) .wrap(’<div
class=”dialog”>’+
‘<div class=”bd”>’+
‘<div class=”c”>’+
‘<div class=”s”>’+
‘</div>’+
‘</div>’+
‘</div>’+
‘</div>’);
});
</code>
**__其他Div标记去哪里了?__**
仔细观察代码,你就会发现它们都跑到了js代码里面,在wrap函数执行时它们将嵌套在“钩子Div”的内部。
细心的观众会发现我漏掉了部分代码。这是因为jQuery中的wrap()函数要求div标签必须严格对称嵌套才能工作。
具体的,我去掉了下面两个部分:
<code java>
<div class=”hd”><div class=”c”></div></div>
<div class=”ft”><div class=”c”></div></div>
</code>
**__添加和预置一体化__**
下一步我们将会通过prepend和append函数将这两段代码添加进带有dialog对象名的div标记内部,并且使用“连锁”方法。
<code java>
$(’div.dialog’).prepend(’<div class=”hd”>’+
‘<div class=”c”></div>’+
‘</div>’)
.append(’<div class=”ft”>’+
‘<div class=”c”></div>’+
‘</div>’);
</code>
**__示例及代码__**
我已经在网上放置了一个[[http://15daysofjquery.com/examples/rounded/demo.php|演示页面]]供大家查看。建议你看一下页面的源代码,体会jQuery给页面代码带来的清爽和便捷。
这些代码来自 [[http://www.schillmania.com/content/entries/2006/04/more-rounded-corners/|Schillmania的一篇文章]],个人推荐大家下载包含点缀图片的zip打包,非常精美。
**__不使用图片的圆角边框__**
有很多方法可以实现圆角边框–有些方法甚至不需要图片。
在jQuery的网站上有一个用来制作[[http://methvin.com/jquery/jq-corner-demo.html|无图圆角边框的插件]]。虽然不是适合所有人(或者说所有程序),但也值得学习。
看看它的漂亮代码吧(使用时):
<code java>
$(document).bind(”load”, function(){
$(”#box1″).corner()
});
</code>
—-
<html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 9) — 快速和略显粗劣的AJAX视频教程</div></html>
今天我的想法有点改变。近段时间以来我一直考虑注册一个YouTube帐号来上传一些教程录像,现在我终于做出了决定并上传了一个。在这里我将手把手的向大家演示为你的网站添加一些AJAX基本应用的方法。
录像很短,因为YouTube对上传影片的长度有限制(10分钟以内)。当然由于制作仓促,错误在所难免。比如在某个地方我称CGI为“服务器端脚本”,而更准确的说法应该是“服务器端语言”。
这是AJAX,还是AHAH,抑或AXAH?
你将看到的东西其实更接近AHAH而不是纯粹的AJAX。
有什么区别么?AJAX中的“X”代表着XML。但更多时候人们喜欢使用简单的文本或者javascript代码或者单独文件而不是那种复杂冗长的XML。对此有篇文章有详细论述:[[http://microformats.org/?p=67|AJAX vs. AHAH]]。
至于AXAH。。。 Cody Lindley的[[http://codylindley.com/Javascript/237/axah-asynchronous-xhtml-and-http-crawl-before-you-ajax|文章]]可以解释一切。对AJAX的一些工作理念有兴趣的读者可以看一下。
**__[[http://www.youtube.com/v/XdUFjAvOPU0|教程录像]]__**
这个[[http://jquery.com/demo/ajax/|页面]]上有我提供的演示。
—-
<html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 10) — 使用jQuery Javascript 库实现“即点即改”的AJAX化</div></html>
以前我在[[http://www.quirksmode.org/index.html?/dom/cms.html|Quirksmode网站]]见过这种代码,后来又在[[http://24ways.org/advent/edit-in-place-with-ajax|24 Ways网站]]看到了一个更具Web 2.0风格的方案。这次我将为大家展示两种使用jQuery实现相同功能(甚至更好)的方法。
**__目标__**
一个用AJAX(或AHAH)技术设计的页面,访问者无需离开就可以在看到的(x)HTML
页面上编辑内容。
**__方案__**
点击需要编辑的文本,变幻出一个带有保存和取消按钮的textarea。修改的部分将通过AHAH传送至服务器端的一个PHP脚本文件,用来更新数据库(MySQL或普通文件)。
**__演示__**
[[http://15daysofjquery.com/examples/jqueryEditInPlace/divEdit.php|AJAX式即点即改演示]]一
在这第一个演示中,我使用了一个id为“editinplace”的div元素。当鼠标划过这里时,背景颜色将变成浅黄色。点击文本将启动一些DOM操作,div元素被一个textarea元素取代–内中包含原先的文本。
点击保存按钮将向服务器端的PHP脚本文件发送新的HTML内容,并重新输出收到的新文本内容(通过 $_POST)。
在真实应用环境下,你还应当添加一个安全性检测,然后才能更新数据库并返回更新后的页面内容,同事告知jQuery执行成功的信息。
但在这个例子中,所有的修改都是成功的,发送给PHP脚本的信息将原封不动的返回到jQuery代码,显示到一个普通的警告窗口里。
**__解释__**
开头部分说了很多次了,如果你不想使用jQuery提供的document.ready函数,尽可以选择你自己中意的init()函数。
<code java>
$(document).ready(function(){
setClickable();
});
</code>
页面上第一个被执行的就是这个setClickable()函数。它的任务就是做以下内容:
查找包含id为“editinplace”的div元素,然后告诉jQuery在这些div被点击时执行某些操作。
<code java>
function setClickable() {
$(’#editInPlace’).click(function() {
</code>
读取div内部的HTML代码的任务将交给jQuery的html()函数来完成。这些HTML将会额外添加若干代码以组成textarea里的保存和取消按钮。
<code java>
“var textarea = ‘<div><textarea rows=”10″ cols=”60″>’+$(this).html()+’</textarea>’;
var button = ‘<div><input type=”button” value=”SAVE”
class=”saveButton” /> OR <input type=”button” value=”CANCEL”
class=”cancelButton” /></div></div>’;
var revert = $(this).html();
</code>
同样还是这些在div内部找到的HTML代码将会赋值给一个叫做“revert”的变量。这个变量将用来在取消按钮被按下的事件中输出原始文本。
<code java>
var revert = $(this).html();
</code>
jQuery的DOM函数“after”用来将新生的textarea HTML代码放置在我们指定的div元素后。我在后面紧跟着连锁上了一个remove()方法 来移除div元素以节省代码。
<code java>
$(this).after(textarea+button).remove();
</code>
在使用jQuery的时候,我通过对象名来定位保存和取消按钮对象。我指示jQuery在任一按钮按下时触发最后一个函数“saveChanges”。我告诉了jQuery在div元素被点击时做什么事情,但我没有在最后加上省略号因为我希望在这个div操作语句后面连锁其他方法。
<code java>
$(’.saveButton’).click(function(){saveChanges(this, false);});
$(’.cancelButton’).click(function(){saveChanges(this, revert);});
})
</code>
我再连锁了一个简单的mouseover和mouseout事件,告诉jQuery在鼠标指针掠过我们指定的div元素(id=editInPlace)的时候添加和移除一个对象。
<code java>
.mouseover(function() {
$(this).addClass(”editable”);
})
.mouseout(function() {
$(this).removeClass(”editable”);
});
};//end of function setClickable
</code>
函数“saveChanges”将以按钮对象做为第一个参数,而cancel参数则取两种值,false或者保存在revert变量中的html代码内容。
<code java>
function saveChanges(obj, cancel) {
</code>
如果cancel为假,则函数将保存更改并使用html格式发送给服务器端的php脚本。我在这里使用了jQuery内置的一个DOM函数实现对textarea内容的提取操作:parent()和siblings()。
<code java>
if(!cancel) {
var t = $(obj).parent().siblings(0).val();
</code>
DOM基础超出了本系列教程的范围,但在这个应用中我只是告诉了jQuery“对象(保存按钮)有一个父元素(div)。。。去找到它。那个元素拥有一个或多个DOM树同级对象。。。我只想找到其中的第一个。然后提取那个对象的所有内容。”
(稍等。。。如果你对DOM风格的代码不是很熟悉的话,前面我的注释可能并不好理解。我还是建议你之前google一下“DOM javascript”或者其他相关的信息。)
这些html赋值给了t变量,现在要通过POST方法把它发送给test2.php。
<code java>
$.post(”test2.php”,{
content: t
},function(txt){
alert( txt);
});
}
</code>
如果cancel有一个值,那么必然是保存在revert变量中的原始html内容。所以,在这个时候我希望变量t变为原始html内容。
<code java>
else {
var t = cancel;
}
</code>
下一步是通过jQuery提供的DOM函数放置一个新的div元素,id为“editInPlace”,在这之后包含了textarea元素。。。然后删除掉这个div元素。
<code java>
$(obj).parent().parent().after(’<div id=”editInPlace”>’+t+’</div>’).remove()
</code>
在果壳中,这将告诉jQuery“在DOM树中上跃两次。将HTML代码附在到达位置的对象之后,然后移除那个对象。”
最后,我们再次调用setClickable函数并关闭saveChange()函数。重调setClickable()函数的含义是重新设置onMouseover,onMouseout,和onClick事件到初始状态。
<code java>
setClickable();
}
</code>
**__第二个示例__**
第二个方法非常类似但也有点复杂。
[[http://15daysofjquery.com/examples/jqueryEditInPlace/demo.php|示例二]]
没有用到庞大的单独div元素,这个示例将每个段落p标签变换成单独的可编辑区域。
这里的难度在于你如何在向服务器端脚本发送数据时指定正确的段落p标签。
在这里我通过为每个p标签编号并将这个编号一同发送给服务器端的php脚本的方式解决了问题。你会在alert窗口中看到php脚本是如何“知道”哪个p标签里的内容被修改的。
**__已知的问题__**
现实的应用中,你在使用类似的功能时首先需要验证更改的内容的合法性,然后才能将数据发送到服务器端。显然在这里我们刻意把这些内容忽略掉了。
==== 15天学会jQuery (0-5) ====
* <html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 0)—JQuery - What, Why, When, Where, Who</div></html>
**__what__**
jQuery是一个了不起的javascript库,它可以是我们用很少的几句代码就可以创建出漂亮的页面效果。从网站的方面说,这使得javascript更加有趣。
如果你这样想:“孩子,我需要另外一个javascript库,就好比我I need another hole in my head”那么加入这个俱乐部吧。这正是我第一次遇到的时候所想的。
我已经用过了Moo.fx, Scriptaculous, TW-SACK, 和 Prototype. 我曾参与了RICO, Yahoo YUI和其他一些库的开发。
没有了PHPjavascript和我一点也不亲近了。但是我还是尽全力保持头脑清醒,并尽量保持用AJAX去思考。
所以当我遇到jQuery的时候我想:”还需要另外一个javascript库吗?不了,谢谢…”
**__why__**
为什么我改变我我对jQuery的看法,以及为什么你要考虑去使用它?
很简单,只要你看一眼过使用jQuery的页面你就会发现它是如此的简单易用.只用很少的几行,就能表现出很优雅的效果.
有一天当我突然看到一些用jQuery写的代码时我一下子豁然开朗了. 早茶的过程中,我例行公务的去翻阅我的订阅,去看每日必看的设计博客的时候我看到了一个用jQuery写的javascript的例子.事实证明,这些代码还是有些和浏览器关联的bug,不过这些概念还是我以前从来没有见过的.
还有那些代码…
代码看起来很简单看起来不像我以前见过的.但也不无道理.
我开始通读文档,并且惊奇的发现用一点点代码竟然能做这么多事情.
**__when__**
你应当在你需要的时候使用jQuery.
给你一个小型的库文件
DOM强大的控制能力
不费吹灰之力的工作,和少许的努力.
或者
快速的通过AJAX
没有大量无用的代码
和一些基本的动画效果
但是
如果你需要超级花式效果,动画,拖放,和超级平稳动画,那么你可能想使用Prototype.他是一个有大量动画效果的类库.
**__where__**
你可以jQuery的官方网站下载到他的源代码(10K).
**__who__**
jQuery was created by [[http://ejohn.org/|John Resig]].
—-
* <html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 1)—比window.onload更快一些的载入</div></html>
window.onload()是传统javascript里一个能吃苦耐劳的家伙。它长久以来一直被程序员们作为尽快解决客户端页面载入问题的捷径。
但有时候等待页面载入还是不够快。
只有少数大型的图片文件会被快速的载入,而大部分大型的图片文件会使window.onload()载入的很慢。所以当我为最近的网络营销创建一个web应用程序的时候我不得希望更快一点。有一些围绕window.onload()的新研究(比如brother cake)的代码是一种快速的方式。如果你需要,可以试试。
但是如果你要做一些DOM(文档对象模型)javascript的编程,那么你为什么不试试jQuery,它就像你自己亲自制作一个蛋糕,并品尝它。(双关Brother Cake,俏皮话)。
jQuery有一个用来作为DOM快速载入javascript的得心应手的小函数,那就是ready… 他在页面加载完成之前执行。
<code java>
$(document).ready(function(){
// Your code here…
});
</code>
你可以用他来载入任何你想要载入的javascript,并不一定要保留jQuery的编码风格。让jQuery同时去执行多个函数也是可以的。
你以前可能见过类似于init()之类的函数,你会发现jQuery会快很多。
在以后的教程里我们会一遍又一遍的用到这个函数。
OK你现在可以尝试一下代码:(记得把jQuery引用进你的页面哦,不记得的话看看上篇。)
<code java>
$(document).ready(function(){
alert(”Congratluations!”);
});
</code>
很Easy,不是吗? 用几分钟时间做的双色表格。
—-
* <html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 2)—很容易的制作双色表格
</div></html>
这节本身没有太多的价值,重点在它提供的这个例子上。我将代码帖出来然后对重点部分注释一下:我们先来看看Thewatchmakerproject传统的做法:预览地址(你可以查看一下源代码)。再来看看jQuery是如何用5行代码来搞定的:
<code java>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />
<title>StripingTable</title>
<script src=”jquery-latest.pack.js” type=”text/javascript”></script>
<!–将jQuery引用进来–>
<script type=”text/javascript”>
$(document).ready(function(){ //这个就是传说的ready
$(”.stripe tr”).mouseover(function(){
//如果鼠标移到class为stripe的表格的tr上时,执行函数
$(this).addClass(”over”);}).mouseout(function(){
//给这行添加class值为over,并且当鼠标一出该行时执行函数
$(this).removeClass(”over”);}) //移除该行的class
$(”.stripe tr:even”).addClass(”alt”);
//给class为stripe的表格的偶数行添加class值为alt
});
</script>
<style>
th {
background:#0066FF;
color:#FFFFFF;
line-height:20px;
height:30px;
}
td {
padding:6px 11px;
border-bottom:1px solid #95bce2;
vertical-align:top;
text-align:center;
}
td * {
padding:6px 11px;
}
tr.alt td {
background:#ecf6fc; /*这行将给所有的tr加上背景色*/
}
tr.over td {
background:#bcd4ec; /*这个将是鼠标高亮行的背景色*/
}
</style>
</head>
<body>
<table class=”stripe” width=”50%” border=”0″ cellspacing=”0″ cellpadding=”0″>
<!–用class=”stripe”来标识需要使用该效果的表格–>
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>QQ</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<tr>
<td>邓国梁</td>
<td>23</td>
<td>31540205</td>
<td>gl.deng@gmail.com</td>
</tr>
<tr>
<td>邓国梁</td>
<td>23</td>
<td>31540205</td>
<td>gl.deng@gmail.com</td>
</tr>
<tr>
<td>邓国梁</td>
<td>23</td>
<td>31540205</td>
<td>gl.deng@gmail.com</td>
</tr>
<tr>
<td>邓国梁</td>
<td>23</td>
<td>31540205</td>
<td>gl.deng@gmail.com</td>
</tr>
<tr>
<td>邓国梁</td>
<td>23</td>
<td>31540205</td>
<td>gl.deng@gmail.com</td>
</tr>
<tr>
<td>邓国梁</td>
<td>23</td>
<td>31540205</td>
<td>gl.deng@gmail.com</td>
</tr>
</tbody>
</table>
<p>PS: 飘飘说我的table没有<thead>,我知错了…</p>
</body>
</html>
</code>
[[http://rlog.cn/lab/StripingTable/|预览地址]]
这里有一个jQuery的技巧不得不提一下:jQuery的链式操作,什么是链式操作呢? 我们来看看,本来应该写成这样子的:
<code java>
$(”.stripe tr”).mouseover(function(){
$(this).addClass(”over”);})
$(”.stripe tr”).mouseout(function(){
$(this).removeClass(”over”); })
</code>
但是我们写成了:
<code java>
$(”.stripe tr”).mouseover(function(){
$(this).addClass(”over”);}).mouseout(function(){
$(this).removeClass(”over”);})
</code>
因为鼠标移入移除都是发生在同一个对象上的,所以我们可以将发生在同一个对象上的动作连起来写,这样子如果有很多对象并且在他们身上发生了很多动作那么就会节省很多代码。(我暂时是这样理解的,也不知道对不对希望高手能够斧正。)
—-
* <html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 3)—巧妙的伪装链接</div></html>
今天的教程是草草完成的.我想把一些东西放在这15天的前面简单的讲讲,这样以来就可以使一些js新手不至于被一堆代码搞的晕头转向.事实上我是在即将结尾的时候才做出的这个决定.
**__目标__**
我们要使用jQuery去创建一小段代码,这段代码会把一个页面所有的超链接转换并且伪装起来.
**__为什么?__**
一些下属经销商认为,一部分用户有足够的悟性发现会员链接,并能尽量避免通过点击URL链接直接进入浏览器,从而“欺骗”下属经销商脱离代理(假设购买行为已经发生)
**__”老”办法__**
有很多下属经销商千方百计的掩饰他们的链接,避免人们通过链接找到他们.这些伎俩涉及到.htaccess和服务器端的代码.
但对于本教程,我会将重点放到”老学校”的javascript上:
<code java>
<a onMouseOver=’window.status=”http://www.merchant-url-here.com”;
return true;’ onMouseOut=’window.status=”Done”; return true;’
href=”http://www.affiliate-url-here.com”
target=”_blank”>Link Text Here</a>
</code>
这段代码被用来在浏览器状态栏显示用户鼠标指向的链接地址.比如实际链接是www.website.com?aff=123,则可以在状态栏显示www.website.com.
**__问题__**
你是一个很活跃的下级经销商,你可能会以疯狂的速度给很多个页面添加链接.并且还要给每个链接添加这种效果那么你肯定会厌倦的.加入有一天你要修改任务栏里显示的链接的时候估计你会疯掉的.
**__jQuery的解决办法__**
首先,我们想让javascript尽快的掩饰我们的链接所以我们应该先从这里开始:
<code java>
<script src=”jquery.js”></script>
<script type=”text/javascript”>
$(document).ready(function(){
//code goes here
});
</script>
</code>
当DOM准备好的时候我们放在ready里的代码就开始执行了.
接下来
要给所有我们想伪装的链接添加一个class,class有助于jQuery帮我们找到需要伪装的链接而撇开其它不需要伪装的链接.title有两个作用:当鼠标划过链接的时候会有一个小小的盒状提示显示URL:www.affsite.com并且同样的信息会显示在浏览器的状态栏(IE Only).
<code java>
<p><a href=”http://www.affsite.com?id=123″ title=”http://www.affsite.com”
class=”affLink”>Super Duper Product</a></p>
</code>
告诉jQuery找到有class=”affLink”的链接
<code java>
$(’a.affLink’)
</code>
添加一个鼠标划过事件
<code java>
$(’a.affLink’).mouseover(function(){window.status=this.title;return true;})
</code>
简单的说:找到class=”affLink”的所有链接,当鼠标划过它们的时候改变浏览器状态栏信息为该链接title的内容.这个在FireFox并不能正常的工作,只是在IE里起作用.在FireFox的状态栏只是显示一个”Done”,或者更准确的说,鼠标划过超链接对状态栏并没有任何影响.我没有更多的浏览器测试.
继续-mouseout
jQuery可以让我们用”链”的方式,像这样:
<code java>
$(’a.affLink’).mouseover(function(){window.status=this.title;return true;})
.mouseout(function(){window.status=’Done’;return true;});
</code>
这点代码告诉jQuery改变浏览器状态栏信息,或者当鼠标不再停留在链接上时返回”Done”.
如果你不适应jQuery的这种链的工作方式,那么你完全可以这样写:
<code java>
$(’a.affLink’).mouseover(function(){window.status=this.title;return true;});
$(’a.affLink’).mouseout(function(){window.status=’Done’;return true;});
</code>
这就看你了.
把这些代码放到一起:
<code java>
<script src=”jquery.js”></script>
<script type=”text/javascript”>
$(document).ready(function(){
$(’a.affLink’).mouseover(function(){window.status=this.title;return true;})
.mouseout(function(){window.status=’Done’;return true;});
});
</script>
</code>
最后的想法
你们当中可能觉得今天的课程太简单了,有些还可能还是有点不太明白,因为你们不是二级经销商.
In “Days” to come you’ll see me tackle issues that get more involved and apply to almost anyone with a website - whether you monetize your traffic or not.
—-
* <html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 4)—安全邮件列表</div></html>
规则提到如何防止垃圾邮件:不要把你的邮件地址放到任何一个mailto:链接中.
在与垃圾邮件恶魔做斗争的过程中我们的网页设计师和程序员总结出了一些有创意的解决办法,让我们快速的看一些这些常见方法的缺点(或多或少有一些).
**__name [at-no-spam] website.com__**
问题:链接式的更方便,而且把邮件地址敲入收件人栏还有可能会出错.
**__联系方式__**
问题:你冒着这么大的风险就是因为有一个垃圾邮件借用你的帐户发送大量的垃圾邮件(除非你使用真正的安全邮件脚本).而这样就扼杀了那些只想给你发个简单邮件的用户.
**__javascript加密__**
问题:你的邮件仍然暴露在光天化日之下,即使你使用了复杂的密码技术给它带上面具.还有谁希望为了发送一封邮件而启用第三方的解密网站,反正我是不会.
**__藏在一种简单的形式后面__**
(有一个例子,但是打不开了.)http://simon.incutio.com/contact/我能想到的没有人…但是让我们看看是否我们能改进观念。
**__可能的解决办法:AJAX__**
我提供的解决方案将比目前设计师们使用的方法有如下优势:
* 易于实施
* 易于修改
* 还有一些小小的花哨的效果
* 不用第三方工具来加密邮件地址
* 没有邮件地址暴露在光天化日之下
最后我想说明一点,我认为电子邮件靠这种闪烁其词的加密手段来躲避垃圾邮件还是非常不明智的.在实践中,我认为电子邮件加密是相对安全的,但是客观事实是,电子邮件还是在html原代码里.
**__概念__**
- 1.用jQuery从服务器上把html文件内容抓下来.
- 2.把包含邮件链接的html文件放到好的容器中是一种简单的保护机制.
**__示例__**
我要示范一些例子来显示邮件链接地址,当访客点击一个按钮或者一个链接的时候,页面就会跳转到对应的那个例子里.
[[http://15daysofjquery.com/examples/mailto/demo1.php|按钮点击–立即显示]]
[[http://15daysofjquery.com/examples/mailto/demo2.php|链接点击–淡出]]
[[http://15daysofjquery.com/examples/mailto/demo3.php|页面载入–淡出]]
[[http://15daysofjquery.com/examples/mailto/demo4.php|页面载入–立即显示]]
(说明:所谓的立即显示,我的意思是说”没有花哨的效果而尽快的显示电子邮件地址”)
**__代码__**
这里发表非商业共创使用许可,如果你希望将代码使用在你的商业产品中时,请联系我.我正在一个新的CMS for web designers中使用它.
**__为什么这种方式比普通的mailto链接安全?__**
真正的问题是垃圾邮件制造者会使用自动化软件从html源文件中寻找电子邮件链接,这种做法和google一样:使用相关链接.
他么就和我们大部分人一样懒惰.所以很难所他们不会拿个本子放在键盘旁边记下你的电子邮件地址.
请查看我提供的示例的源代码,你将不会在html里找到任何的邮件地址.
这几坚实的保证了你绝对不会收到垃圾邮件,只会从朋友或者浏览者那里收到邮件.
但是从页面中移除邮件地址,…………………
**__最后一点说明__**
先仔细看看前面三个例子,你会看到我使用了AJAX回调函数来触发slideDown() 和 show() 效果.
换句话说,我希望AJAX调用收到信息(html)时jQuery才开始slideDown() 效果.把秘密粘贴到我们简单的服务段脚本并且等待服务器返回信息.
**__正确的方法:__**
<code java>
$(document).ready(function(){
$.post(’mailtoInfo.php’,{
pass: “secret”
},function(txt){
$(’div.email’).html(txt);
$(’div.email’).slideDown(”slow”);
});
});
</code>
**__错误的方法:__**
<code java>
$(document).ready(function(){
$.post(’mailtoInfo.php’,{
pass: “secret”
},function(txt){
$(’div.email’).html(txt);
});
$(’div.email’).slideDown(”slow”);
});
</code>
—-
* <html><div style=”font-size:16px;color:red;font-weight:bold;”>15 Days of jQuery(Day 5)—包起来–懒人用Jquery生成的HTML</div></html>
这个让我们轻松的纪念日已经到来–我恨我在计算机前已经花了48个小时,我希望能够有另外一个jQuery来结束我的噩梦,并且让我上网更快。
当我一边“在用Jquery方法编写”和一边“进行复杂的文件上传”,我已经筋疲力尽。然而这两种操作的代码是一种较浅的,它只不过是你才刚刚开始解决的一些简单问题。
所以下来我开始介绍:
尽管我在我的网站用所有的CSS样式表去进行表格设计(也许这要花费两年半的时间或者更多),我已经用了很多我能找到的在这方面的信息。回到2004年5月(古代史)A list a part有一篇[[http://www.alistapart.com/articles/onionskin/|《关于创建阴影的伟大教程(洋葱皮投影)》]]可以应用到任何图片,无论尺寸多大.
那片文章的应经不能再评论了,但还是有些人希望能够再出篇教程.
**__问题__**
一些css工程师用一些”不相干”的标记,就是为了使背景图片能够应用到每一个元素上.例如:
这里是A list a part用到的代码:
<code java>
<div class=”wrap1″>
<div class=”wrap2″>
<div class=”wrap3″>
<img src=”object.gif” alt=”The object casting a shadow” />
</div>
</div>
</div>
</code>
所有这些divs充当一个给图片添加投影效果的”钩子”.这不见得好,我们可以把源代码精简成这样:
<code java>
<img src=”object.gif” class=”dropshadow” alt=”The object casting a shadow” />
</code>
按着这个思路…
**__目标__**
在这里,我要想你展示如何用jQuery轻而易举的将多于的标记从你的源代码中剔除.运用这个方法,让你的代码更加干净(更重要的是)将使以后变换布局容易的多.
**__解__**
这里,看看jQuery是如何击退这个问题的.
<code java>
$(document).ready(function(){
$(”img.dropshadow”)
.wrap(”<div class=’wrap1′><div class=’wrap2′>” +
“<div class=’wrap3′></div></div></div>”);
});
</code>
图片就可以保持这样了:
<code java>
<img src=”object.gif” class=”dropshadow” alt=”The object casting a shadow” />
</code>
**__仔细看看__**
$(document).ready() 是jQuery版的window.onload()
$(”img.dropshadow”) 告诉jQuery找到带有class=”dropshadow”的图片,如果你想用一个id你可以这样: $(”img#dropshadow”)wrap() (wrap() tells jQuery to use the DOM (Document Object Method Model) to wrap the images with the class=”dropshadow” in the html inside the parenthesis. )
**__最后的结果__**
傻乎乎的图片,但是和original Onion Skinned Drop Shadows用的是一样的.
<code java>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>Onion Skin DropShadwo with jQuery</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />
<style>
.wrap0, .wrap1, .wrap2, .wrap3 {
display:inline-table;
/* \*/display:block;/**/
}
.wrap0 {
float:left;
background:url(shadow.gif) right bottom no-repeat;
}
.wrap1 {
background:url(shadow180.gif) no-repeat;
}
.wrap2 {
background:url(corner_bl.gif) -18px 100% no-repeat;
}
.wrap3 {
padding:10px 14px 14px 10px;
background:url(corner_tr.gif) 100% -18px no-repeat;
}
body { background: #fff;}
</style>
<script src=”jquery.js” type=”text/javascript”></script>
<script>
$(document).ready(function(){
$(”img.dropshadow”)
.wrap(”<div class=’wrap0′><div class=’wrap1′><div class=’wrap2′>” +
“<div class=’wrap3′></div></div></div></div>”);
});
</script>
</head>
<body>
<h1>Onion Skinned - With jQuery</h1>
<p>First, the old-school, multiple divs hard coded into the html as seen on the <a href=”http://www.ploughdeep.com/onionskin/360.html”>orignial article</a>:</p>
<div class=”wrap0″>
<div class=”wrap1″>
<div class=”wrap2″>
<div class=”wrap3″>
<img src=”ball.jpg” alt=”The object casting a shadow” />
</div>
</div>
</div>
</div>
<p style=”clear:both;”>And now, the jQuery method, which uses javascript to wrap the image at runtime:</p>
<img src=”ball.jpg” class = “dropshadow” alt=”The object casting a shadow” />
<p>View the source of this page and you’ll see the huge difference in markup!</p>
</body>
</html>
</code>
(这里只是代码,没有图片.要看效果去[[http://15daysofjquery.com/examples/osds/|这里]])
**__jQuery和其它解决方法的比较__**
jQuery的网站上有一个到Ajaxian网站的链接,那里有用另外一个javascrip库创建的Onion Skin Drop Shadow ,我相信他的代码复杂程度和代码量现在看来自不待言.我宁愿使用jQuery.(怎么?你猜到了..)
平心而论,没有一个库是对于每一个工作或每一段代码都是合适的.本教程不是为了证明jQuery是一切javascrip类库中的老大.
试试Prototype, Scriptaculous, YUI, Rico, Behaviour, Moo.fx 和 the dozens 或者其它的.如果你找到了一个你用起来比较顺手的,那就去用它吧.
jQuery对于我来说只是一个工具.我只是希望这个教程能够提供给你更多使用它的方法.
**__有关jQuery的工具__**
jQuery用难以置信的简单来操作DOM. [[http://jquery.com/docs/BaseDOM/|你应该花些时间看看jQuery能用来做什么]],用下append(), prepend(), before(), after(), html(), and remove().
来自jQuery Docs
wrap(String html)
把所有匹配的元素用其他元素的结构化标记包装起来。这种包装对于在文档中插入额外的结构化标记最有用,而且它不会破坏原始文档的语义品质。
这个函数的原理是检查提供的第一个元素(它是由所提供的HTML标记代码动态生成的),并在它的代码结构中找到最上层的祖先元素--这个祖先元素就是包装元素。
当HTML标记代码中的元素包含文本时无法使用这个函数。因此,如果要添加文本应该在包装完成之后再行添加。
示例:
<code java>
$(”p”).wrap(”<div class=’wrap’></div>”);
</code>
HTML
<code java>
<p>Test Paragraph.</p>
</code>
结果
<code java>
<div class=’wrap’><p>Test Paragraph.</p></div>
</code>
+++++++++++++++++++++++++++++++++++++++++++++++++
正文
+++++++++++++++++++++++++++++++++++++++++++++++++
版权声明
本文是zhyfly兄贴在LinuxSir.Org 的一个帖子而整理出来的,如果您对版权有疑问,请在本帖后面跟帖。谢谢;本文的HTML版本由北南南北整理;修改了整篇文档的全角及说明文字中的单词中每个字母空格的问题;为标题加了编号,方便大家阅读;
前言:关于find命令
由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。
在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。
一、find 命令格式
1、find命令的一般形式为;
find pathname -options [-print -exec -ok …]
2、find命令的参数;
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
3、find命令选项
-name按照文件名查找文件。-perm
按照文件权限来查找文件。-prune
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user
按照文件属主来查找文件。
-group
按照文件所属的组来查找文件。
-mtime -n +n
按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
-nogroup
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2
查找更改时间比文件file1新但比文件file2旧的文件。
-type
查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
另外,下面三个的区别:
-amin n
查找系统中最后N分钟访问的文件 -atime n
查找系统中最后n*24小时访问的文件 -cmin n
查找系统中最后N分钟被改变文件状态的文件 -ctime n
查找系统中最后n*24小时被改变文件状态的文件
-mmin n
查找系统中最后N分钟被改变文件数据的文件
-mtime n
查找系统中最后n*24小时被改变文件数据的文件
4、使用exec或ok来执行shell命令
使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的
在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。
例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中
# find . -type f -exec ls -l { } \;
-rw-r–r– 1 root root 34928 2003-02-25 ./conf/httpd.conf
-rw-r–r– 1 root root 12959 2003-02-25 ./conf/magic
-rw-r–r– 1 root root 180 2003-02-25 ./conf.d/README
上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。
在/logs目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec rm { } \;
记住:在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。
在下面的例子中, find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。
$ find . -name “*.conf” -mtime +5 -ok rm { } \;
< rm … ./conf/httpd.conf > ? n
按y键删除文件,按n键不删除。
任何形式的命令都可以在-exec选项中使用。
在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。
# find /etc -name “passwd*” -exec grep “sam” { } \;
sam:x:501:501::/usr/sam:/bin/bash
二、find命令的例子;
1、查找当前用户主目录下的所有文件:
下面两种方法都可以使用
$ find $HOME -print
$ find ~ -print
2、让当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件;
$ find . -type f -perm 644 -exec ls -l { } \;
3、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;
$ find / -type f -size 0 -exec ls -l { } \;
4、查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们;
$ find /var/logs -type f -mtime +7 -ok rm { } \;
5、为了查找系统中所有属于root组的文件;
$find . -group root -exec ls -l { } \;
-rw-r–r– 1 root root 595 10月 31 01:09 ./fie1
6、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。
该命令只检查三位数字,所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ,才能使用下面这个命令
$ find . -name “admin.log[0-9][0-9][0-9]” -atime -7 -ok
rm { } \;
< rm … ./admin.log001 > ? n
< rm … ./admin.log002 > ? n
< rm … ./admin.log042 > ? n
< rm … ./admin.log942 > ? n
7、为了查找当前文件系统中的所有目录并排序;
$ find . -type d | sort
8、为了查找系统中所有的rmt磁带设备;
$ find /dev/rmt -print
三、xargs
xargs - build and execute command lines from standard input
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
来看看xargs命令是如何同find命令一起使用的,并给出一些例子。
下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory: ISO-8859 text\
……
在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
$ find / -name “core” -print | xargs echo “” >/tmp/core.log
上面这个执行太慢,我改成在当前目录下查找
#find . -name “file*” -print | xargs echo “” > /temp/core.log
# cat /temp/core.log
./file6
在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:
# ls -l
drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6
-rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf
-rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf用grep命令在所有的普通文件中搜索hostname这个词:
# find . -type f -print | xargs grep “hostname”
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
用grep命令在当前目录下的所有普通文件中搜索hostnames这个词:
# find . -name \* -type f -print | xargs grep “hostnames”
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。
find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。
四、find 命令的参数
下面是find一些常用参数的例子,有用到的时候查查就行了,像上面前几个贴子,都用到了其中的的一些参数,也可以用man或查看论坛里其它贴子有find的命令手册
1、使用name选项
文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件,使用~作为 ‘pathname’参数,波浪号~代表了你的$HOME目录。
$ find ~ -name “*.txt” -print
想要在当前目录及子目录中查找所有的‘ *.txt’文件,可以用:
$ find . -name “*.txt” -print
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
$ find . -name “[A-Z]*” -print
想要在/etc目录中查找文件名以host开头的文件,可以用:
$ find /etc -name “host*” -print
想要查找$HOME目录中的文件,可以用:
$ find ~ -name “*” -print 或find . -print
要想让系统高负荷运行,就从根目录开始查找所有的文件。
$ find / -name “*” -print
如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt的文件,下面的命令就能够返回名为ax37.txt的文件:
$find . -name “[a-z][a-z][0–9][0–9].txt” -print
2、用perm选项
按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。
如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
$ find . -perm 755 -print
还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666
# ls -l
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp# find . -perm 006
# find . -perm -006
./sam
./httpd1.conf
./temp-perm mode:文件许可正好符合mode-perm +mode:文件许可部分符合mode
-perm -mode: 文件许可完全符合mode
3、忽略某个目录
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。
如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
$ find /apps -path “/apps/bin” -prune -o -print
4、使用find查找文件的时候怎么避开某个文件目录
比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件
find /usr/sam -path “/usr/sam/dir1″ -prune -o -print
find [-path ..] [expression] 在路径列表的后面的是表达式
-path “/usr/sam” -prune -o -print 是 -path “/usr/sam” -a -prune -o
-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path “/usr/sam” 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path “/usr/sam” -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。
这个表达式组合特例可以用伪码写为
if -path “/usr/sam” then
-prune
else
-print
避开多个文件夹
find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print
圆括号表示表达式的结合。
\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。
查找某一确定文件,-name等选项加在-o 之后
#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name “temp” -print
5、使用user和nouser选项
按文件属主查找文件,如在$HOME目录中查找文件属主为sam的文件,可以用:
$ find ~ -user sam -print
在/etc目录下查找文件属主为uucp的文件:
$ find /etc -user uucp -print
为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。
例如,希望在/home目录下查找所有的这类文件,可以用:
$ find /home -nouser -print
6、使用group和nogroup选项
就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用:
$ find /apps -group gem -print
要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件
$ find / -nogroup-print
7、按照更改时间或访问时间等查找文件
如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。
用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。
希望在系统根目录下查找更改时间在5日以内的文件,可以用:
$ find / -mtime -5 -print
为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print
8、查找比某个文件新或旧的文件
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为:
newest_file_name ! oldest_file_name
其中,!是逻辑非符号。
查找更改时间比文件sam新但比文件temp旧的文件:
例:有两个文件
-rw-r–r– 1 sam adm 0 10月 31 01:07 fiel
-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp# find -newer httpd1.conf ! -newer temp -ls
1077669 0 -rwxrwxr-x 2 sam adm 0 10月 31 01:01 ./httpd.conf
1077671 4 -rw-rw-rw- 1 root root 2792 10月 31 20:19 ./temp
1077673 0 -rw-r–r– 1 sam adm 0 10月 31 01:07 ./fiel查找更改时间在比temp文件新的文件:
$ find . -newer temp -print
9、使用type选项
在/etc目录下查找所有的目录,可以用:
$ find /etc -type d -print
在当前目录下查找除目录以外的所有类型的文件,可以用:
$ find . ! -type d -print
在/etc目录下查找所有的符号链接文件,可以用
$ find /etc -type l -print
10、使用size选项
可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。
在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。
在当前目录下查找文件长度大于1 M字节的文件:
$ find . -size +1000000c -print
在/home/apache目录下查找文件长度恰好为100字节的文件:
$ find /home/apache -size 100c -print
在当前目录下查找长度超过10块的文件(一块等于512字节):
$ find . -size +10 -print
11、使用depth选项
在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。
在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
$ find / -name “CON.FILE” -depth -print
12、使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。
从当前目录开始查找位于本文件系统中文件名以XC结尾的文件:
$ find . -name “*.XC” -mount -print
五、关于本文
本文是find 命令的详细说明,可贵的是针对参数举了很多的实例,大量的例证,让初学者更为容易理解;本文是zhy2111314兄贴在论坛中;我对本文进行了再次整理,为方便大家阅读; ── 北南南北
六、相关文档
试过,目前属实
UT3 现在国内唯一稳定的双线服务器 加入团队死亡竞赛模式
北京歌华机房,就是奥运票务网站那个!
双线线路,真正的网通,电信接入
可以在游戏里面DM模式(第一个)内搜索到,但是三个选项 满人,空闲,锁定都要选择啊!
Salivaxiu 开头的都是,正式版的时候名字可能会变,IP不变
手动进入方法
按 ` 键进入控制台
输入
open 122.102.7.33:6666 12人团队死亡竞赛,红蓝两方
open 122.102.7.33:7777 进入DM模式,多人混战服务器10人
open 122.102.7.33:8888 进入VCTF模式,就是有飞机,有车辆的躲旗模式 24人
open 122.102.7.33:9999 单挑服务器 2人 可以8人观看
等正式版出来了,可能会有改动,但是6666 7777 8888 9999 这三个端口肯定不变
看Ping的方法:
按 ` 键进入控制台
输入 stat net
会有很详细的网络状况说明,关闭的话,在输入一次命令即可!
哦,这个服务器长期做下去的,就是为了UT3架设的!
希望大家来玩,现在服务器里面全是老外!虐老外去!