Nov 02

在用Lucene.Net做一个文件搜索的兴趣项目,主要用来帮我找电影。其中一个需求是高亮显示关键词,使用Highlighter.Net可以解决,但是当有停止词的时候,常常会丢失部分数据,我也懒得去修改它的源代码,想了想,可以用Javascript在客户端高亮显示,一小段代码就完成了,:-)

<script type="text/javascript" language="javascript">
var query="";
function highlight(){
    var terms = null;
    try{
        terms = query.split(" ");
    }
    catch(e){}
    $$(’span[class="cc"]‘).each(
        function(item){
            var data = item.innerHTML;
            if(!data) return;
            for(var j=0;j<terms.length;j++){
                var term = terms[j].strip();
                var pattern = new RegExp(term, "i");
                var hiterm = "<span class=’hi’>" + term + "</span>";
                try{
                    data = data.gsub(pattern, hiterm);
                }catch(exception){}
            }
            item.innerHTML = data;
        }
    );
}
</script>

稍微解释一下:基本过程是,把需要高亮显示的Dom节点找出来,取得它的innerHTML,然后使用正则表达式替换成高亮的语法。这里用到了两个prototype的函数,一个是$$(’params’),用类似XPath的语法选取Dom节点;另一个是String.gsub(pattern, substr),是prototype对字符串对象扩展的操作。prototype是一个开源的AJAX包,官方站点http://www.prototypejs.org

Sep 19

这个是7月底写的一个PPT,简要评估一些常见的AJAX框架,:)

下载地址:http://www.frankdu.com/blog/content/binary/AJAX_Framework_Assessment.pdf

Jan 30

下载地址是: http://ajax.asp.net/downloads/default.aspx?tabid=47

等了这么久, 终于发布了! 可惜最近没有时间, 要忙实验室的很多事情, 等春节回来再详细阅读它的文档吧.

现在开始学习的人, 是最幸福的, 不用经受文档和API剧烈变化的痛苦。

不过,对于有基础的人,强烈推荐阅读O’Reilly的《AJAX Hacks》一书,如果从底层更了解AJAX的工作机制,有利于更灵活的使用AJAX。

Jan 07

12月30日给msra的小组同事做了简单介绍ASP.NET AJAX的演讲,一直想把PPT贴上来,可是这些天的网络速度慢的够呛,不知道光缆什么时候全部修好呢?还有准备尝试在手机上收gmail,可是这个网速……还是先算了吧,还得耐心等一段时间。

今天特意把PPT放上来,希望对能有所帮助,比如如何调试Javascript,比如如何使用ASP.NET AJAX。这个PPT引用了水木社区dotNET版一些网友的想法,谢谢他们。

下载:?A_Brief_Introduction_to_ASP.NET_AJAX.pdf (616.68 KB)

根据日志,这些天通过百度搜索,找到的我的博客的,基本上都是ASP.NET AJAX的,一般每天都是几十个,希望对这些朋友,能有所帮助。:)

?

Dec 24

如果使用过UpdatePanel,可能已经注意到,当一个页面有多个UpdatePanel的时候,异步页面请求同时只能有一个请求(callback),而且后发起的请求会取消先发的请求。怎么改变这个次序呢,比如一个异步请求已经在进行,怎么阻止其它请求呢?这就要用到PageRequestManager。(让多个请求并发进行,以后会介绍)

通过PageRequestMangaer还能提供更多的feature:提供取消callback的选项,自定义错误处理消息,访问底层进行异步请求的request/response对象。

总的来看,PageRequestManager是运行在浏览器端的协调者,它和服务器端的UpdatePanel一起,把局部页面更新的复杂性抽象化,提供给开发者方面的使用接口。

PageRequestManager提供了以下事件,让开发者能加入自己的Javascript脚本来改变缺省的行为:

1. initializeRequest

Raised before the request is initialized for an asynchronous postback. Event data is passed to handlers as an InitializeRequestEventArgs object. The object makes available the element that caused the postback and the underlying request object.

2. beginRequest

Raised just before the asynchronous postback is sent to the server. Event data is passed to handlers as a BeginRequestEventArgs object. The object makes available the element that caused the postback and the underlying request object.

3. pageLoading

Raised after the response to the last asynchronous postback has been received but before any updates to the page have been made. Event data is passed to handlers as a PageLoadingEventArgs object. The object makes available information about what panels will be deleted and updated as a result of the last asynchronous postback

4. pageLoaded

Raised after page regions are updated after the last asynchronous postback. Event data is passed to handlers as a PageLoadedEventArgs object. The object makes available information about what panels were created and updated. For synchronous postbacks, panels are only created, but for asynchronous postbacks panels can be both created and updated.

5. endRequest

Raised when request processing is finished. Event data is passed to handlers as an EndRequestEventArgs object. The object makes available information about errors that have occurred and whether the error was handled. It also makes available the response object.

?

我们来分析一个使用PageRequestManager的例子:

Run the example ( view source)

这个例子中,使用了PageRequestManager来定制Update状态显示,也提供了取消请求的方法,这主要是从下面的代码中展示出来:

<script type=”text/javascript”>
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_initializeRequest(InitializeRequest);
prm.add_endRequest(EndRequest);
var postBackElement;
function InitializeRequest(sender, args) {
if (prm.get_isInAsyncPostBack())
{
???args.set_cancel(true);
}
postBackElement = args.get_postBackElement();
if (postBackElement.id == ‘ButtonTrigger’)
{
???$get(’UpdateProgress1′).style.display = “block”;
}
}
function EndRequest (sender, args) {
if (postBackElement.id == ‘ButtonTrigger’)
{
???$get(’UpdateProgress1′).style.display = “none”;
}
}
function AbortPostBack() {
if (prm.get_isInAsyncPostBack()) {
???prm.abortPostBack();
}
}
</script>

在例子中,通过给PageRequestManager的initializeRequest事件和endRequest事件加入自定义的javascript代码,实现了定制的行为。

对于PageRequestManager,使用get_isInAsyncPostBack方法或isInAsyncPostBack属性能得到当前异步请求状态;使用abortPostBack可以取消当前的请求;使用add_initializeRequest和add_endRequest分别将用户编写的javascript处理函数注册到initializeRequest事件和endRequest事件中。

另外,在函数InitializeRequest中,args.set_cancel(true)用来让先发的请求被执行,改变缺省的后发具优的行为。



得到PageRequestManager的所有方法和事件列表,请参见:


Sys.WebForms.PageRequestManager Class

Dec 21
1. Server Controls

—————————–
按上一节的步骤,安装好AJAX软件包以后(除ASP.NET AJAX Control Toolkit外),我们就可以进行开发了。
先观察一下Visual Studio 2005的控件工具箱,多了一个类别:AJAX Extensions。其中包含了5个控件,分别是:
  1. Timer
  2. ScriptManager
  3. ScriptManagerProxy
  4. UpdateProgress
  5. UpdatePanel
?

?
?
来认识一下它们:
?
a). ScriptManager
管理页面中和客户端组件、局部页面刷新、本地化等有关系的脚本资源。ScriptManager必须位于WebForm中,即含有<form runat=”server”>标签。一个WebForm中只能含有一个ScriptManager,不论是直接使用,还是用过它的子组件使用。必须添加ScriptManager后,才能使用Timer, UpdatePanel, UpdateProgress等Server Controls。
?
b). UpdatePanel
是我们能够只刷新部分页面,而不是原来ASP.NET那样提交整个页面。一个页面中能含有多个UpdatePanel,UpdatePanel也可以嵌套。
?
c). UpdateProgress
对UpdatePanel的局部刷新,提供一个用户友好的状态信息。
?
d). Timer
用来定期触发一些事件,比如提交整个页面,或者刷新部分页面。

2. 认识UpdatePanel

—————————–
ASP.NET AJAX使我们能够通过声明的方式,来引入AJAX风格的控件、行为,而不必编写JavaScript代码。UpdatePanel就是这样一个例子,它的声明格式是:
?
<asp:UpdatePanel ID=”UpdatePanel_ID” runat=”server”>
<ContentTemplate>
… please put your controls and codes here…
</ContentTemplate>
</asp:UpdatePanel>
?
下面已经列出和AJAX相关的那段代码,可以看到,ContentTemplate中有:一个服务器端运行的显示时间的代码,一个Calendar控件。运行代码,点击Calendar控件中的任何链接,都不再把整个页面发送给服务器。实际上,使用Fiddler监视,会发现根本没有数据被发送回服务器端。也就是说,微软已经尽可能的把ContentTemplate中的局部更新计算,转移到用户浏览器中了。
?
????? <asp:ScriptManager ID=”ScriptManager1″ runat=”server” />
????? <asp:UpdatePanel ID=”UpdatePanel1″ runat=”server”>
????? <ContentTemplate>
??????? <fieldset>
??????? <legend>UpdatePanel</legend>
??????? Content to update incrementally without a full
??????? page refresh.
??????? <br />
??????? Last update:? <%=DateTime.Now.ToString() %>
??????? <br />
??????? <asp:Calendar ID=”Calendar” runat=”server”/>
??????? </fieldset>
????? </ContentTemplate>
????? </asp:UpdatePanel>
?
在一个设计好的AJAX页面中,比如Windows Live Mail或Gmail,我们可以把页面分成几个区域,分别作为UpdatePanel区域,比如email列表区域、邮件正文区域、运行信息区域等。当然,一个页面中可以有多个UpdatePanel。UpdatePanel也可用嵌套,子控件的更新不会导致整个父控件的更新,但会引起父控件的UpdateProgress显示刷新正在进行。那什么是UpdateProgress呢?请向下看。

3. 认识UpdateProgress
—————————–
使用Gmail的时候,你一定注意到了右上角的”Loading…”提示;而使用Windows Live Mail时,你一定注意到了“正在加载…”提示,当然还有一个pp的动画图片。
?
有时候,局部页面的刷新比较慢,为了给用户友好的提示,我们可以使用UpdateProgress控件。
?
在页面加入UpdateProgress控件后,只要设置它的AssociatedUpdatePanelID属性为页面关联的UpdatePanel的ID,那么UpdatePanel的异步提交(postback),都会显示UpdateProgress控件。
?
如果UpdateProgress控件的AssociatedUpdatePanelID没有设置,则整个页面的任何异步提交,都会显示这个控件。
?
多个UpdateProgress控件都可以关联到一个UpdatePanel控件上。而UpdateProgress控件也可以嵌套入UpdatePanel控件,做为子控件出现。
?
使用UpdateProgress是非常简单的,声明的格式是:
??????? <asp:UpdateProgress ID=”UpdateProgress_ID” runat=”server” AssociatedUpdatePanelID=”Related_UpdatePanel_ID”>
??????????? <ProgressTemplate>
??????????????? Update in progress….(or other info, including image, text, buttons etc.)
??????????? </ProgressTemplate>
??????? </asp:UpdateProgress>
?
下面是3个使用UpdateProgress的例子和源代码,非常明了:
?
?
?

Dec 21
Part A. 安装ASP.NET AJAX 1.0
RC


—————————–
到下面的页面下载ASP.NET AJAX 1.0
RC,运行安装程序,按照提示完成安装:
http://go.microsoft.com/fwlink/?LinkID=77296


Part B. ASP.NET AJAX Control
Toolkit


—————————–
对于Control
Toolkit我们等到用它的时候再安装,这里先不安装。

Part C. 安装AJAX Features December
CTP


—————————–
下载、运行安装程序,并按照提示完成安装
http://go.microsoft.com/fwlink/?LinkID=77294

Part D. 安装ASP.NET AJAX Sample
Applications


—————————–
1. 下载Sample
Application程序,运行安装程序,并按照提示完成安装
http://go.microsoft.com/fwlink/?LinkID=77295
2.
将文件Microsoft.Web.Preview.dll(%Program Files%\Microsoft ASP.NET\ASP.NET 2.0 AJAX
Futures December CTP\v1.0.61025)拷贝到每个Sample Application的bin目录中。

Dec 18

按:由于工作的原因,需要写一些ASP.NET AJAX(原来叫Atlas)的文章,干脆整理出来,贴在日志上分享。

首先,什么是AJAX呢?如果还不知道,可能你是AJAX的球迷然后串门走错了,也可能你刚刚开始抱着十二分的热情学习AJAX。这里主要是讲ASP.NET AJAX,关于AJAX的解释请看下面的几个链接。那,ASP.NET AJAX和AJAX的区别在哪里呢,请看后面关于名字的释疑。

—————————–
促使AJAX名字诞生著名的文章:
Ajax: A New Approach to Web Applications by Jesse James Garrett

关于“什么是AJAX”的解释

百度知道:http://zhidao.baidu.com/question/10308139.html
中文wikipedia:http://zh.wikipedia.org/wiki/AJAX
英文wikipedia:http://en.wikipedia.org/wiki/AJAX
—————————–

好了,你现在知道了AJAX包括了XHML、CSS、DOM、XML/XSLT、XMLHttpRequest、JavaScript等元素。哇,这么多!把它们粘合起来,一定是件重复琐碎、重复的劳动;更不要说,不同浏览器、不同版本、不同操作系统对这些技术支持的千差万别,所带来的调试头疼手疼腰疼……

不过,软件是可以重用的,只要有牛人牛公司提供了经过良好验证封装好的组件,就可以大大降低编写AJAX程序的成本,提高生产吞吐率。好比,当年美国西部淘金热,连卖铁锹的都能挣大钱。好了,我们可以选择的铁锹,就是AJAX框架。

AJAX框架主要分为两种,服务器端的和客户端的。服务器端的和编程语言关系密切,对于.NET来说,著名的有ASP.NET AJAX、AJAX.NET Professional等。客户端的,著名的框架有prototypedojo toolkit等。这里仅仅列出了一两个框架,但是,AJAX铁锹供应商生意是非常繁荣的,连Google和Yahoo也有推出相应的工具。问了一位在某著名中文搜速公司实习的朋友,据说他们没有用别人的框架,是自己写的;因为是直接写,可以称为大无畏的“裸写”。

关于AJAX的一些背景知识,蜻蜓点水,到此为止。很多新手,面对微软的ASP.NET AJAX这个框架,那么多的名字,很容易产生chaos,我们首先来澄清一下各个版本下的微软AJAX:

1. ASP.NET AJAX

当我们说微软的AJAX框架,基本是指这个。而且,在安装第2和3项之前,必须先安装这个。它包含了ASP.NET AJAX最核心和基本的功能,使开发者能编写AJAX风格的程序,不论是以server为中心的计算,还是以client为中心的计算。目前,最新版本是1.0 RC,正式版计划于下个月,也就是2007年1月发布。

2. ASP.NET AJAX Control Toolkit
这个主要是控件包,能给你的浏览器客户端页面加入很多眩目的元素、动画、行为。严格地说,它不能算含有全部AJAX核心元素,但可以看作一种泛AJAX控件。这个软件包,位于共享源代码社区CodePlex

3. AJAX Features CTP
这个软件包中,提供了额外的功能和控件。这些额外的特性,还没有正式加入ASP.NET AJAX中,还处于提供给社区使用,听取社区反馈的阶段。虽然还在发展阶段,但是这里一般提供了更“新”更“酷”的功能噢。关于ASP.NET AJAX和AJAX Features CTP之间的版本区别,更一目了然的描述是一个Feature Matrix,位于http://ajax.asp.net/.

4. Microsoft AJAX Library

这个由一系列JavaScript脚本组成,因此它能够运行在非Windows系统中,当然也可以用在非.NET程序中。其实它更像是一个客户端框架。这些脚本包含在ASP.NET AJAX的安装中,出于方便的目的,可以单独作为一个zip包下载。如果你只需要一个客户端框架,Microsoft AJAX Library是一个很好的选择。

这四个版本的软件包,下载地址是:

http://ajax.asp.net/default.aspx?tabid=47&subtabid=471

先写到这里,下一篇文章是关于安装微软的AJAX解决方案
p.s. 关于AJAX.NET Professional的快速入门,可以参见

这篇文章

。我也邀请了朋友写了一个更详尽的快速入门,将尽快整理好发在日志上。

Dec 04

这几天在宿舍休息之余,也跑去听了一些讲座,算是温习一下校园生活。其中有一个Web 2.0论坛,我怀着很多好奇,很想知道大佬们是否了解啥是2.0。有位嘉宾被要求解释2.0的时候,他愣了一下,然后说:“我认为2.0包含AJAX”,然后就提了AJAX的一堆优点,推测他的AJAX只是主要来自商业周刊之类的杂志,而不是开发者杂志或论坛……

对于Web开发来说,AJAX毫无疑问是一个大的改进,成功案例都耳熟能详了。AJAX给Web UI引入很多强大、丰富的特性,终于使Web UI有和传统Windows UI媲美的基本能力。如果说未来计算机主流用户界面的趋势是什么,我选择Web UI。因为它组织灵活、表现方式丰富、成本低、所有OS都支持。潜在影响它成为未来主流的因素包括:安全因素和设计模式上得到改进。

但,另一方面,AJAX也有严重的被滥用的趋势。比如浏览器需要保持更多的数据、需要增加更多的客户端计算,才能渲染完成用户呈现Presentation。比如资源请求和释放管理上的缺陷,导致系统负担上升直到严重影响用户体验。比如,测试环境不足够,没有经过充分测试,低速网络连接的用户,很容易遇到脚本错误的问题。

总之,我写这么多废话,完全是因为某著名beta版邮件系统,有上面提到的缺陷,到现在还没能成功发送一封重要的邮件。阿弥佗佛