操作系统  办公  实用知识  设计  开发  WEB开发  移动开发  数据库  软件工程  网管  安全  管理  信息化  答疑  渠道 

AJAX不刷新页在聊天室的作用!

2006-12-29 网友评论 0 条 点击进入论坛

First step: Create a new page name is AutoComplete.

 http://schemas.microsoft.com/intellisense/ie5">

   基于AJAX的自动完成功能
--------------------------------------------------------------------------------
   请输入员工姓名:

       BackColor="White" CellPadding="4" GridLines="Vertical" BorderWidth="1px">
  
        员工编号:
        姓名:
        入司时间:
        职位:

AutoComplete.aspx.vb
Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Web
Imports System.Web.SessionState
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls
Imports System.Data.SqlClient
Imports AjaxPro
Namespace VB_AJAXTEST

    Public Class AutoComplete
        Inherits System.Web.UI.Page

        Protected tbSearch As System.Web.UI.WebControls.TextBox
        Protected Label2 As System.Web.UI.WebControls.Label
        Protected btnSearch As System.Web.UI.WebControls.Button
        Protected dlEmployee As System.Web.UI.WebControls.DataList
        Protected search As System.Web.UI.HtmlControls.HtmlInputText
        Protected lblMessage As System.Web.UI.WebControls.Label
        Protected Label1 As System.Web.UI.WebControls.Label

        Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
            Utility.RegisterTypeForAjax(GetType(AutoComplete))
        End Sub

        _
        Public Function GetSearchItems(ByVal query As String) As ArrayList
            Dim items As ArrayList = New ArrayList
            Dim myConnectionString As String = "SERVER=192.168.0.244;DATABASE=pubs;uid=sa;pwd=;Connect Timeout=30"
            Dim mySelectQuery As String = String.Format("select fname from employee where fname like ''{0}%''", query)
            Dim myConnection As SqlConnection = New SqlConnection(myConnectionString)
            Dim myCommand As SqlCommand = New SqlCommand(mySelectQuery, myConnection)
            myConnection.Open()
            Dim myReader As SqlDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)
            While myReader.Read
                items.Add(myReader.GetString(0))
            End While
            myReader.Close()
            Return items
        End Function

        Protected Overloads Overrides Sub OnInit(ByVal e As EventArgs)
            InitializeComponent()
            MyBase.OnInit(e)
        End Sub

        Private Sub InitializeComponent()
            AddHandler Me.btnSearch.Click, AddressOf Me.btnSearch_Click
            AddHandler Me.Load, AddressOf Me.Page_Load
        End Sub

        Private Sub btnSearch_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            BindList()
        End Sub

        Private Sub BindList()
            Dim myConnectionString As String = "SERVER=192.168.0.244;DATABASE=pubs;uid=sa;pwd=;Connect Timeout=30"
            Dim mySelectQuery As String = String.Format("select a.*,b.job_desc from employee a, jobs b where fname like ''{0}%'' and a.job_id=b.job_id", search.Value)
            Dim myConnection As SqlConnection = New SqlConnection(myConnectionString)
            Dim myCommand As SqlCommand = New SqlCommand(mySelectQuery, myConnection)
            Dim da As SqlDataAdapter = New SqlDataAdapter(myCommand)
            Dim ds As DataSet = New DataSet
            Try
                myConnection.Open()
                da.Fill(ds)
                dlEmployee.DataSource = ds.Tables(0).DefaultView
                dlEmployee.DataBind()
            Catch ex As SqlException
                Response.Write(ex.Message)
            Finally
                myConnection.Close()
            End Try
            If ds.Tables(0).Rows.Count = 0 Then
                lblMessage.Text = "没有您要查找的员工信息!"
            Else
                lblMessage.Text = ""
            End If
        End Sub

    End Class

End Namespace

Second Step: Create a AjaxTextBox.vb.
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.TextBox

Public Class AjaxTextBox
    Inherits System.Web.UI.WebControls.TextBox

#Region "Private Property"

    Private scriptFile_value As String = ""
    Private callBackFunction_value As String = ""
    Private backgroundColor_value As String = "#EEE"
    Private highlightColor_value As String = "#CCC"
    Private font_value As String = "Verdana"
    Private divPadding_value As String = "2px"
    Private divBorder_value As String = "1px solid #CCC"

#End Region

#Region "Public Property"

    Public Property ScriptFile() As String
        Get
            Return scriptFile_value
        End Get
        Set(ByVal Value As String)
            scriptFile_value = Value
        End Set
    End Property

    Public Property CallBackFunction() As String
        Get
            Return callBackFunction_value
        End Get
        Set(ByVal Value As String)
            callBackFunction_value = Value
        End Set
    End Property

    Public Property BackgroundColor() As String
        Get
            Return backgroundColor_value
        End Get
        Set(ByVal Value As String)
            backgroundColor_value = Value
        End Set
    End Property

    Public Property HighlightColor() As String
        Get
            Return highlightColor_value
        End Get
        Set(ByVal Value As String)
            highlightColor_value = Value
        End Set
    End Property

    Public Property DivFont() As String
        Get
            Return font_value
        End Get
        Set(ByVal Value As String)
            font_value = Value
        End Set
    End Property

    Public Property DivPadding() As String
        Get
            Return divPadding_value
        End Get
        Set(ByVal Value As String)
            divPadding_value = Value
        End Set
    End Property

    Public Property DivBorder() As String
        Get
            Return divBorder_value
        End Get
        Set(ByVal Value As String)
            divPadding_value = Value
        End Set
    End Property

#End Region

#Region "Public AjaxTextBox"

    Public Sub New()
        Me.Attributes.Add("AutoComplete", "off")
    End Sub

    Protected Overloads Overrides Sub Render(ByVal writer As HtmlTextWriter)
        MyBase.Render(writer)
        Page.RegisterStartupScript("LoadScript", "")
        Dim styles As String = String.Format("", BackgroundColor, HighlightColor, DivFont, DivPadding, DivBorder)
        Page.RegisterStartupScript("LookupStyles", styles)
        Page.RegisterStartupScript("RegisterScript", "")
        Page.RegisterStartupScript("RegisterCallBack", "")
    End Sub

#End Region

End Class

Third step: Create a lookup.js
// 下拉区背景色
var DIV_BG_COLOR = "#EEE";
// 高亮显示条目颜色
var DIV_HIGHLIGHT_COLOR = "#C30";
// 字体
var DIV_FONT = "Arial";
// 下拉区内补丁大小
var DIV_PADDING = "2px";
// 下拉区边框样式
var DIV_BORDER = "1px solid #CCC";


// 文本输入框
var queryField;
// 下拉区id
var divName;
// IFrame名称
var ifName;
// 记录上次选择的值
var lastVal = "";
// 当前选择的值
var val = "";
// 显示结果的下拉区
var globalDiv;
// 下拉区是否设置格式的标记
var divFormatted = false;

/**
InitQueryCode函数必须在事件的响应函数中调用,其中:
queryFieldName为文本框控件的id,
hiddenDivName为显示下拉区div的id
*/
function InitQueryCode (queryFieldName, hiddenDivName)
{
 // 指定文本输入框的onblur和onkeydown响应函数
 queryField = document.getElementById(queryFieldName);
 queryField.onblur = hideDiv;
 queryField.onkeydown = keypressHandler;

 // 设置queryField的autocomplete属性为"off"
 queryField.autocomplete = "off";

 // 如果没有指定hiddenDivName,取默认值"querydiv"
 if (hiddenDivName)
 {
  divName = hiddenDivName;
 }
 else
 {
  divName = "querydiv";
 }
 
 // IFrame的name
 ifName = "queryiframe";
 
 // 100ms后调用mainLoop函数
 setTimeout("mainLoop()", 100);
}

/**
获取下拉区的div,如果没有则创建之
*/
function getDiv (divID)
{
 if (!globalDiv)
 {
  // 如果div在页面中不存在,创建一个新的div
 
  if (!document.getElementById(divID))
  {
   var newNode = document.createElement("div");
   newNode.setAttribute("id", divID);
   document.body.appendChild(newNode);
  }

  // globalDiv设置为div的引用 
  globalDiv = document.getElementById(divID);

  // 计算div左上角的位置 
  var x = queryField.offsetLeft;
  var y = queryField.offsetTop + queryField.offsetHeight;
  var parent = queryField;
  while (parent.offsetParent)
  {
   parent = parent.offsetParent;
   x += parent.offsetLeft;
   y += parent.offsetTop;
  }

  // 如果没有对div设置格式,则为其设置相应的显示样式 
  if (!divFormatted)
  {
   globalDiv.style.backgroundColor = DIV_BG_COLOR;
   globalDiv.style.fontFamily = DIV_FONT;
   globalDiv.style.padding = DIV_PADDING;
   globalDiv.style.border = DIV_BORDER;
   globalDiv.style.width = "100px";
   globalDiv.style.fontSize = "90%";

   globalDiv.style.position = "absolute";
   globalDiv.style.left = x + "px";
   globalDiv.style.top = y + "px";
   globalDiv.style.visibility = "hidden";
   globalDiv.style.zIndex = 10000;

   divFormatted = true;
  }
 }

 return globalDiv;
}

/**
根据返回的结果集显示下拉区
*/
function showQueryDiv(resultArray)
{
 // 获取div的引用
 var div = getDiv(divName);
 
 // 如果div中有内容,则删除之
 while (div.childNodes.length > 0)
  div.removeChild(div.childNodes[0]);

 // 依次添加结果
 for (var i = 0; i < resultArray.length; i++)
 {
  // 每一个结果也是一个div
  var result = document.createElement("div");
  // 设置结果div的显示样式
  result.style.cursor = "pointer";
  result.style.padding = "2px 0px 2px 0px";
  // 设置为未选中
  _unhighlightResult(result);
  // 设置鼠标移进、移出等事件响应函数
  result.onmousedown = selectResult;
  result.onmouseover = highlightResult;
  result.onmouseout = unhighlightResult;

  // 结果的文本是一个span
  var result1 = document.createElement("span");
  // 设置文本span的显示样式
  result1.className = "result1";
  result1.style.textAlign = "left";
  result1.style.fontWeight = "bold";
  result1.innerHTML = resultArray[i];
 
  // 将span添加为结果div的子节点
  result.appendChild(result1);
 
  // 将结果div添加为下拉区的子节点
  div.appendChild(result);
 }

 // 如果结果集不为空,则显示,否则不显示
 showDiv(resultArray.length > 0);
}

/**
用户点击某个结果时,将文本框的内容替换为结果的文本,
并隐藏下拉区
*/
function selectResult()
{
 _selectResult(this);
}

// 选择一个条目
function _selectResult(item)
{
 var spans = item.getElementsByTagName("span");
 if (spans)
 {
  for (var i = 0; i < spans.length; i++)
  {
   if (spans[i].className == "result1")
   {
    queryField.value = spans[i].innerHTML;
    lastVal = val = escape(queryField.value);
    mainLoop();
    queryField.focus();
    showDiv(false);
    return;
   }
  }
 }
}

/**
当鼠标移到某个条目之上时,高亮显示该条目
*/
function highlightResult()
{
 _highlightResult(this);
}

function _highlightResult(item)
{
 item.style.backgroundColor = DIV_HIGHLIGHT_COLOR;
}

/**
当鼠标移出某个条目时,正常显示该条目
*/
function unhighlightResult()
{
 _unhighlightResult(this);
}

function _unhighlightResult(item)
{
 item.style.backgroundColor = DIV_BG_COLOR;
}

/**
显示/不显示下拉区
*/
function showDiv (show)
{
 var div = getDiv(divName);
 if (show)
 {
  div.style.visibility = "visible";
 }
 else
 {
  div.style.visibility = "hidden";
 }
 //adjustiFrame();
}

/**
隐藏下拉区
*/
function hideDiv ()
{
 showDiv(false);
}

/**
调整IFrame的位置,这是为了解决div可能会显示在输入框后面的问题
*/
function adjustiFrame()
{
 // 如果没有IFrame,则创建之
 if (!document.getElementById(ifName))
 {
  var newNode = document.createElement("iFrame");
  newNode.setAttribute("id", ifName);
  newNode.setAttribute("src", "javascript:false;");
  newNode.setAttribute("scrolling", "no");
  newNode.setAttribute("frameborder", "0");
  document.body.appendChild(newNode);
 }

 iFrameDiv = document.getElementById(ifName);
 var div = getDiv(divName);

 // 调整IFrame的位置与div重合,并在div的下一层 
 try
 {
  iFrameDiv.style.position = "absolute";
  iFrameDiv.style.width = div.offsetWidth;
  iFrameDiv.style.height = div.offsetHeight;
  iFrameDiv.style.top = div.style.top;
  iFrameDiv.style.left = div.style.left;
  iFrameDiv.style.zIndex = div.style.zIndex - 1;
  iFrameDiv.style.visibility = div.style.visibility;
 }
 catch (e)
 {
 }
}

/**
文本输入框的onkeydown响应函数
*/
function keypressHandler (evt)
{
 // 获取对下拉区的引用 
 var div = getDiv(divName);
 
 // 如果下拉区不显示,则什么也不做 
 if (div.style.visibility == "hidden")
 {
  return true;
 }

 // 确保evt是一个有效的事件
 if (!evt && window.event)
 {
  evt = window.event;
 }
 var key = evt.keyCode;

 var KEYUP = 38;
 var KEYDOWN = 40;
 var KEYENTER = 13;
 var KEYTAB = 9;
 
 // 只处理上下键、回车键和Tab键的响应 
 if ((key != KEYUP) && (key != KEYDOWN) && (key != KEYENTER) && (key != KEYTAB))
 {
  return true;
 }

 var selNum = getSelectedSpanNum(div);
 var selSpan = setSelectedSpan(div, selNum);
 
 // 如果键入回车和Tab,则选择当前选择条目
 if ((key == KEYENTER) || (key == KEYTAB))
 {
  if (selSpan)
  {
   _selectResult(selSpan);
  }
  evt.cancelBubble = true;
  return false;
 }
 else //如果键入上下键,则上下移动选中条目
 {
  if (key == KEYUP)
  {
   selSpan = setSelectedSpan(div, selNum - 1);
  }
  if (key == KEYDOWN)
  {
   selSpan = setSelectedSpan(div, selNum + 1);
  }
  if (selSpan)
  {
   _highlightResult(selSpan);
  }
 }

 // 显示下拉区
 showDiv(true);
 return true;
}

/**
获取当前选中的条目的序号
*/
function getSelectedSpanNum(div)
{
 var count = -1;
 var spans = div.getElementsByTagName("div");
 if (spans)
 {
  for (var i = 0; i < spans.length; i++)
  {
   count++;
   if (spans[i].style.backgroundColor != div.style.backgroundColor)
   {
    return count;
   }
  }
 }

 return -1;
}

/**
选择指定序号的结果条目
*/
function setSelectedSpan(div, spanNum)
{
 var count = -1;
 var thisSpan;
 var spans = div.getElementsByTagName("div");
 if (spans)
 {
  for (var i = 0; i < spans.length; i++)
  {
   if (++count == spanNum)
   {
    _highlightResult(spans[i]);
    thisSpan = spans[i];
   }
   else
   {
    _unhighlightResult(spans[i]);
   }
  }
 }

 return thisSpan;
}

Fourthly: Add httpHandlers request in web.config.

Dont'' forget download a AjaxPro.dll then add the dll to the project.

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 登录邮箱: 密码:
  匿名发表
今日推荐
技术文库(共有 46430 篇文章)
操作系统
办公软件
实用知识
网络管理
软件开发
WEB开发
软件工程
数据库
设计在线
信息安全
行业信息化
管理信息化
重点推荐
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail