使用 Rico JavaScript 库、ColdFusion MX 7 和 Windows Indexing Service 构建一个启用 Ajax 的搜索页面
2010-03-09 00:00:00 来源:WEB开发网第一次加载此页面时 (onLoad event),请求处理程序使用 Ajax 引擎进行注册。此处理程序将服务器端页面(此页面处理此请求)的 URL 与在客户端用作其标识符的一个名称相关联。此外,因为此页面提供了一个由 Ajax 引擎使用搜索结果进行更新的 div 区段,所以此页面必须注册为一个元素:
ajaxEngine.registerRequest('getSearchResults','ajax_results.cfm');
ajaxEngine.registerAjaxElement('SearchResults');
要避免信息超载,显示结果被限制为预定义的条目数;并提供了 JavaScript 函数以进行向前或向后导航。其中每个函数都生成一个 Ajax 请求来调用服务端的页面,并将其传递给 URL 上的两个参数: qu(要查找的字符串)和 pg(要显示结果的页面数)。
在服务器端,此页面(参见 清单 2)检索 URL 参数,查询索引内容,按客户机请求选择结果的正确子集,并将典型的 ajax-response 以 XML 格式打包返回给浏览器。在 ColdFusio 中,我使用 cfcontent 标记来指定要返回给浏览器的内容类型。
清单 2. ajax_results.cfm 服务器页面
<cfcontent type="text/xml">
<ajax-response>
<response type="element" id="SearchResults">
<h1>Search results</h1>
<cfscript>
PageSize = 10;
MaxRecords = 50;
if (IsDefined("URL.qu")) {
SearchString = URL.qu;
}
else {
SearchString = "";
}
if (IsDefined("URL.pg") and IsNumeric(URL.pg)) {
RequestedPage = Val(URL.pg);
}
else {
RequestedPage = 1;
}
</cfscript>
<cfif SearchString eq "">
<p>Your search did not match any documents.</p>
<cfelse>
<cfscript>
QueryString = SearchString & " AND ##filename *.htm?";
ixQuery = CreateObject("COM","ixsso.Query");
ixQuery.Query = QueryString;
ixQuery.Columns = "filename,size,rank,characterization,vpath,DocTitle,DocAuthor";
ixQuery.SortBy = "rank[d], DocTitle";
ixQuery.MaxRecords = MaxRecords;
RS = ixQuery.CreateRecordSet("nonsequential");
if (RS.EOF) {
WriteOutput("<p>Your search did not match any documents.</p>");
}
else {
RS.PageSize = PageSize;
PageCount = RS.PageCount;
if ((RequestedPage lt 1) or (RequestedPage gt PageCount)) {
RequestedPage = 1;
}
RS.AbsolutePage = RequestedPage;
if (RS.RecordCount gt 0) {
FirstRecordOnPage = RS.AbsolutePosition;
LastRecordOnPage = FirstRecordOnPage + PageSize - 1;
if (LastRecordOnPage gt RS.RecordCount) {
LastRecordOnPage = RS.RecordCount;
}
WriteOutput("<p>");
WriteOutput("Results <strong>" & FirstRecordOnPage & " - " & LastRecordOnPage);
WriteOutput("</strong> of <strong>" & RS.RecordCount & "</strong> (page ");
WriteOutput(RequestedPage & " of " & PageCount & ")");
if (RequestedPage gt 1) {
WriteOutput(" <a href='javascript:getPreviousResults()'>Previous results</a>");
}
if ((PageCount gt 1) and (RequestedPage neq PageCount)) {
WriteOutput(" <a href='javascript:getNextResults()'>Next results</a>");
}
WriteOutput("</p>");
}
while (not (RS.EOF or (RS.AbsolutePage neq RequestedPage))) {
WriteOutput("<p>");
WriteOutput("<a href='" & RS.Fields.Item("vpath").Value & "' target='_blank'>");
WriteOutput(XmlFormat(RS.Fields.Item("DocTitle").Value) & "</a>");
WriteOutput("<br />");
WriteOutput(XmlFormat(RS.Fields.Item("characterization").Value));
WriteOutput("</p>");
RS.MoveNext();
}
}
RS.Close();
ReleaseComObject(RS);
ReleaseComObject(ixQuery);
</cfscript>
</cfif>
</response>
</ajax-response>
Tags:使用 Rico JavaScript
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接