当前位置: 首页 > news >正文

ajax:简单搜索实践篇

两个.aspx文件,一个叫Default.aspx,一个叫AjaxOperations.aspx,第一个用来输入搜索数据,后一个用来对搜索关键字进行处理。js文件夹下面还有一个testJs.js的文件,它就是ajax操作的核心部分。不错,code is cheap。看代码:
ContractedBlock.gif ExpandedBlockStart.gif Code
// testJs.js

// 此函数等价于document.getElementById /document.all
function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } }


// 创建 XMLHttpRequest对象,以发送ajax请求 
function createXMLHTTP() {
    
var xmlHttp = false;
    
var arrSignatures = ["MSXML2.XMLHTTP.5.0""MSXML2.XMLHTTP.4.0",
                         
"MSXML2.XMLHTTP.3.0""MSXML2.XMLHTTP",
                         
"Microsoft.XMLHTTP"];
    
for (var i = 0; i < arrSignatures.length; i++) {
        
try {
            xmlHttp 
= new ActiveXObject(arrSignatures[i]);
            
return xmlHttp;
        }
        
catch (oError) {
            xmlHttp 
= false//ignore
        }
    }
    
// throw new Error("MSXML is not installed on your system."); 
    if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
        xmlHttp 
= new XMLHttpRequest();
    }
    return xmlHttp;
}

function addAjaxSearch() {
    inputField 
= $("txtSearch");
    completeTable 
= $("suggestTb");
    completeDiv 
= $("popup");
    completeBody 
= $("suggestBody");

    
var tempStr = inputField.value;
    
// alert(tempStr);
    var keyWord = encodeURI(tempStr);
    
if (tempStr == "")
        
return;
    
var xmlReq = createXMLHTTP();
    xmlReq.open(
"post""AjaxOperations.aspx?searchKeyword=" + keyWord, true);
    xmlReq.onreadystatechange 
= function() {
        
if (xmlReq.readyState == 4) {
            
if (xmlReq.status == 200) {
                
//xmlReq.responseText为输出的那段字符串
                setNames(xmlReq.responseText);
            }
            
else {
                alert(
"Connect the server failed!");
            }
        }
    }
    xmlReq.send(
null);
}

// 设置div中的表格数据
function setNames(names) {
    
if (names == "") {
        clearNames();
        
return;
    }
    clearNames(); 
// 清空div中已有的的表格数据
    setOffsets(); // 设置div到合适的位置

    
var row, cell, txtNode;
    
var s = names.split("#");
    
for (var i = 0; i < s.length; i++) { // 显示类似search下拉选择项
        var nextNode = s[i];
        row 
= document.createElement("tr");
        cell 
= document.createElement("td");
        cell.onmouseout 
= function() { this.style.backgroundColor = ''; };
        cell.onmouseover 
= function() { this.style.backgroundColor = '#E8F2FE'; };
        cell.onclick 
= function() { completeField(this); }; // 搜索框设置为选择的数据
        cell.pop = "T";
        txtNode 
= document.createTextNode(nextNode);
        cell.appendChild(txtNode);
        row.appendChild(cell);
        $(
"suggestBody").appendChild(row);
    }
}

// 清空div中已有的的表格数据
function clearNames() {
    completeBody 
= $("suggestBody");
    
var ind = completeBody.childNodes.length;

    
for (var i = ind - 1; i >= 0; i--) {
        completeBody.removeChild(completeBody.childNodes[i]);
    }
    completeDiv 
= $("popup");
    completeDiv.style.border 
= "none";
}

// 设置div到合适的位置
function setOffsets() {
    completeTable.style.width 
= inputField.offsetWidth; +"px";
    
var left = calculateOffset(inputField, "offsetLeft");
    
var top = calculateOffset(inputField, "offsetTop"+ inputField.offsetHeight;
    completeDiv.style.border 
= "black 1px solid";
    completeDiv.style.left 
= left + "px";
    completeDiv.style.top 
= top + "px";
}

function calculateOffset(field, attr) {
    
var offset = 0;
    
while (field) {
        offset 
+= field[attr];
        field 
= field.offsetParent;
    }
    
return offset;
}

// 搜索框设置为选择的数据
function completeField(cell) {
    inputField.value 
= cell.firstChild.nodeValue; // 搜索框设置为选择的数据
    clearNames(); //清空div中已有的的表格数据
}

//用来设置当鼠标失去焦点后文本框的隐藏
document.onmousedown = function() {
    
if (!event.srcElement.pop)
        clearNames();
//填写输入框
Default.aspx:
ContractedBlock.gif ExpandedBlockStart.gif Code
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebTest2008.Default" %>

<!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 id="Head1" runat="server">
    
<title>Ajax Search</title>

 
<script src="js/testJs.js" type="text/javascript"></script>

    
<style type="text/css" media="screen">
        body
        {
            font: 11px arial;
        }
        .suggest_link
        {
            background
-color: #FFFFFF;
            padding: 2px 0px 2px 0px;
            border:solid 1px #cceeff;
        }
        .suggest_link_over
        {
            background
-color: #E8F2FE;
            padding: 2px 0px 2px 0px;
        }
        #search_suggest
        {
            position: absolute;
            background
-color: #FFFFFF;
            text
-align: left;
            border: 1px solid #
000000;
        }
    
</style>
</head>
<body>
    
<input name="txtSearch" id="txtSearch" type="text" class="suggest_link" onkeyup="addAjaxSearch();"  maxlength="200" style="width: 200px" />&nbsp;
    <input type="submit" id="cmdSearch" name="cmdSearch" value="Search" title="Run Search" />
    <div id="popup" style="position: absolute">
        
<table id="suggestTb" cellspacing="0" cellpadding="0" bgcolor="#fffafa" border="0">
            
<tbody id="suggestBody">
            
</tbody>
        </table>
    </div>
</body>
</html>
Default.aspx.cs:
ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebTest2008
{
    public partial class Default : System.Web.UI.Page
    {
        protected 
void Page_Load(object sender, EventArgs e)
        {

        }
    }
}
AjaxOperations.aspx:
ContractedBlock.gif ExpandedBlockStart.gif Code
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AjaxOperations.aspx.cs" Inherits="WebTest2008.AjaxOperations" %>
AjaxOperations.aspx.cs:
ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebTest2008
{
    
public partial class AjaxOperations : System.Web.UI.Page
    {
        
protected void Page_Load(object sender, EventArgs e)
        {
            
if (!string.IsNullOrEmpty(Request["searchKeyword"]))
            {
                
string tempStr = Request["searchKeyword"];
                
/* 测试用  实际项目中可以对数据库进行检索等等相关操作,这里简化了 */
                System.Text.StringBuilder sb 
= new System.Text.StringBuilder();
                sb.Append(tempStr 
+ " #");
                sb.Append(
"#");
                sb.Append(tempStr 
+= " " + tempStr);
                sb.Append(
"#");
                sb.Append(tempStr 
+= " " + tempStr);
                Response.Write(sb.ToString().TrimEnd(
new char[] { '#' })); 
            }
        }
    }
}
上面的代码我都已经测试通过,复制粘贴运行试试看吧。
刚看到一篇博文里说,“实时搜索带来的痛苦要远大于他带来的帮助。这就是为什么Google Suggest还处于beta测试而并没有放在主页上的原因。在Start.com Live.com上搜索的时候你是不能使用返回按钮来查看上一次搜索或返回上一页的。或许还没有人来完成这项工作,但是完成这个工作应该是很困难的至少是不太明知的或者会因此带来更多的麻烦。(译注:现在已经有很多开源的框架可以实现历史记录功能)”。其实ajax实时搜索还是很有吸引力的,现在的很多网站都有这个功能。学习一下还是很有意义的。

转载于:https://www.cnblogs.com/jeffwongishandsome/archive/2009/01/10/1322486.html

相关文章:

  • IT经典定律
  • xmlhttp-JS-实现用户是否注册无刷新验证
  • 实现Apache,Tomcat集群和负载均衡Session共用
  • 小旋风帮助文档 -持续更新中
  • 我也为ListView添加CheckBox栏
  • 博客能给你带来什么?附上博客营销经典谋略
  • 在ASP.NET中模拟Windows服务运行计划任务
  • [导入]C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式).zip(9.84 MB)...
  • 调试发行版程序 (一)
  • MOSS母板页中的PlaceHolder
  • C#正则表达式经典分类整理集合手册
  • 手机软件设计大赛报名信息
  • 1.下面三个表是DOM处理xml文件里可能用到的属性和方法。
  • 上传文件至sharepoint
  • 香干炒肉丝
  • 网络传输文件的问题
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • es6(二):字符串的扩展
  • REST架构的思考
  • SpringBoot几种定时任务的实现方式
  • 基于webpack 的 vue 多页架构
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #define与typedef区别
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (三)docker:Dockerfile构建容器运行jar包
  • (十八)SpringBoot之发送QQ邮件
  • (转)关于多人操作数据的处理策略
  • (转)详解PHP处理密码的几种方式
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .htaccess配置重写url引擎
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET性能优化(文摘)
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [\u4e00-\u9fa5] //匹配中文字符
  • [4.9福建四校联考]
  • [Angular] 笔记 18:Angular Router
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [cogs2652]秘术「天文密葬法」
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
  • [EFI]Dell Latitude-7400电脑 Hackintosh 黑苹果efi引导文件
  • [LeetCode]Pow(x,n)
  • [linux time命令学习篇] time 统计命令执行的时间
  • [poj 2001]Shortest Prefixes [Trie]
  • [Python人工智能] 四十.命名实体识别 (1)基于BiLSTM-CRF的威胁情报实体识别万字详解
  • [Spark、hadoop]spark Streaming的核心DStream
  • [Vue 配置] Vite + Vue3 项目配置 Tailwind CSS
  • [机缘参悟-118] :如何做到:从无到有,从0到1设计一个新系统或产品?如何做到总是能快速的解决复杂技术难题?