=波波日志 > JavaScript/Ajax > ajax+asp.net+mssql无刷新聊天室=

ajax+asp.net+mssql无刷新聊天室

ajax+asp.net+mssql实现的ajax无刷新聊天室,支持html web编辑器。

为了加快速度,使用了存储过程。

asp及php版本请看下面的文章

ajax+asp+mssql无刷新聊天室
ajax+php+mssql无刷新聊天室

此例子也可以作为mssql存储过程使用的示例,如php调用mssql的存储过程,php获取mssql数据库的输出参数。

要使用不同的动态页面,只需要更改lib.js文件中RequstUrl变量的值即可。
完整示例下载

效果如下









ajax.cs
+展开
-C#
using System;
using System.Web;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
/// <summary>
///操作类
/// </summary>
public class Ajax
{
    /// <summary>
    /// 检查字符串是否为空
    /// </summary>
    /// <param name="v">字符串</param>
    /// <returns></returns>
    private static bool IsNull(string v)
    {
        if (v == null || v.Trim() == ""return true;
        else return false;
    }
    /// <summary>
    /// 转义js字符串以便输出
    /// </summary>
    /// <param name="v">字符串</param>
    /// <returns></returns>
    private static string Js(string v)
    {
        return v.Replace("'""\\'");
    }
    /// <summary>
    /// 用户登录
    /// </summary>    
    /// <returns></returns>
    public static string Login()
    {
        HttpRequest Request = HttpContext.Current.Request;
        string rStr = "";

        string UserName = Request.Form["nn"];
        if (IsNull(UserName))
        {
            rStr = "success:false,err:'昵称不能为空!'";
        }
        else if (UserName.Length > 20)
        {
            rStr = "success:false,err:'昵称不能超过20个字符!'";
        }
        else
        {
            string UserId = "", Key = "";
            SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);
            cn.Open();
            try
            {
                SqlCommand cm = new SqlCommand("ajaxLogin", cn);
                cm.CommandType = CommandType.StoredProcedure;
                cm.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 50));
                cm.Parameters["@UserName"].Value = UserName;
                //==========输出参数
                cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));
                cm.Parameters["@UserId"].Direction = ParameterDirection.Output;
                cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));
                cm.Parameters["@UserKey"].Direction = ParameterDirection.Output;
                
                cm.ExecuteNonQuery();
                UserId = cm.Parameters["@UserId"].Value.ToString().Trim();
                Key = cm.Parameters["@UserKey"].Value.ToString().Trim();
                if (UserId == "-1") rStr = @"success:false,err:'发生错误,请稍后再试!'";
                else if (UserId == "0") rStr = @"success:false,err:'已经存在此用户昵称,请修改您的昵称!'";
                else rStr += "success:true,UserId:'" + UserId + "',Key:'" + Key + "'";
                cm.Dispose();
            }
            catch (Exception e)
            {
                rStr = @"success:false,err:'原因\\n" + Js(e.Message) + "'";
            }
            cn.Close();
        }

        return rStr;
    }
    /// <summary>
    /// 删除用户信息,“用户ID+key”来删除,key参数是防止乱删除用户信息的
    /// </summary>
    /// <returns></returns>
    public static string Logout()
    {
        HttpRequest Request = HttpContext.Current.Request;
        string rStr = "", UserId = Request.Form["uid"], Key = Request.Form["key"];
        if (IsNull(UserId) || IsNull(Key)) return "success:false,err:'用户信息丢失!'";

        SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);
        cn.Open();
        try
        {
            SqlCommand cm = new SqlCommand("ajaxLogout", cn);
            cm.CommandType = CommandType.StoredProcedure;
            cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));
            cm.Parameters["@UserId"].Value = UserId;
            cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));
            cm.Parameters["@UserKey"].Value = Key;
            cm.Parameters.Add(new SqlParameter("@Result", SqlDbType.Int));
            cm.Parameters["@Result"].Direction = ParameterDirection.Output;

            cm.ExecuteNonQuery();
            
            if(cm.Parameters["@UserId"].Value.ToString().Trim()=="0")rStr = "success:false,err:'用户信息不存在!'";
            else rStr="success:true";
            cm.Dispose();
        }
        catch (Exception e)
        {
            
        }
        cn.Close();
        return rStr;
    }
    /// <summary>
    /// 发表信息
    /// </summary>
    /// <returns>发表信息,Json格式</returns>
    public static string Say()
    {
        HttpRequest Request = HttpContext.Current.Request;
        string From = Request.Form["from"], To = Request.Form["to"]
            , Key = Request.Form["key"], Msg = Request.Form["ct"], rStr = "";
        if (IsNull(From) || IsNull(Key) || IsNull(To) || IsNull(Msg)) rStr = "success:false,err:'信息传递不完整!'";
        else
        {
            SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);
            cn.Open();
            try
            {               
                SqlCommand cm = new SqlCommand("ajaxSay", cn);
                cm.CommandType = CommandType.StoredProcedure;
                cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));
                cm.Parameters["@UserKey"].Value = Key;
                cm.Parameters.Add(new SqlParameter("@From", SqlDbType.NVarChar, 18));
                cm.Parameters["@From"].Value = From;
                cm.Parameters.Add(new SqlParameter("@To", SqlDbType.NVarChar, 18));
                cm.Parameters["@To"].Value = To;
                cm.Parameters.Add(new SqlParameter("@Msg", SqlDbType.NVarChar, 800));
                cm.Parameters["@Msg"].Value = Msg;
                cm.Parameters.Add(new SqlParameter("@Result", SqlDbType.Int));
                cm.Parameters["@Result"].Direction = ParameterDirection.Output;
                cm.ExecuteNonQuery();
                if (cm.Parameters["@Result"].Value.ToString() == "0") rStr = "sucess:false,err:'发表失败!\\n原因:接收者已经不存在!'";
                else rStr = "success:true";
                cm.Dispose();
            }
            catch (Exception e)
            {
                rStr = "sucess:false,err:'发表失败!原因\\n" + Js(e.Message) + "'";
            }
            cn.Close();
        }
        return rStr;
    }
    /// <summary>
    /// 用户列表
    /// </summary>
    /// <returns>用户列表信息,Json格式</returns>
    public static string ReadUser()
    {
        HttpRequest Request = HttpContext.Current.Request;
        string rStr = "", UserId = Request.Form["uid"];
        if (IsNull(UserId)) rStr += "success:false,err:'用户id丢失!'";
        else
        {
            SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);
            cn.Open();
            try
            {
                SqlCommand cm = new SqlCommand("ajaxReadUser", cn);
                cm.CommandType = CommandType.StoredProcedure;
                cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));
                cm.Parameters["@UserId"].Value = UserId;
                string j = "";
                SqlDataReader dr = cm.ExecuteReader();
                while (dr.Read()) j += ",{id:'" + dr[0] + "',nn:'" + Js(dr[1].ToString()) + "'}";
                dr.Close();
                cm.Dispose();
                rStr = "success:true,data:[" + (j == "" ? "" : j.Substring(1)) + "]";
            }
            catch (Exception e)
            {
                rStr = @"success:false,err:'发生如下错误\\n" + Js(e.Message) + "'";
            }
            cn.Close();
        }
        return rStr;
    }
    /// <summary>
    /// 信息列表
    /// </summary>
    /// <returns>信息列表,Json格式</returns>
    public static string Read()
    {
        HttpRequest Request = HttpContext.Current.Request;
        string rStr = "";
        string UserId = Request.Form["uid"], Key = Request.Form["key"];
        if (IsNull(UserId) || IsNull(Key)) rStr = "success:false,err:'用户信息丢失!'";
        else
        {
            SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);
            cn.Open();
            try
            {
                SqlCommand cm = new SqlCommand("ajaxRead", cn);
                cm.CommandType = CommandType.StoredProcedure;
                cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));
                cm.Parameters["@UserId"].Value = UserId;
                cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));
                cm.Parameters["@UserKey"].Value = Key;
                SqlDataReader dr = cm.ExecuteReader();
                string j = "";
                while (dr.Read()) j += ",'" + Js(dr[0].ToString()) + "'";
                dr.Close();
                cm.Dispose();
                rStr = "success:true,data:[" + (j == "" ? "" : j.Substring(1)) + "]";
            }
            catch (Exception e)
            {
                rStr = "success:false,err:'发生以下错误" + Js(e.Message) + "'";
            }
            cn.Close();
        }
        return rStr;
    }
}



lib.js文件中的代码
+展开
-JavaScript
var Showbo={author:'showbo',homepage:'http://www.code-design.cn'};
Showbo.IsIE=!!document.all;
Showbo.IsFireFox=navigator.userAgent.indexOf("Firefox")!=-1;
Showbo.trim=function(v,reg){if(reg)return v.replace(reg,'');else   return v.replace(/^\s*|\s*$/,'');}
Showbo.getJson=function(v){return eval('('+v+')');}
//获取某个对象的绝对位置
Showbo.getAbsPos=function(o,addXY){o=Showbo.$(o);var p=new Object();p.x=o.offsetLeft;p.y=o.offsetTop;while(o=o.offsetParent){p.x+=o.offsetLeft;p.y+=o.offsetTop;}if(addXY){if(!isNaN(addXY.x))p.x+=addXY.x;if(!isNaN(addXY.y))p.y+=addXY.y;}return p;}
Showbo.$=function(Id,isFrame){
  var o;
  if("string"==typeof(Id))o= document.getElementById(Id);
  else if("object"==typeof(Id))o= Id;
  else return null;
  return isFrame?(Showbo.IsIE?document.frames[Id]:o.contentWindow):o;
}
Showbo.$s=function(){
   var o,tag;
   if(arguments.length==1){
      o=document;tag=arguments[0];
    }
    else{
      o=arguments[0];tag=arguments[1];
    }
    return o.getElementsByTagName(tag);
}
//扩展IE下的XMLHttpRequest
if(Showbo.IsIE&&!window.XMLHttpRequest)
window.XMLHttpRequest=function(){
  var acX=['msxml2.xmlhttp.5.0','msxml2.xmlhttp.4.0','msxml2.xmlhttp.3.0','msxml2.xmlhttp','microsoft.xmlhttp'],Xhr;
  for(var i=0;i<acX.length;i++)try{Xhr=new ActiveXObject(acX[i]);return Xhr;}catch(e){}return false;
}
Showbo.Ajax={
  pools:[]//注意pools存储的对象为{xhr:ajax对象,status:ajax的状态},其中ajax的状态为1/0,1表示在使用中,0表示readyState==4了并且执行了回调函数
  ,getObject:function(){
     for(var i=0;i<this.pools.length;i++)if(this.pools[i].status===0){
       this.pools[i].status=1;//设置为使用状态
       this.pools[i].xhr.onreadystatechange=function(){}//删除状态转换函数
       this.pools[i].xhr.abort();//调用abort
       return this.pools[i];
     }
     var xhr=new XMLHttpRequest();
     if(xhr.readyState==null){//更正某些Mozilla浏览器无readyState的问题
       xhr.readyState=0;
       xhr.addEventListener("load",function(){
         xhr.readyState=4;
         if(typeof(xhr.onreadystatechange)=="function")xhr.onreadystatechange();
       },false);
     }
     this.pools[this.pools.length]={xhr:xhr,status:1,err:false};
     return this.pools[this.pools.length-1];
  }
  ,send:function(cfg){
     if(!cfg||!cfg.url)throw("url不正确!");
     var method=cfg.method,asy="boolean"==typeof(cfg.asy)?cfg.asy:true;
     if(!method)method="get";
     if(method.toLocaleLowerCase()=='get'){
         var _dc=new Date().getTime();
         cfg.params=cfg.params?cfg.params+'&_dc='+_dc:'_dc='+_dc;
         if(cfg.url.indexOf("?")!=-1)cfg.url+="&"+cfg.params;
         else cfg.url+="?"+cfg.params;
         cfg.params=null;
     }
     else if(typeof(cfg.params)=="undefined")cfg.params='';
     var o=this.getObject();//注意并非实际的xhr对象
     if(!o.xhr)throw("未能创建ajax对象!");
     o.xhr.open(method,cfg.url,asy);
     if(method.toLocaleLowerCase()=='post')o.xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");    
     o.xhr.onreadystatechange=function(){
       if(o.xhr.readyState==4){
          if(o.xhr.status==200||o.xhr.status==0){
            if("function"==typeof(cfg.success))cfg.success(o.xhr,cfg.otherParams);            
          }
          else if("function"==typeof(cfg.failure))cfg.failure(o.xhr,cfg.otherParams);
          o.status=0;//=============更改状态为未使用
       }
     }
     o.xhr.send(cfg.params);
  }
}
var RequstUrl="op.asp";//================================为不同的编程语言时修改这个变量的值

Showbo.Chat={
  hint:false//如果有信息到来,是否提示用户
  ,UserId:-1//服务器返回的用户Id
  ,UserKey:-1//服务器返回的用户键
  ,bd:null//编辑器的document.body对象
  ,ct:null//显示信息的div
  ,selTo:null//用户select
  //下面这两个读取时间需要分开,最好不要设置为同样的,要不两个计时器会同时执行,导致获取对象时同时进入for语句获取到同一个对象,导致firefox可能在同时使用这个对象时出错
  ,timeUser:10//获取信息的时间间隔,单位为秒
  ,timeMsg:10//获取信息的时间间隔,单位为秒
  ,nowUserId:-1//如果选择了点对点对话,此对象存储的是该用户的id,初始化在线用户时用到
  ,timerUsers:null
  ,timerMsg:null
  ,chrHint:function(o){
    o.value=this.hint?'启用信息提示':'关闭信息提示';
    this.hint=!this.hint;
  }
  ,setNote:function(msg){ Showbo.$('dvOpNote').innerHTML=msg;}
  ,setBtn:function(disabled){Showbo.$('btnLT').disabled=Showbo.$('btnSend').disabled=disabled;}
  ,addItemToCT:function(msg){var d=document.createElement('div');d.innerHTML+=msg;this.ct.appendChild(d);}
  ,callback:function(xhr,op){
   var o=xhr.status==200?Showbo.getJson(xhr.responseText):{success:false,err:'动态页发生严重错误,请联系管理员!'+xhr.responseText};
   this.setNote('');
   this.setBtn(false);
   Showbo.$('dvWait').style.display='none';
   Showbo.$('frmLogin').style.display='block';
   if(o.success){
     switch(op){
       case 'login':
         Showbo.$('dvLogin').style.display='none';
         Showbo.$('dvChat').style.display='block';
         this.ct=Showbo.$('dvMsg');this.selTo=Showbo.$('selContacts');
         Showbo.Editor.render({id:'editor',height:100});
         //成功登录,设置用户id和键,并且启动读用户列表和信息的计时器,并初始化编辑器
         this.UserId=o.UserId;this.UserKey=o.Key;         
         this.read('read');
         this.timerMsg=setInterval("Showbo.Chat.read('read')",this.timeMsg*1000);
         this.read('readuser');
         this.timerUsers=setInterval("Showbo.Chat.read('readuser')",this.timeUser*1000);
         break;
       case 'logout'
         Showbo.$('dvLogin').style.display='block';
         Showbo.$('dvChat').style.display='none';
         this.ct.innerHTML='';
         this.UserId=this.UserKey=-1;
         clearInterval(this.timerUsers);clearInterval(this.timerMsg);
         this.timerUsers=this.timerMsg=null;this.nowUserId=-1;
         break;
       case 'say':
         var who=this.selTo.value=='-1'?'':this.selTo.options[this.selTo.selectedIndex].text,v=this.bd.innerHTML;
         v=v.replace(/^<p>|<\/p>$/gi,'');
         this.addItemToCT('<span class="from">我</span>'+(who?'对<span class="to">'+who+'</span>':'')+'说:'+v);
         this.bd.innerHTML=Showbo.IsIE?'':' ';
         if(this.ct.scrollHeight>this.ct.offsetHeight)this.ct.scrollTop=this.ct.scrollHeight-this.ct.offsetHeight;
         break;
       case 'readuser':this.initSel(o.data);break;
       case 'read':this.initMsgList(o.data);break;
     }
   }
   else alert(o.err);
  }
  ,Login:function(f){
    if(Showbo.trim(f.nn.value)==''){alert('昵称不能为空!');f.nn.select();return false;}
    else if(f.nn.value.length>20){alert('昵称不能超过20个字符!');f.nn.select();return false;}
    Showbo.$('dvWait').style.display='block';
    f.style.display='none';
    var me=this;
    Showbo.Ajax.send({url:RequstUrl,method:'post',params:'nn='+encodeURIComponent(f.nn.value)+'&op=login',otherParams:'login'
    ,success:function(p1,p2){me.callback(p1,p2);},failure:function(p1){me.callback(p1);}});
    return false;
  }
  ,Logout:function(needConfirm){
    var me=this;
    if(needConfirm&&!confirm('确认退出?!'))return false;
    this.setNote('正在退出,请等待...');
    this.setBtn(true);
    Showbo.Ajax.send({
        url:RequstUrl,method:'post'
        ,params:'op=logout&uid='+this.UserId+'&key='+this.UserKey,otherParams:'logout'
        ,success:function(p1,p2){me.callback(p1,p2);}
        ,failure:function(p1){me.callback(p1);}
      });

  }
  ,read:function(op){
    var me=this;
    Showbo.Ajax.send({
        url:RequstUrl,method:'post',params:'op='+op+'&uid='+this.UserId+(op=='readuser'?'':'&key='+this.UserKey),otherParams:op
        ,success:function(p1,p2){me.callback(p1,p2);},failure:function(p1){me.callback(p1);}
    });
  }
  ,initSel:function(arr){
    if(this.UserId==-1)return false;
    this.selTo.options.length=1;
    var i=0,selIndex=0,len=arr.length;
    for(;i<len;i++){
      this.selTo.options.add(new Option(arr[i].nn,arr[i].id));
      if(arr[i].id==this.nowUserId)selIndex=i+1;
    }
    this.selTo.selectedIndex=selIndex;
  }
  ,initMsgList:function(arr){
    if(this.UserId==-1)return false;
    if(arr.length==0)return false;
    for(var i=0;i<arr.length;i++)this.addItemToCT(arr[i]);
    if(this.hint)window.focus();
    if(this.ct.scrollHeight>this.ct.offsetHeight)this.ct.scrollTop=this.ct.scrollHeight-this.ct.offsetHeight;
  }
  ,send:function(){//发送信息
     var v=this.bd.innerHTML.replace(/<\/?p>/gi,'');
     if(Showbo.trim(Showbo.trim(v),/<br\s*\/?>| /gi,'')==''){
       alert('发送的信息不能为空!');
       this.bd.innerHTML=Showbo.IsIE?'':' ';
       Showbo.$('HtmlEditor',true).focus();
       return false;
     }
     v=Showbo.trim(v,/^(<br\s*\/?>)*|(<br\s*\/?>)*$/gi);
     this.setNote('正在发送信息,请等待...');
     this.setBtn(true);
     var me=this;
     Showbo.Ajax.send({url:RequstUrl,method:'post'
        ,params:'op=say&from='+this.UserId+'&key='+this.UserKey+'&to='+this.selTo.value+'&ct='+encodeURIComponent(v),otherParams:'say'
        ,success:function(p1,p2){me.callback(p1,p2);},failure:function(p1){me.callback(p1);}
     });
  }
};

window.onload=function(){Showbo.$('frmLogin').nn.focus();}
window.onbeforeunload=function(e){e=e||event;if(Showbo.Chat.UserId!=-1)e.returnValue='确认退出聊天室?!';}
window.onunload=function(){if(Showbo.Chat.UserId!=-1)Showbo.Chat.Logout(false);}//如果登录了系统,离开当前页面时将注销



op.ashx
+展开
-C#
<%@ WebHandler Language="C#" Class="op" %>

using System;
using System.Web;

public class op : IHttpHandler {
    
    public void ProcessRequest (HttpContext context) {
        context.Response.Charset = "gb2312";
        context.Response.ContentType = "text/html";
        HttpRequest Request = context.Request;
        string Json = "{";
        switch (Request.Form["op"])
        {
            case "login": Json += Ajax.Login(); break;
            case "logout": Json += Ajax.Logout(); break;
            case "readuser": Json += Ajax.ReadUser(); break;
            case "read":Json+=Ajax.Read(); break;
            case "say": Json += Ajax.Say(); break;
            
            default: Json += "success:false,err:'参数错误!'"break;
        }
        Json += "}";
        context.Response.Write(Json);
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}



类别:JavaScript/Ajax 作者:波波 日期:2009-09-07 【评论:12 阅读:】 
 

  • 日期:2009-9-7 17:13:36  IP:116.30.*.*
    學習了
    管理员回复(2009-9-7 17:27:17)
    一起努力!~


  • 日期:2009-9-8 9:27:46  IP:124.193.*.*
    非常棒 不错 很好 学习了很多技巧 收藏
    管理员回复(2009-9-8 9:44:35)
    O(∩_∩)O~


  • 日期:2009-9-8 15:07:30  IP:218.107.*.*
    真的不错,你只是蛮全面的.ASP,PHP.NET .哈.
    管理员回复(2009-9-8 15:50:52)
    我主要是学asp和asp.net的,php只是在有时间的时候看看,技多不压人吗~~呵呵


  • 日期:2009-9-9 11:19:49  IP:221.224.*.*
    测试下
    管理员回复(2009-9-9 21:20:10)
    O(∩_∩)O~


  • 日期:2009-9-23 21:18:34  IP:60.163.*.*
    收了,慢慢研究:)
    管理员回复(2009-9-24 21:15:49)
    呵呵~


  • 日期:2009-11-12 21:12:42  IP:125.70.*.*
    我还是看一下
    管理员回复(2009-11-13 8:41:49)
    hoho~~


  • 日期:2010-3-30 16:26:12  IP:221.224.*.*
    不会用啊
    管理员回复(2010-3-31 8:42:33)
    都是很基本的js写的,只是打包了而已。O(∩_∩)O~


  • 日期:2010-4-12 12:48:10  IP:61.142.*.*
    看下来有点乱乱的,我是新手,很难看懂呀。
    管理员回复(2010-4-12 16:38:06)
    有些功能写成面向对象的形式了,对初学者来说看起来可能有点吃力~~


  • 日期:2010-4-21 1:28:03  IP:119.130.*.*
    为什么,我登录时说“动态页发生严重错误,......” 的?该怎么改你的程序?请教下
    管理员回复(2010-4-21 9:08:38)
    具体错误是什么啊,不要用...代替啊。

    根据你的这个描述,应该是请求的页面的路径未设置对,如果路径设置对了,由于使用了try...catch语句,应该会显示具体的错误信息的。


    出现这个错误,也可能有以下的可能
    1.ajax请求的动态页面路径未设置对,请参考js里面的说面,修改
    +展开
    -JavaScript
    var RequstUrl="op.asp";//===============为不同的编程语言时修改这个变量的值

    注意路径的问题

    2.确认使用的编程语言。js代码块,就是上面的贴出来的请求的是asp的。
    1)如果你服务器是iis6,需要在“服务器扩展”中启用“Active Server Pages",默认是不启用的。
    2)如果是C#,确认安装了.net framework2.0版本,并且网站的属性选项卡中的asp.net选项设置成了2.0版本的。

    3.其他的原因,动态页出现错误。这个就得需要你贴出具体错误信息了。要不不知道如何分析。因为使用了try..catch语句,所以如果执行sql语句出错的话会有具体的错误信息显示出来


  • 日期:2010-4-21 14:06:43  IP:121.8.*.*
    应该就是第三点原因。。。

    错误图片可以看地址:http://b32.photo.store.qq.com/http_imgload.cgi?/rurl4_b=2b61906bf852e271fb5e4ab5567bd1a82f93611e0c04c5cd89a635405166fb3857b664e72e0d0884944d6e20c574cdef1d76d2b7a94cecb0844c6a44297c2f852ee769bbe73fff197d13b6df8d324b05c42669d4&a=31&b=32

    已经修改了:
    var RequstUrl="op.asp";//================================为不同的编程语言时修改这个变量的值

    但是还不可以....

    还有个问题,有没有见过新浪体育的那个web聊天程序吗?知道怎么实现做的吗? 看下:
    http://b35.photo.store.qq.com/http_imgload.cgi?/rurl4_b=2b61906bf852e271fb5e4ab5567bd1a8d36aa8e38b9a37f46bd51679da203c3fe83dd81b03255d63cc7b710c6c4dcb8a34a8330e56b84e5dfe3257f324b531a0d4c55e5e4a482a05d17183e81448e766c12b5578&a=38&b=35
    很强的一个聊天程序

    管理员回复(2010-4-21 15:43:30)
    你是通过IIS访问的吗?怎么显示出源代码来了?⊙﹏⊙b汗

    同时检查下web.config文件中的编码是否配置为gb2312了,默认的是utf-8的编码,但是实际使用的gb2312编码,统一编码防止出现乱码的问题。
    +展开
    -XML
    <globalization requestEncoding="gb2312responseEncoding="gb2312"/>



    新浪那个功能比较多,实现起来比较麻烦。

    现在正在研究flex,看研究有点进展了做一个于flash的soket的聊天室,这样就不需要客户端间隔一定时间后发送请求了。


  • 日期:2010-6-7 8:50:19  IP:122.74.*.*
    您的编辑器是用的UBB吗?
    管理员回复(2010-6-7 8:52:59)
    是的~~UBB比较好控制脚本攻击~O(∩_∩)O~


  • 日期:2010-7-3 15:25:31  IP:211.140.*.*
    动态页严重错误,请联系管理员 怎么回事 VS2008&IE
    管理员回复(2010-7-3 15:54:50)
    动态页面我都是用了try...catch语句,所以如果配置不对会输出原因。而出现你说的错误,应该是你请求的页面路径没有设置对,出现了404,找不到页面的错误。

    +展开
    -JavaScript
    var RequstUrl="op.asp";//这个变量你修改过了没有??默认的是asp,如果你的是aspx,你要修改这个变量,并且注意路径



    如果不行加下面这句调试下
    +展开
    -JavaScript
    alert(xhr.status+'\n'+xhr.resonseText)//加上这句看状态和返回什么信息调试下
    var o=xhr.status==200?Showbo.getJson(xhr.responseText):{success:false,err:'动态页发生严重错误,请联系管理员!'+xhr.responseText};



    以后可以留下email地址,方便管理员发email通知。O(∩_∩)O~

发表留言
  • *昵称:
  • 头像:
  • 电子邮件: [留下您的邮件,方便管理员回复您。]
  • 个人网站: *验证码:
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载或引用的作品侵犯了您的权利,请通知我们,我们会及时删除!
Powered by showbo,G51人力资讯网桂ICP备05005887号