分页: 182/196 第一页 上页 177 178 179 180 181 182 183 184 185 186 下页 最后页 [ 显示模式: 摘要 | 列表 ]
Jan 6
白色,一种象征着纯洁、天使的颜色。但为什么偏偏白色也和最可怕的死亡紧紧的联系在一起?一切都是白色的,白色的墙壁、白色的床、白色的被单下面是我最爱的他,天成,他依然是白色的。旁边的人撕心裂肺的哭泣这。我没有眼泪,因为我知道,就算他去了另一个世界,他的心是属于我的,而我的心也是属于他的,他一定会在另一个世界依然爱着我的。
天阴阴的,我心里慌慌的,说不出是什么原因,总觉得有什么事要发生,我不停的猜测有什么事会发生,而一个电话把我从想象中带了回来,突入其来的电话让我不知所措,看着我身边来来往往的行人,依然那么匆忙。僵硬的站在来来往往的人群中,我彷徨了,没有人知道我的无助,偶然我感觉到有一种叫眼泪的液体慢慢的从我的脸上滑了下来。我没有大悲,甚至我自己也不知道我怎么会如此的平静,也许只有这样他会好受些,他就不会痛了,永远都不会痛了。我拖着我僵硬的身躯来到了他的床前,在我面前的他依然是那么帅气,只是多了一丝无奈,我握着他的手,我告诉自己,我不能哭,因为眼泪会模糊我的眼睛,让我不能更清楚的看着他,抽泣声会让我听不到他微弱的声音,我看着眼前的他,我的心好痛,昔日在篮球架下边那个生龙活虎的他到哪儿去了?我乞求上天能让他回来。我俯下身,他拉着我的手,我喜欢他拉着我手的感觉,有他拉着,我觉得很安全,在大的事都会有他在我身边,我什么都不会怕,但这时我不知道这只让我安全的手,还能带我多久?但我努力的记住这一切。“忘了我”他用微弱而坚定的声音告诉我,我没有说话,我也不知道能说什么,只是默默的握着他的手,他的手贴在我的脸上,好熟悉的味道,我会永远的记住这个味道,这个属于我们俩的味道,我看着他,强忍着我的眼泪,带着微笑,我不想让他看见我的悲伤,这样,他会不高兴的。他眼角闪着点点的泪水,泪水顺着他苍白的脸滑到了白色的枕头上。我走到脸盆旁,在我拧毛巾的时候,有一滴眼泪不小心被挤了出来,是的,他不会看见的,因为眼泪知道,它不能被天成看到,于是它很快的躲进了水中。我依然带着微笑,我们的手依然紧握着,我为他擦掉了眼泪,为他擦拭着他脸上每一寸肌肤。他慢慢的闭上眼睛,体会着我带给他的一切,悄悄地,他的手滑出了我的手心,我的身后则传来了他家人撕心裂肺的哭泣声,我在也无法控制我的眼泪了,我搂着他的脖子,轻轻的吻着他的额头,按下了警铃,随之而来的是医生和护士,医生拉起了白色的被单,护士推来了单床车,在护士把他抬到单床车的时候,我擦掉了我脸上那个属于悲伤的东西,走过去牵起他的手,抬起头带着微笑对护士说“轻点,别吵着他,别弄痛了他。”这时的我心里就像有一把锋利的刀,好不留情的一刀一刀的刺着我,血汩汩的流着。我牵着他的手,一直陪他走到了走廊的尽头。

    他走了,永远的走了,他失言了,他说过的一生一世他没有做到,我站在走廊的尽头,看着他被推进那道白色的大门,久久的不肯走,真的好希望他能从那道门走出来,更或者我能进入那道门去陪他,看着那道白色的大门,每天都一张一合、一开一闭的,有很多人都和我一样,站在那儿,感受无奈。就是这道白色的门,从此把我们分开,真的不知道到底是我在外面还是他在外面。
我转过头往回走,本来决定不再回头,但我还是忍不住的回了头,心里默默地对他说“亲爱地,再见,对不起,我做不到忘了你,我会永远地爱着你的。”
Jan 3
      你们可能相爱过,你们也可能喜欢着彼此, 但是,为了什么原因你们没能在一起?
  也许他为了朋友之间的义气,不能追你。
  也许为了顾及家人的意见 ,你们没有在一起。
  也许为了出国深造,他没有要你等他。
  也许你们相遇太早,还不懂得珍惜对方。
  也许你们相遇太晚,你们身边已经有了另一个人。
  也许你回头太迟,对方已不再等待。
  也许你们彼此在捉摸对方的心,而迟迟无法跨出界线。
  不过即使你们没在一起,你们还是保持了朋友的关系。但是你们心底清楚,对这个人,你比朋友还多了一份关心。即使不能跟他名正言顺的牵着手逛街,你们还是可以做无所不谈的朋友。他有喜欢的人,你口头上会帮他追,心里却不是很清楚你是不是真的希望他追到。
  他遇到困难时,你会尽你所能的帮他,不会计较谁又欠了谁。男女朋友吃醋了,你会安抚他们说你和他只是朋友,但你心中会有那么一丝的不确定。每个人这辈子,心中都有过这幺一个特别的朋友,很矛盾的行为。一开始你不甘心只做朋友的,但久了,突然发现这样最好。
  你宁愿这样关心他, 总好过你们在一起而有天会分手。
  你宁愿做他的朋友,彼此不会吃醋,才可以真的无所不谈。
  特别是这样,你还是知道,他永远会关心你的。做不成男女朋友,当他那个特别的朋友,有什么不好呢?你心中的这个特别的朋友...? 是谁呢?
  很多的感情,都因为一厢情愿,最后连朋友都当不成了,常常觉得惋惜,可惜一些本来很好的友情,最后却因为对方的一句喜欢你,如果你没有反应,这一段友情似乎也难以维持下去,这也难怪有些人会因此不肯踏出这一步。
  因为这就像是一场赌注,表白了之后不是成了男女朋友,要不就连朋友都当不成了。有些事不是你能预料的,或许对方不在意,你们还可以是朋友,但却已经不如从前的好。也是可惜,也是遗憾!但还有没有可能是另一种情况,你可能永远都不甘心只是朋友……
Jan 1
      大四那年,十二月份的时候我找到工作。那间外企是我面试的第一家,也是最后一家,一路四轮面试,然后很顺利的拿到Offer,签掉协议。
但是最让人高兴的不是这个。
我遇见他。
世上有近七十亿人,男人,女人,每天每天擦肩不识。还有什么比遇见一个让你心动的人更加珍贵。
程是我在等待面试的小房间里认识的男孩子,我们聊的非常愉快,当然,这中间有许多是我刻意的捕捉话题。如果刻意,我可以同任何一个人迅速熟络,愉快交谈。我是热情的射手座,这个星座的男子常常被描述为花心异常,且没有长性。
谁都不相信,我从来没有谈过恋爱。
是的,如你所想,我是gay,并且,非常挑剔。更荒谬的是,我只相信一见钟情。
很蠢对吧。
二十二岁的冬天的下午,上海西区昂贵地段的写字楼的小房间里,我爱上对面的男孩子,不可救药的。这么巧,我们都是一身黑色西装,白色衬衫配深蓝色条纹领带,头发梳的一丝不苟,分别来自城中两大名校。不同的是,一个笑得灿烂无忌,另一个则是含蓄温文。他个子不高,很瘦,相貌斯文,白皙皮肤上微微几颗暗疮印子,戴一副金属蓝半框眼镜,谈吐举止非常有教养。对了,他的声音很干净,少有的淡淡清澈质地,略带磁性。
从来没有遇见这样舒服的人。当他被唤走,我怅然若失。片刻呆滞后突然想起,聊了有十分钟,我竟没有问他姓名,更勿论联系方式云云。后来我也被唤了出去。这天我再没有见到他,我们应聘不同部门。
再后来,我接到录取通知,然后很费一点周折的打听到,他没有被录用。
似乎,就这样错过了。
也许这已经是个不错的故事,偶然的相遇,然后错过,并且他不知道我爱他。在之后的很长一段时间,也许我会怀念他,我曾经遇见过一个让我这样喜欢的男孩子,但是我们没有任何交集,带着遗憾的美丽往往更长久。
但是我是射手座的男子。我有天生的热情激情,热爱自由,追逐梦想。
我会疯狂追逐哪怕不切实际。
我这样想念他,他的脸在脑海里不能磨灭。我反复回忆着他抿嘴淡淡微笑的样子,他说话时候食指轻轻推一推鼻梁上的眼镜的小动作,我冲动狂想着把他拉到怀里狠狠亲吻的样子,想狠狠撕破他温和疏离的外衣看他骨子里是否也这样冷淡自持,想像着他哭着向我求饶的样子……我发现自己已经无法忍受仅仅想像他的日子。
我要他!

我决定找到他。
这并不困难,我知道他的学校年级系别,还有某某天他去面试了某某公司——只要随便编个借口托人打听一下就好。
第三天我就拿到他的姓名,电话,msn,还有,他在bbs上的网名。
这个世界上快要没有什么隐私,好像。
我选择了在网上同他接触,msn上试探着闲聊,胡乱编造得到他msn的理由,煞有介事。他还记得我,这让我愉快非常。
我们聊的很好。

他不是,我知道。很奇怪的,我们会有一种直觉,只要一眼就可以知道,这个人是不是同类。
程不是,见到他的第一眼我就知道,他不是。可是我已经不能控制自己。哪怕只好意淫我也认了。如今所有我能做到的,就是小心翼翼控制我的激情,小心不要让他发现。隔着电脑屏幕,这并不难。
我是很好的聊天对象,你知道。从学校到公司,从时政到财经,从CS到电影,我竭尽所能讨他欢喜。
这是2004年上海的冬天,无比寒冷。他无意间提及,他感冒了,只好窝在寝室,挂在网上看片子。
问他吃药没,回答没有,没药了,也懒得去校医院。
冲动之下裹上外套冲出门,急急到最近的药店买了两盒泰诺,往口袋里一塞就朝车站奔。
我坐了两个小时车子才赶到他的学校。
立在大门口,犹豫三分钟,然后给他发短信——
【hi,我在你们校门口,能下来么?】
片刻之后得到回复,他很惊讶:【啊?好的我这就下来】
冷风里,远远的,我看到他的身影,一点一点由小变大,一点一点由模糊变清晰。不知道为什么,突然眼眶发热。
他,正在朝我走来,这是真的,真的。
多好。

他用了大约两秒钟就认了我出来,然后是招牌的温和有礼的微笑:“你好,这么冷的天还出来——来看同学的?”
“嗯……”我看着他深褐色的眼睛,竟然不可抑制的口干舌燥,有点窘的支支吾吾,不知该说什么了。
这样单薄,这样清瘦,这样客气疏离。
上帝知道我其实多想拉开羽绒服紧紧把他裹在怀里,狠狠给他温暖拥抱。
忽然有了勇气。
慢慢从口袋里掏出那两个小纸盒子,我低声说:“我来……送这个给你。”
他震了一下,然后条件反射的向后退了半步,抬头看我,有点迟钝的再看看我手里的药盒,脸上慢慢浮现出恐惧表情,眼神复杂不可形容——惊惧,不可思议,愤怒,还有……一闪而过的厌恶。
零下四度的天气,我发现片刻前还因赶路而热气腾腾的自己迅速冻结成冰。
是我的错,我知道,从头到尾都是我的错。
这是不可挽回的。
他立定,深吸口气,努力给出斯文笑容,看得出他很吃力,他轻声说:“谢谢,不用了,我女朋友刚给我送来两盒百服宁。”
“这样啊……抱歉打扰了,再见。”我用尽全身力气微笑转身,我知道我的手,我的脚,我的全身都在不可抑制的颤抖。
我必须离开,尽快。
迟一秒我会崩溃。

返回的公车上,坐末排靠窗的位子,看车窗外景色一路后退,表情平静,但是双手神经质的握紧,颤抖。
我看着天一点一点灰下来,然后变黑,夕阳在高架的交错空隙里时隐时现,有风从肮脏的玻璃窗缝里尖锐的刺出来,射在脸上针尖样疼痛。
可我分明已经迟钝,我不知道。
我只知道,是我的错,从头到底都是我的错。
可是,程,对不起,我爱你。
Dec 28
      我和她同在东北的一所大学读书,我在哲学系,她在外语系。在学校一年一度的"紫丁香戏剧节"上,我们相识。

  我是导演,蹲在后台边观看我导的剧目《沙丁与麦穗》,而她是校报记者,守在台边伺机拍剧照。前后两层垂幕将我俩同其他人隔开,在这种情况下,我不得不对身旁的她点点头。她淡淡一笑,幽暗的光线里,那个笑容有点模糊。

  我的戏只有男女主角两个人,全靠对话的精彩和灯光的变换出彩,我喜欢这种纯粹的戏剧感觉。女主角一把抢过男主角手中的红色玫瑰,说:"我们之间不需要这个。"她轻轻向后一抛,玫瑰落在了后台。我捡起这朵完成了任务的花,随手递给身边的她,说:"送你啦,同一个战壕的战友,这花儿是真的。"

  以后在校园中,我们碰见了会点点头,交谈几句。她是个爱做梦的女孩,但有时也会显得心事重重。偶尔一次讲起旅游,都说想去兴安岭,我开玩笑说:"你是该去,到了那样的地方,什么心病都会好的!"

  这年9月底,我决定利用国庆的假日去小兴安岭,但没有告诉她。我不喜欢和女孩子过多交往,她们往往胸无大志,有的只是漂亮衣裙以及说不明的小心思。何况我也不是一个爱热闹的人,如果不能和铁哥们儿同去,那么一个人的旅行将是最佳选择。

  我在包中装上羊毛衫以及爸爸的一件羊皮背心,一个人上了火车。

  在火车开动的时候,她突然出现在我的面前,拎着一个硕大的包。我不知她怎样得知的消息,只是惊慌地意识到,此行要和一个女孩单独相处至少一周,而这恶梦般的一切才刚刚开始。

  到达五营的第一天,我们便领教了当地的寒冷,我穿上了所有的衣服,而她依然是一条裙子。她在风中瑟瑟发抖,半天只从包里掏出条围巾。原来她硕大的包中装的都是些围巾、帽子、皮鞋以及裙子。看来她是把这趟旅行当成时装表演了。我把羊皮背心脱下来递给她,她冻得青白的脸一下涨得通红。

  我们来到当地的小吃街看着满街穿行的彪形大汉和诱人羊肉,我的心中升起一股豪情。我就喜欢这种大碗喝酒、大块吃肉的地方。

  我要了三四种羊肉和一瓶著名的酒。连吃带喝好半天,才发现对面的她一点东西都没吃。问她,她说是吃不了羊肉和辣椒!那来这儿干吗?我的怒火再一次升起。我不得不放下酒碗和肉块,站起身来。几乎走遍整条街,才找到一种甜食。她感激地望着我,紧紧捧着碗,好像那是她惟一的温暖。

  我不再说话,也觉得无话可说。

  突然,一只盛满酒的杯子递到了我眼前,我吓了一跳,赶忙接住,只见她另一只手也端着这么一杯,快有二两酒了。

  "你能喝吗?"我惊讶地问。

  她坚定地点了点头。

  我将信将疑地举起杯子伸了过去,快要碰到一起时,她却顿住了,说:"得为点什么,就为……为我们的美好明天吧!"我无心推敲祝酒辞,一仰头喝干了酒。再看她,竟也喝干了,兴奋得脸上放光。

  十来分钟后,她吐了,在喘息中告诉我,这是她第一次喝白酒。

  我迅速带她回到旅馆,打开水、找茶叶、买面包,安顿她睡下。我回到自己房间,心情极不舒畅,和这么一个格格不入的女孩同游,对两个人来说,大概都是件痛苦的事。

  以后几天的旅程中,我几乎不和她多说话,安排好一切后,就走在前面,大声唱着《回到拉萨》,顽强地寻找着一个人旅行的感觉。她默默地跟在后面,包着红头巾,紧紧抓着羊皮背心的蓝布面。

  行至乌依岭那天,当地下了雪,雪很大,山谷瞬间就白了。我们是仅有的旅行者,在这个季节,惟一的小旅馆早已停业多天。一个好心的村民,把站在雪地中的我们领回他家。

  这个大山里的村子很穷,他家13岁的儿子在这样的雪天仍穿着露屁股的旧裤子。他们有一院木屋,但能住的只有两间。

  这晚村中停电,天刚黑整个山村就寂静无声,漆黑一片了。儿子被带到他们住的大屋,留下这间小房给我们。他妻子将土炕烧得火烫,抱来家中最好的一床被子,笑一笑,离开了。我无法给她讲明,我和这个姑娘不是夫妻,但似乎讲明了也没有用。

  摇曳昏暗的烛火中,我们坐在炕的两端,把脚伸进被子里,被子很大,谁也碰不到谁。我点起一根烟,想些自己的事,几乎忘了还有个女孩坐在对面。

  "能不能给我一支烟?"房间里突然响起她的声音。

  有了上次喝酒的经验,我果断地说:"不早了,快睡吧。"吹灭蜡烛,我飞快地躺下,不想给她更多没有意义的时间,睡眠对她来说,比胡思乱想来得好些。

  不知过了多久,我听到一阵声音。那个声音小心翼翼,时断时续,最后移到了我身边。我有点吃惊,但仍坚持闭着眼一动不动地平躺着,听觉和触觉都达到最灵敏的状态。

  一股不同于热炕的温热气息拂过脸颊,我紧张得都快出汗了。

  那个气息一下一下地拂过,有一点痒,我不敢猜想她在做什么,她要做什么。几秒钟后,发生了一件我料想不到的事如果我的判断不错的话她的唇贴在了我的右颊上。

  我差一点就要坐起来了,可脸部的那种感觉使我丧失了一切力量。她的唇柔软、温热,我感受到比火炕还要高的热度,脑子里先是一片混乱接着又一片空白。在我还未来得及确定些什么的时候,那个热度消失了,她移开了。

  我紧张地等待着,打算她若再有什么举动就冲出门去站到院子里,哪怕第二天清晨主人发现我已被冻僵。

  房中静得让人不安,我几乎可以听到外面落雪的声音。几分钟后,十几分钟或者几十分钟后,我在疲惫中沉沉睡过去。

  清晨,我从梦中醒来,睁开眼,天已大亮,雪停了,床上只剩下我一个,被子那边什么也没有。我急忙穿衣下地,一开门,院中的白雪映着阳光,刺得我几乎睁不开眼。一个包着红头巾、穿着羊皮背心的姑娘在院中扫雪,远处落满了雪的大山好像就在她脚边。

  听见门响,她回过头来,在白雪与阳光中一笑。那笑容比白雪和阳光还要灿烂。

  我呆看着她,也许是这么多天来第一次这样认真地看着她……

  第二年春天,我们挽手走在街头,我突然对她说:去年你真可笑,那么大的包里却什么有用的东西都没装。"她转过头看着我,眼中含着狡黠,一字一句地说:"你错了,包里除了裙子,还有一样东西叫爱情。
Dec 25
XMLHttpRequest对象是当今所有AJAX和Web 2.0应用程序的技术基础。尽管软件经销商和开源社团现在都在提供各种AJAX框架以进一步简化XMLHttpRequest对象的使用;但是,我们仍然很有必要理解这个对象的详细工作机制。

  一、 引言

  异步JavaScript与XML(AJAX)是一个专用术语,用于实现在客户端脚本与服务器之间的数据交互过程。这一技术的优点在于,它向开发者提供了一种从Web服务器检索数据而不必把用户当前正在观察的页面回馈给服务器。与现代浏览器的通过存取浏览器DOM结构的编程代码(JavaScript)动态地改变被显示内容的支持相配合,AJAX让开发者在浏览器端更新被显示的HTML内容而不必刷新页面。换句话说,AJAX可以使基于浏览器的应用程序更具交互性而且更类似传统型桌面应用程序。

  Google的Gmail和Outlook Express就是两个使用AJAX技术的我们所熟悉的例子。而且,AJAX可以用于任何客户端脚本语言中,这包括JavaScript,Jscript和VBScript。

  AJAX利用一个构建到所有现代浏览器内部的对象-XMLHttpRequest-来实现发送和接收HTTP请求与响应信息。一个经由XMLHttpRequest对象发送的HTTP请求并不要求页面中拥有或回寄一个<form>元素。AJAX中的"A"代表了"异步",这意味着XMLHttpRequest对象的send()方法可以立即返回,从而让Web页面上的其它HTML/JavaScript继续其浏览器端处理而由服务器处理HTTP请求并发送响应。尽管缺省情况下请求是异步进行的,但是,你可以选择发送同步请求,这将会暂停其它Web页面的处理,直到该页面接收到服务器的响应为止。

  微软在其Internet Explorer(IE) 5中作为一个ActiveX对象形式引入了XMLHttpRequest对象。其他的认识到这一对象重要性的浏览器制造商也都纷纷在他们的浏览器内实现了XMLHttpRequest对象,但是作为一个本地JavaScript对象而不是作为一个ActiveX对象实现。而如今,在认识到实现这一类型的价值及安全性特征之后,微软已经在其IE 7中把XMLHttpRequest实现为一个窗口对象属性。幸运的是,尽管其实现(因而也影响到调用方式)细节不同,但是,所有的浏览器实现都具有类似的功能,并且实质上是相同方法。目前,W3C组织正在努力进行XMLHttpRequest对象的标准化,并且已经发行了有关该W3C规范的一个草案。

  本文将对XMLHttpRequest对象API进行详细讨论,并将解释其所有的属性和方法。

  二、 XMLHttpRequest对象的属性和事件

  XMLHttpRequest对象暴露各种属性、方法和事件以便于脚本处理和控制HTTP请求与响应。下面,我们将对此展开详细的讨论。
readyState属性

  当XMLHttpRequest对象把一个HTTP请求发送到服务器时将经历若干种状态:一直等待直到请求被处理;然后,它才接收一个响应。这样以来,脚本才正确响应各种状态-XMLHttpRequest对象暴露一个描述对象的当前状态的readyState属性,如表格1所示。

  表格1.XMLHttpRequest对象的ReadyState属性值列表。

ReadyState取值 描述
0  描述一种"未初始化"状态;此时,已经创建一个XMLHttpRequest对象,但是还没有初始化。
1  描述一种"发送"状态;此时,代码已经调用了XMLHttpRequest open()方法并且XMLHttpRequest已经准备好把一个请求发送到服务器。
2  描述一种"发送"状态;此时,已经通过send()方法把一个请求发送到服务器端,但是还没有收到一个响应。
3  描述一种"正在接收"状态;此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束。
4  描述一种"已加载"状态;此时,响应已经被完全接收。


  onreadystatechange事件

  无论readyState值何时发生改变,XMLHttpRequest对象都会激发一个readystatechange事件。其中,onreadystatechange属性接收一个EventListener值-向该方法指示无论readyState值何时发生改变,该对象都将激活。

  responseText属性

  这个responseText属性包含客户端接收到的HTTP响应的文本内容。当readyState值为0、1或2时,responseText包含一个空字符串。当readyState值为3(正在接收)时,响应中包含客户端还未完成的响应信息。当readyState为4(已加载)时,该responseText包含完整的响应信息。

  responseXML属性

  此responseXML属性用于当接收到完整的HTTP响应时(readyState为4)描述XML响应;此时,Content-Type头部指定MIME(媒体)类型为text/xml,application/xml或以+xml结尾。如果Content-Type头部并不包含这些媒体类型之一,那么responseXML的值为null。无论何时,只要readyState值不为4,那么该responseXML的值也为null。

  其实,这个responseXML属性值是一个文档接口类型的对象,用来描述被分析的文档。如果文档不能被分析(例如,如果文档不是良构的或不支持文档相应的字符编码),那么responseXML的值将为null。

  status属性

  这个status属性描述了HTTP状态代码,而且其类型为short。而且,仅当readyState值为3(正在接收中)或4(已加载)时,这个status属性才可用。当readyState的值小于3时试图存取status的值将引发一个异常。

  statusText属性

  这个statusText属性描述了HTTP状态代码文本;并且仅当readyState值为3或4才可用。当readyState为其它值时试图存取statusText属性将引发一个异常。

  三、 XMLHttpRequest对象的方法

  XMLHttpRequest对象提供了各种方法用于初始化和处理HTTP请求,下列将逐个展开详细讨论。

  abort()方法

  你可以使用这个abort()方法来暂停与一个XMLHttpRequest对象相联系的HTTP请求,从而把该对象复位到未初始化状态。

  open()方法

  你需要调用open(DOMString method,DOMString uri,boolean async,DOMString username,DOMString password)方法初始化一个XMLHttpRequest对象。其中,method参数是必须提供的-用于指定你想用来发送请求的HTTP方法(GET,POST,PUT,Delete或HEAD)。为了把数据发送到服务器,应该使用POST方法;为了从服务器端检索数据,应该使用GET方法。另外,uri参数用于指定XMLHttpRequest对象把请求发送到的服务器相应的URI。借助于window.document.baseURI属性,该uri被解析为一个绝对的URI-换句话说,你可以使用相对的URI-它将使用与浏览器解析相对的URI一样的方式被解析。async参数指定是否请求是异步的-缺省值为true。为了发送一个同步请求,需要把这个参数设置为false。对于要求认证的服务器,你可以提供可选的用户名和口令参数。在调用open()方法后,XMLHttpRequest对象把它的readyState属性设置为1(打开)并且把responseText、responseXML、status和statusText属性复位到它们的初始值。另外,它还复位请求头部。注意,如果你调用open()方法并且此时readyState为4,则XMLHttpRequest对象将复位这些值。

  send()方法

  在通过调用open()方法准备好一个请求之后,你需要把该请求发送到服务器。仅当readyState值为1时,你才可以调用send()方法;否则的话,XMLHttpRequest对象将引发一个异常。该请求被使用提供给open()方法的参数发送到服务器。当async参数为true时,send()方法立即返回,从而允许其它客户端脚本处理继续。在调用send()方法后,XMLHttpRequest对象把readyState的值设置为2(发送)。当服务器响应时,在接收消息体之前,如果存在任何消息体的话,XMLHttpRequest对象将把readyState设置为3(正在接收中)。当请求完成加载时,它把readyState设置为4(已加载)。对于一个HEAD类型的请求,它将在把readyState值设置为3后再立即把它设置为4。

  send()方法使用一个可选的参数-该参数可以包含可变类型的数据。典型地,你使用它并通过POST方法把数据发送到服务器。另外,你可以显式地使用null参数调用send()方法,这与不用参数调用它一样。对于大多数其它的数据类型,在调用send()方法之前,应该使用setRequestHeader()方法(见后面的解释)先设置Content-Type头部。如果在send(data)方法中的data参数的类型为DOMString,那么,数据将被编码为UTF-8。如果数据是Document类型,那么将使用由data.xmlEncoding指定的编码串行化该数据。

  setRequestHeader()方法

  该setRequestHeader(DOMString header,DOMString value)方法用来设置请求的头部信息。当readyState值为1时,你可以在调用open()方法后调用这个方法;否则,你将得到一个异常。

  getResponseHeader()方法

  getResponseHeader(DOMString header,value)方法用于检索响应的头部值。仅当readyState值是3或4(换句话说,在响应头部可用以后)时,才可以调用这个方法;否则,该方法返回一个空字符串。

  getAllResponseHeaders()方法

  该getAllResponseHeaders()方法以一个字符串形式返回所有的响应头部(每一个头部占单独的一行)。如果readyState的值不是3或4,则该方法返回null。

  四、 发送请求

  在AJAX中,许多使用XMLHttpRequest的请求都是从一个HTML事件(例如一个调用JavaScript函数的按钮点击(onclick)或一个按键(onkeypress))中被初始化的。AJAX支持包括表单校验在内的各种应用程序。有时,在填充表单的其它内容之前要求校验一个唯一的表单域。例如要求使用一个唯一的UserID来注册表单。如果不是使用AJAX技术来校验这个UserID域,那么整个表单都必须被填充和提交。如果该UserID不是有效的,这个表单必须被重新提交。例如,一个相应于一个要求必须在服务器端进行校验的Catalog ID的表单域可能按下列形式指定:



<form name="validationForm" action="validateForm" method="post">
<table>
 <tr><td>Catalog Id:</td>
  <td>
   <input type="text" size="20" id="catalogId" name="catalogId" autocomplete="off" onkeyup="sendRequest()">
  </td>
  <td><div id="validationMessage"></div></td>
 </tr>
</table></form>
  前面的HTML使用validationMessage div来显示相应于这个输入域Catalog Id的一个校验消息。onkeyup事件调用一个JavaScript sendRequest()函数。这个sendRequest()函数创建一个XMLHttpRequest对象。创建一个XMLHttpRequest对象的过程因浏览器实现的不同而有所区别。如果浏览器支持XMLHttpRequest对象作为一个窗口属性(所有普通的浏览器都是这样的,除了IE 5和IE 6之外),那么,代码可以调用XMLHttpRequest的构造器。如果浏览器把XMLHttpRequest对象实现为一个ActiveXObject对象(就象在IE 5和IE 6中一样),那么,代码可以使用ActiveXObject的构造器。下面的函数将调用一个init()函数,它负责检查并决定要使用的适当的创建方法-在创建和返回对象之前。

<script type="text/javascript">
function sendRequest(){
 var xmlHttpReq=init();
 function init(){
  if (window.XMLHttpRequest) {
   return new XMLHttpRequest();
  }
 else if (window.ActiveXObject) {
  return new ActiveXObject("Microsoft.XMLHTTP");
 }
}
</script>
  接下来,你需要使用Open()方法初始化XMLHttpRequest对象-指定HTTP方法和要使用的服务器URL。

var catalogId=encodeURIComponent(document.getElementById("catalogId").value);
xmlHttpReq.open("GET", "validateForm?catalogId=" + catalogId, true);
  默认情况下,使用XMLHttpRequest发送的HTTP请求是异步进行的,但是你可以显式地把async参数设置为true,如上面所展示的。
在这种情况下,对URL validateForm的调用将激活服务器端的一个servlet,但是你应该能够注意到服务器端技术不是根本性的;实际上,该URL可能是一个ASP,ASP.NET或PHP页面或一个Web服务-这无关紧要,只要该页面能够返回一个响应-指示CatalogID值是否是有效的-即可。因为你在作一个异步调用,所以你需要注册一个XMLHttpRequest对象将调用的回调事件处理器-当它的readyState值改变时调用。记住,readyState值的改变将会激发一个readystatechange事件。你可以使用onreadystatechange属性来注册该回调事件处理器。

xmlHttpReq.onreadystatechange=processRequest;
  然后,我们需要使用send()方法发送该请求。因为这个请求使用的是HTTP GET方法,所以,你可以在不指定参数或使用null参数的情况下调用send()方法。

xmlHttpReq.send(null);

  五、 处理请求

  在这个示例中,因为HTTP方法是GET,所以在服务器端的接收servlet将调用一个doGet()方法,该方法将检索在URL中指定的catalogId参数值,并且从一个数据库中检查它的有效性。

  本文示例中的这个servlet需要构造一个发送到客户端的响应;而且,这个示例返回的是XML类型,因此,它把响应的HTTP内容类型设置为text/xml并且把Cache-Control头部设置为no-cache。设置Cache-Control头部可以阻止浏览器简单地从缓存中重载页面。



public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
 ...
 ...
 response.setContentType("text/xml");
 response.setHeader("Cache-Control", "no-cache");
}
  来自于服务器端的响应是一个XML DOM对象,此对象将创建一个XML字符串-其中包含要在客户端进行处理的指令。另外,该XML字符串必须有一个根元素。

out.println("<catalogId>valid</catalogId>");
  【注意】XMLHttpRequest对象的设计目的是为了处理由普通文本或XML组成的响应;但是,一个响应也可能是另外一种类型,如果用户代理(UA)支持这种内容类型的话。

  当请求状态改变时,XMLHttpRequest对象调用使用onreadystatechange注册的事件处理器。因此,在处理该响应之前,你的事件处理器应该首先检查readyState的值和HTTP状态。当请求完成加载(readyState值为4)并且响应已经完成(HTTP状态为"OK")时,你就可以调用一个JavaScript函数来处理该响应内容。下列脚本负责在响应完成时检查相应的值并调用一个processResponse()方法。

function processRequest(){
 if(xmlHttpReq.readyState==4){
  if(xmlHttpReq.status==200){
   processResponse();
  }
 }
}
  该processResponse()方法使用XMLHttpRequest对象的responseXML和responseText属性来检索HTTP响应。如上面所解释的,仅当在响应的媒体类型是text/xml,application/xml或以+xml结尾时,这个responseXML才可用。这个responseText属性将以普通文本形式返回响应。对于一个XML响应,你将按如下方式检索内容:

var msg=xmlHttpReq.responseXML;
  借助于存储在msg变量中的XML,你可以使用DOM方法getElementsByTagName()来检索该元素的值:

var catalogId=msg.getElementsByTagName("catalogId")[0].firstChild.nodeValue;
  最后,通过更新Web页面的validationMessage div中的HTML内容并借助于innerHTML属性,你可以测试该元素值以创建一个要显示的消息:

if(catalogId=="valid"){
 var validationMessage = document.getElementById("validationMessage");
 validationMessage.innerHTML = "Catalog Id is Valid";
}
else
{
 var validationMessage = document.getElementById("validationMessage");
 validationMessage.innerHTML = "Catalog Id is not Valid";
}
  六、 小结

  上面就是XMLHttpRequest对象使用的所有细节实现。通过不必把Web页面寄送到服务器而实现数据传送,XMLHttpRequest对象为客户端与服务器之间提供了一种动态的交互能力。你可以使用JavaScript启动一个请求并处理相应的返回值,然后使用浏览器的DOM方法更新页面中的数据。
分页: 182/196 第一页 上页 177 178 179 180 181 182 183 184 185 186 下页 最后页 [ 显示模式: 摘要 | 列表 ]