分类目录归档:HTM

怎样将用户名和密码保存到Cookie中[转]

    在网站中,我们经常看到每当我们准备登陆时,网页询问我们是否保存用户名和密码,以便下次登陆时不用再次输入。诸如此类的功能如何实现哪?经过两天的研究,终于有了收获!现将我的经验与大家分享。
    在网页中记录用户的信息通常有如下几种方式:Session、Cookie、以及.Net环境下的ViewState等。比较起来,Session将用户的信息暂存在内存中,除非用户关闭网页,否则信息将一直有效。所以,用Session保存的信息很容易丢失。Cookie用来将用户的信息保存到用户机的文件中,这样信息就可以长久的保存。前两种都是传统的保存方式,而ViewState是在微软.Net环境下新推出的一种对象,它其实是一种特殊的Session,不过一般将信息保存在客户端。关于ViewState的用法大家可以参考一些资料,我在《谨慎Asp.net中static变量的用法》一文中也有叙述。
    下面我将以用户名和密码为例介绍如何通过Cookie保存用户的信息。
    因为Cookie是通过计算机上的文件来记录有关信息,所以涉及到对Cookie的操作无外乎读取、赋值和删除。另外,由于Cookie提供了一项有效期的功能,所以还可以对Cookie设置有效期。下面将在DHTML和VS.Net两种环境下分别介绍如何实现Cookie的各种操作。
    一、DHTML环境
    这种环境下我们使用的是传统的JavaScript脚本,通过对页面中各种对象的属性和事件进行操作来完成我们的预期任务。
    1、读取Cookie值
    Cookie值是按照索引存储的,也就是说不同的索引有不同的Cookie值。所以我们就可以将我们想要存储的对象(在这里为用户名)作为索引,读取该存储对象的Cookie值。方法如下:

    function GetCookie (name)
    {
       var arg = name + “=”;
       var alen = arg.length;
       var clen = window.document.cookie.length;
       var i = 0;
       while (i < clen)
       {
            var j = i + alen;
            if (window.document.cookie.substring(i, j) == arg) return getCookieVal (j);
                i = window.document.cookie.indexOf(” “, i) + 1;
            if (i == 0)
                break;
        }
        return null;
    }

 

 function getCookieVal (offset)
    {
        var endstr = window.document.cookie.indexOf (“;”, offset);
        if (endstr == -1)
            endstr = window.document.cookie.length;
        return unescape(window.document.cookie.substring(offset, endstr));
    }

    为什么读取Cookie值还要两个函数来完成?这是因为Cookie值是按照“Cookie名;”+“Cookie值;”+“有效期;”+“路径”的格式来存储的。这将在下文中提到。这样初次读到的Cookie是一连串的以分号分隔的字符串。我们还需要对其进行进一步处理才能提取出我们想要的信息。在上面两个函数中,第一个函数GetCookie用来按索引获取我们想要读取的Cookie的位置,第二个函数getCookieVal用来提取Cookie中我们想要的信息。所以使用时直接调用GetCookie(name)就可以了,其中name是Cookie的索引,也就是名称,或者直接点说就是我们要存储其值的东西。
    2、设置Cookie值
    正如上面所说,Cookie的存取方式有点类似于哈希表,是以名称作为索引存取的。一个Cookie的格式如下:
 Cookie名称(作为Cookie的索引便于以后的各种操作)+“=”+Cookie值+“;expires=+有效期+“;path=”+路径+“;domain=”+域+“;secure=”+安全级别
    可以看出每个Cookie实际有6个属性,这些属性恰好构成了一条记录。多条Cookie记录在硬盘中是以集合的方式存取的。也就是说所有Cookie记录构成了类似于一张表的结构。而Cookie又可以有多个集,那时不是就可以理解成一个库哪?这里不去讲解怎么样以表或库的方式读写Cookie记录集,只是讲解基本的Cookie操作。并且我还没有发现真正有把Cookie集合当成表一样的专门操作方法。毕竟,以表的方式理解Cookie集合只是我的一家之言,仅供大家理解上的方便。
    正因为每个Cookie实际上是有多个属性组成的,所以设置Cookie时理所当然地应该设置多个属性值,虽然不是每一个属性都必须填写,但大家至少应该把Cookie名称和Cookie值填上,否则这个Cookie就没有任何意义了。设置一个Cookie值的方法如下:

    function SetCookie (name, value)
    {
        var exp = new Date();
        exp.setTime(exp.getTime() + (30*24*60*60*1000));
        window.document.cookie = name + “=” + escape (value) + “; expires=” + exp.toGMTString()+”;path=/”;
    }

    其中,name为Cookie的名称,value为Cookie的值。如果还想指定Cookie的有效期,再传入一个时间参数就可以了,不过要注意这里的时间是以毫秒计算的,所以如果要设置日月年等长时间时要进行计算。需要注意的是如果Cookie的名称和值中含有汉字的话,最好事先对其进行编码,否则可能显示结果不会很理想。
  3、删除Cookie
    这么叫也许并不恰当,因为以下的介绍名没有真正的删除Cookie。我们就勉强这么叫吧。上面说每一个Cookie都有一个有效期,过了这个有效期该Cookie就会失效,获取到的Cookie值将为空(null),使用该Cookie的值将会出错。所以如果要删除某个Cookie的话,只要让其过期就可以了。所以删除Cookie的操作就是让其过期的操作:

    function DeleteCookie (name)
    {
        var exp = new Date();
        exp.setTime (exp.getTime() – 1);
        var cval = GetCookie (name);
         window.document.cookie = name + “=” + cval + “; expires=” + exp.toGMTString()+”;path=/”;
    }

    有上述代码也可以看出,删除操作其实就是让某个Cookie的有效期设置为当前时间减去1毫秒,当然会过期了!
    那么如何将上述代码应用到DHTML的开发过程中哪?下面就以记录用户名和密码到Cookie中为例进行讲解。
    为了简单起见,我们只在页面中放置一个用户名文本域、一个密码域、一个按钮和一个复选框。页面的布局代码如下:

    <html>
    <head>
    <title>记录用户名和密码到Cookie中</title>
    </head>
    <body>
    请输入用户名:<input type=”text”><br>
    请输入密码:<input type=”password”>&nbsp;&nbsp;&nbsp;&nbsp;<input type=”checkbox”>记住用户名和密码<br>
    <input value=”记录” type=”button”>&nbsp;&nbsp;&nbsp;&nbsp;<input value=”删除” type=”button”>
    </body>
    </html>

    下面就开始完成功能代码的编写。本来用户单击“确定”按钮后要对用户名和密码进行验证,并且进入相关页面,我们在这里换成记录用户名和密码的功能。
    将上述三个Cookie的函数粘贴到html代码的<head>和</head>之间(不要放在<title>和</title>之间),然后在<input value=”记录” type=”button”>中添加一个单击事件处理程序:<input value=”记录” type=”button” >。在<head>和</head>之间实现remember()函数:

function remember()
    {
       if(document.all.remem.checked)
       SetCookie(document.all.username.value,document.all.password.value);
    }

    这样就可以在用户单击了“记录”按钮后将用户名和对应的密码记录到Cookie中。
    那么如何在用户输入用户名后自动填入对应的密码哪?这就要在<input type=”text”>中添加一个事件处理函数:<input type=”text” >。然后把showpassword()的定义同样放到<head>和</head>之间:
  

  function showpassword()
    {
        return GetCookie(document.all.username.value);
    }

    以上就完成了对特定用户密码的记录。下面我们完成密码的删除部分。在<input value=”删除” type=”button”>中添加一个事件处理函数:<input value=”删除” type=”button” >。然后在<head>和</head>之间实现DelCookie()函数:

    function DelCookie()
    {
        DeleteCookie(document.all.username.value);
    }

    现在大家可以试验一下,看看预期的功能可否实现。如果大家试验过后就会发现,当我们删除掉某个用户的密码后,每次焦点从username中移出时,password中总是显示四个掩码,而不是空,这是为什么哪?如果大家用alert()语句把文本框中的内容输出的话,就会发现那四个掩码其实是“null”这个单词。这就表明其实已经删除了,但我们显示密码时没有排除这种情况。所以在showpassword()函数中应进行判断,非空后再把结果赋给password域:

    function showpassword()
    {
         var p=GetCookie(document.all.username.value);
         if(p!=null)
             document.all.password.value= p;
    }

    好了,大功告成。完整的代码如下所示:

    <!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
    <html>
    <head>
    <title>演示例子</title>
    <script>
    function GetCookie (name)
    {
        var arg = name + “=”;
        var alen = arg.length;
        var clen = window.document.cookie.length;
        var i = 0;
        while (i < clen)
        {
            var j = i + alen;
            if (window.document.cookie.substring(i, j) == arg) return getCookieVal (j);
            i = window.document.cookie.indexOf(” “, i) + 1;
            if (i == 0)
                break;
        }
        return null;
    }
    function getCookieVal (offset)
    {
        var endstr = window.document.cookie.indexOf (“;”, offset);
        if (endstr == -1)
            endstr = window.document.cookie.length;
        return unescape(window.document.cookie.substring(offset, endstr));
    }
    function SetCookie (name, value)
    {
        var exp = new Date();
        exp.setTime(exp.getTime() + (30*24*60*60*1000));
        window.document.cookie = name + “=” + escape (value) + “; expires=” + exp.toGMTString()+”;path=/”;
    }
    function DeleteCookie (name)
    {
        var exp = new Date();
        exp.setTime (exp.getTime() – 100);
        var cval = GetCookie (name);
        window.document.cookie = name + “=” + cval + “; expires=” + exp.toGMTString()+”;path=/”;
    }

    function DelCookie()
    {
        DeleteCookie(document.all.username.value);
    }
    function remember()
    {
        if(document.all.remember.checked)
            SetCookie(document.all.username.value,document.all.password.value);
    }
    function showpassword()
    {
         var p=GetCookie(document.all.username.value);
         if(p!=null)
             document.all.password.value= p;
    }
    </script>
    </head>
    <body>
    请输入用户名:<input type=”text” ><br>
    请输入密码:<input type=”password”>&nbsp;&nbsp;&nbsp;&nbsp;<input type=”checkbox”>记住密码  

<br>
    <input value=”记录” type=”button” >&nbsp;&nbsp;&nbsp;&nbsp;<input value=”删除” type=”button”    

onClick=”DelCookie()”>
    </body>
    </html>

    二、.Net环境
    .Net以其强大的功能而著称。所以在.Net中提供了许多针对Cookie的类,可以很方便地完成对Cookie的各类操作。在.Net中有一个类HttpCookie,这个类中保存了Cookie的全部信息,包括Cookie名称、Cookie值、有效期等。我们在使用时先新建一个HttpCookie的对象,然后用Response.Cookies下的方法来操作这个对象就可以了。
    声明一个HttpCookie对象的方法为:

HttpCookie cookiename = new HttpCookie(Cookie的名称, Cookie的值);

其中,cookiename是对象名。然后,我们就可以为cookiename的各个属性赋值。
    当向系统中添加该Cookie时只要用

Response.AppendCookie(cookiename);

就可以了,或者用

Response.Cookies.Add(cookiename);

读取Cookie时用

Response.Cookies.Get(Cookie名称);

删除Cookie时用

Response.Cookies.Remove(Cookie名称);

但我试了一下,删不掉。所以还是用以前的思路,把该Cookie的有效期设置为过时就可以了,方法如下:
 

    HttpCookie ckUserInfo = Request.Cookies[txtUserName.Text.Trim()];
    ckUserInfo.Expires = DateTime.Today.AddDays(-1);
    Response.Cookies.Set(ckUserInfo);

    以上操作就可以完成Cookie的基本操作。因为我还想实现当用户输完用户名后把焦点从用户名框转移到密码框时自动在密码框中输出该用户对应的密码,所以还得增加一个javascript处理函数showpassword()。这个函数完全和上面DHTML中的showpassword()一样。所以,在.Net中完全可以使用以前DHTML中的方法。我们只要在页面导入时为用户名框添加一个onblur属性即可。Login.aspx的代码如下:

    <%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”login.aspx.cs” Inherits=”login” %>

    <!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 runat=”server”>
        <title>无标题页</title>
    </head>
    <script>
        function GetCookie (name)
        {
     var arg = name + “=”;
     var alen = arg.length;
     var clen = window.document.cookie.length;
     var i = 0;
     while (i < clen)
     {
          var j = i + alen;
          if (window.document.cookie.substring(i, j) == arg) return getCookieVal (j);
          i = window.document.cookie.indexOf(” “, i) + 1;
          if (i == 0)
               break;
     }
     return null;
        }
        function getCookieVal (offset)
        {
             var endstr = window.document.cookie.indexOf (“;”, offset);
             if (endstr == -1)
                  endstr = window.document.cookie.length;
             return unescape(window.document.cookie.substring(offset, endstr));
        }
        function showpassword()
        {
             var p=GetCookie(document.all.txtUserName.value);
             if(p!=null)
                 document.all.txtPassword.value= p;
        }
    </script>
    <body>
        <form runat=”server”>
        <div>
            请输入用户名:<asp:TextBox runat=”server”></asp:TextBox><br />
            请输入密码: &nbsp; &nbsp;<asp:TextBox runat=”server” TextMode=”Password”
                Width=”149px”></asp:TextBox>&nbsp;<asp:CheckBox runat=”server” Text=”记住用户名和密码” /><br />
            &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;<asp:Button runat=”server”
                Text=”记录” />
            <asp:Button runat=”server” Text=”删除” />
   
        </div>
        </form>
    </body>
    </html>

    Login.aspx.cs的代码如下:

    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

      {
        protected void Page_Load(object sender, EventArgs e)
        {
            txtUserName.Attributes.Add(“onblur”, “showpassword()”);
        }

        protected void  btnRem_Click(object sender, EventArgs e)
        {
            if (chkRem.Checked)
            {
                HttpCookie ckUserInfo = new HttpCookie(txtUserName.Text.Trim(), txtPassword.Text);
                ckUserInfo.Expires = DateTime.Now.AddYears(1);
                Response.AppendCookie(ckUserInfo);
            }
        }
        protected void btnDel_Click(object sender, EventArgs e)
        {
            HttpCookie ckUserInfo = Request.Cookies[txtUserName.Text.Trim()];
            ckUserInfo.Expires = DateTime.Today.AddDays(-1);
            Response.Cookies.Set(ckUserInfo);
        }
    }

    好了,大功全部告成。如果大家还想进行更高级的操作的话,可以用这些基本功能进行开发,思路都是一样的。有什么更好的思路可以提出来,我们共同交流。

 

HTML 4.0 事件属性

      HTML 4 的新特性之一是可以使 HTML 事件触发浏览器中的行为,比方说当用户点击某个 HTML 元素时启动一段 JavaScript。

      在现代浏览器中都内置有大量的事件处理器。这些处理器会监视特定的条件或用户行为,例如鼠标单击或浏览器窗口中完成加载某个图像。通过使用客户端的 JavaScript,可以将某些特定的事件处理器作为属性添加给特定的标签,并可以在事件发生时执行一个或多个 JavaScript 命令或函数。

      事件处理器的值是一个或一系列以分号隔开的 Javascript 表达式、方法和函数调用,并用引号引起来。当事件发生时,浏览器会执行这些代码。例如,当您把鼠标移动到一个超链接时,会启动一个 JavaScript 函数。支持 JavaScript 的浏览器支持 <a> 标签中的一个特殊的 “mouse over”事件处理器 – 被称为 onmouseover 来完成这项工作:

<a href=”#” onmouseover=”alert(‘Welcome’);return false”></a>

移动这里 –弹出属性测试

窗口事件 (Window Events)
仅在 body 和 frameset 元素中有效。

属性                   值                       描述
onload              脚本                    当文档载入时执行脚本
onunload          脚本                    当文档卸载时执行脚本

表单元素事件 (Form Element Events)
仅在表单元素中有效。

属性                   值                            描述
onchange           脚本                       当元素改变时执行脚本
onsubmit             脚本                       当表单被提交时执行脚本
onreset               脚本                       当表单被重置时执行脚本
onselect              脚本                       当元素被选取时执行脚本
onblur                 脚本                       当元素失去焦点时执行脚本
onfocus               脚本                       当元素获得焦点时执行脚本

图像事件 (Image Events)
该属性可用于 img 元素:

属性                   值                          描述
onabort             脚本                         当图像加载中断时执行脚本

键盘事件 (Keyboard Events)
在下列元素中无效:base, bdo, br, frame, frameset, head, html, iframe, meta, param, script, style, 以及 title 元素。

属性                       值                      描述
onkeydown             脚本                 当键盘被按下时执行脚本
onkeypress             脚本                当键盘被按下后又松开时执行脚本
onkeyup                 脚本                  当键盘被松开时执行脚本

鼠标事件 (Mouse Events)
在下列元素中无效:base, bdo, br, frame, frameset, head, html, iframe, meta, param, script, style, title 元素。

属性                           值                          描述
onclick                       脚本                       当鼠标被单击时执行脚本
ondblclick                  脚本                        当鼠标被双击时执行脚本
onmousedown           脚本                        当鼠标按钮被按下时执行脚本
onmousemove           脚本                      当鼠标指针移动时执行脚本
onmouseout              脚本                        当鼠标指针移出某元素时执行脚本
onmouseover            脚本                        当鼠标指针悬停于某元素之上时执行脚本
onmouseup               脚本                        当鼠标按钮被松开时执行脚本
 

 

 

 

JS 的基本知识整理

1.document.write(“”); 输出语句  
2.JS中的注释为//  
3.传统的HTML文档顺序是:document->html->(head,body)  
4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document)  
5.得到表单中元素的名称和值:document.getElementById(“表单中元素的ID号”).name(或value)  
6.一个小写转大写的JS: document.getElementById(“output”).value = document.getElementById(“input”).value.toUpperCase();  
7.JS中的值类型:String,Number,Boolean,Null,Object,Function  
8.JS中的字符型转换成数值型:parseInt(),parseFloat()  
9.JS中的数字转换成字符型:(“”+变量)  
10.JS中的取字符串长度是:(length)  
11.JS中的字符与字符相连接使用+号.  
12.JS中的比较操作符有:==等于,!=不等于,>,>=,<.<=  
13.JS中声明变量使用:var来进行声明  
14.JS中的判断语句结构:if(condition){}else{}  
15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop}  
16.循环中止的命令是:break 
17.JS中的函数定义:function functionName([parameter],…){statement[s]}  
18.当文件中出现多个form表单时.可以用document.forms[0],document.forms[1]来代替.  
19.窗口:打开窗口window.open(), 关闭一个窗口:window.close(), 窗口本身:self  
20.状态栏的设置:window.status=”字符”;  
21.弹出提示信息:window.alert(“字符”);  
22.弹出确认框:window.confirm();  
23.弹出输入提示框:window.prompt();  
24.指定当前显示链接的位置:window.location.href=”URL” 
25.取出窗体中的所有表单的数量:document.forms.length  
26.关闭文档的输出流:document.close();  
27.字符串追加连接符:+=  
28.创建一个文档元素:document.createElement(),document.createTextNode()  
29.得到元素的方法:document.getElementById()  
30.设置表单中所有文本型的成员的值为空:  
var form = window.document.forms[0]  
for (var i = 0; i<form.elements.length;i++){  
      if (form.elements[i].type == “text”){  
          form.elements[i].value = “”;  
      }  
}  
31.复选按钮在JS中判断是否选中:document.forms[0].checkThis.checked (checked属性代表为是否选中返回TRUE或FALSE)  
32.单选按钮组(单选按钮的名称必须相同):取单选按钮组的长度document.forms[0].groupName.length  
33.单选按钮组判断是否被选中也是用checked.  
34.下拉列表框的值:document.forms[0].selectName.options[n].value (n有时用下拉列表框名称加上.selectedIndex来确定被选中的值)  
35.字符串的定义:var myString = new String(“This is lightsword”);  
36.字符串转成大写:string.toUpperCase(); 字符串转成小写:string.toLowerCase();  
37.返回字符串2在字符串1中出现的位置:String1.indexOf(“String2”)!=-1则说明没找到.  
38.取字符串中指定位置的一个字符:StringA.charAt(9);  
39.取出字符串中指定起点和终点的子字符串:stringA.substring(2,6);  
40.数学函数:Math.PI(返回圆周率),Math.SQRT2(返回开方),Math.max(value1,value2)返回两个数中的最在 值,Math.pow(value1,10)返回value1的十次方,Math.round(value1)四舍五入函数,Math.floor (Math.random()*(n+1))返回随机数  
41.定义日期型变量:var today = new Date();  
42.日期函数列表:dateObj.getTime()得到时间,dateObj.getYear()得到年份, dateObj.getFullYear()得到四位的年份,dateObj.getMonth()得到月份,dateObj.getDate()得到 日,dateObj.getDay()得到日期几,dateObj.getHours()得到小时,dateObj.getMinutes()得到分, dateObj.getSeconds()得到秒,dateObj.setTime(value)设置时间,dateObj.setYear(val)设 置年,dateObj.setMonth(val)设置月,dateObj.setDate(val)设置日,dateObj.setDay(val)设 置星期几,dateObj.setHours设置小时,dateObj.setMinutes(val)设置分,dateObj.setSeconds (val)设置秒   [注意:此日期时间从0开始计]  
43.FRAME的表示方式: [window.]frames[n].ObjFuncVarName,frames[“frameName”].ObjFuncVarName,frameName.ObjFuncVarName  
44.parent代表父亲对象,top代表最顶端对象  
45.打开子窗口的父窗口为:opener  
46.表示当前所属的位置:this 
47.当在超链接中调用JS函数时用:(javascript:)来开头后面加函数名  
48.在老的浏览器中不执行此JS:<!–       //–>  
49.引用一个文件式的JS:<script type=”text/javascript” src=”aaa.js”></script>  
50.指定在不支持脚本的浏览器显示的HTML:<noscript></noscript>  
51.当超链和ONCLICK事件都有时,则老版本的浏览器转向a.html,否则转向b.html.例:<a href= “a.html” onclick=”location.href=’b.html’;return false”>dfsadf</a>  
52.JS的内建对象有:Array,Boolean,Date,Error,EvalError,Function,Math,Number, Object,RangeError,ReferenceError,RegExp,String,SyntaxError,TypeError,URIError  
53.JS中的换行:\n  
54.窗口全屏大小:<script>function fullScreen(){ this.moveTo(0,0); this.outerWidth=screen.availWidth;this.outerHeight=screen.availHeight;}window.maximize=fullScreen;</script>  
55.JS中的all代表其下层的全部元素   
 
56.JS中的焦点顺序:document.getElementByid(“表单元素”).tabIndex = 1 
57.innerHTML的值是表单元素的值:如<p id=”para”>”how are <em>you< /em>”</p>,则innerHTML的值就是:how are <em>you</em>  
58.innerTEXT的值和上面的一样,只不过不会把<em>这种标记显示出来.  
59.contentEditable可设置元素是否可被修改,isContentEditable返回是否可修改的状态.  
60.isDisabled判断是否为禁止状态.disabled设置禁止状态  
61.length取得长度,返回整型数值  
62.addBehavior()是一种JS调用的外部函数文件其扩展名为.htc  
63.window.focus()使当前的窗口在所有窗口之前.  
64.blur()指失去焦点.与FOCUS()相反.  
65.select()指元素为选中状态.  
66.防止用户对文本框中输入文本:onfocus=”this.blur()” 
67.取出该元素在页面中出现的数量:document.all.tags(“div(或其它HTML标记符)”).length  
68.JS中分为两种窗体输出:模态和非模态.window.showModaldialog(),window.showModeless()  
69.状态栏文字的设置:window.status=’文字’,默认的状态栏文字设置:window.defaultStatus = ‘文字.’;  
70.添加到收藏夹:external.AddFavorite(“http://www.k686.com”,”jaskdlf”);  
71.JS中遇到脚本错误时不做任何操作:window.onerror = doNothing; 指定错误句柄的语法为:window.onerror = handleError;  
72.JS中指定当前打开窗口的父窗口:window.opener,支持opener.opener…的多重继续.  
73.JS中的self指的是当前的窗口  
74.JS中状态栏显示内容:window.status=”内容” 
75.JS中的top指的是框架集中最顶层的框架  
76.JS中关闭当前的窗口:window.close();  
77.JS中提出是否确认的框:if(confirm(“Are you sure?”)){alert(“ok”);}else{alert(“Not Ok”);}  
78.JS中的窗口重定向:window.navigate(“http://www.k686.com”);  
79.JS中的打印:window.print()  
80.JS中的提示输入框:window.prompt(“message”,”defaultReply”);  
81.JS中的窗口滚动条:window.scroll(x,y)  
82.JS中的窗口滚动到位置:window.scrollby  
83.JS中设置时间间隔:setInterval(“expr”,msecDelay)或setInterval(funcRef,msecDelay)或setTimeout  
84.JS中的模态显示在IE4+行,在NN中不行:showModalDialog(“URL”[,arguments][,features]);  
85.JS中的退出之前使用的句柄:function verifyClose(){event.returnValue= “we really like you and hope you will stay longer.”;}}   window.onbeforeunload=verifyClose;  
86.当窗体第一次调用时使用的文件句柄:onload()  
87.当窗体关闭时调用的文件句柄:onunload()  
88.window.location的属性: protocol(http:),hostname(www.k686.com),port(80),host(www.k686.com:80),pathname(“/a/a.html”),hash(“#giantGizmo”,指跳转到相应的锚记),href(全部的信息)  
89.window.location.reload()刷新当前页面.  
89-1.parent.location.reload()刷新父亲对象(用于框架)  
89-2.opener.location.reload()刷新父窗口对象(用于单开窗口)  
89-3.top.location.reload()刷新最顶端对象(用于多开窗口)  
90.window.history.back()返回上一页,window.history.forward()返回下一页,window.history.go(返回第几页,也可以使用访问过的URL)  
91.document.write()不换行的输出,document.writeln()换行输出  
92.document.body.noWrap=true;防止链接文字折行.  
93.变量名.charAt(第几位),取该变量的第几位的字符.  
94.”abc”.charCodeAt(第几个),返回第几个字符的ASCii码值.  
95.字符串连接:string.concat(string2),或用+=进行连接  
96.变量.indexOf(“字符”,起始位置),返回第一个出现的位置(从0开始计算)  
97.string.lastIndexOf(searchString[,startIndex])最后一次出现的位置.  
98.string.match(regExpression),判断字符是否匹配.  
99.string.replace(regExpression,replaceString)替换现有字符串.  
100.string.split(分隔符)返回一个数组存储值.  
101.string.substr(start[,length])取从第几位到指定长度的字符串.  
102.string.toLowerCase()使字符串全部变为小写.  
103.string.toUpperCase()使全部字符变为大写.  
104.parseInt(string[,radix(代表进制)])强制转换成整型.  
105.parseFloat(string[,radix])强制转换成浮点型.  
106.isNaN(变量):测试是否为数值型.  
107.定义常量的关键字:const,定义变量的关键字:var  
108.isNaN()是JavaScript 的内部函数,对参数进行运算,判断其是否为非数字。若参数为NaN  
(注释:非数值值),则返回true;否者返回false;parseInt 也是一个JavaScript 的内部函数,分析一个  
字符串,并返回给定基数或底数的一个整数(若没有给定基数,则假定基数为10)。

JS面向对象

<html>  
<head>  
      
</head>  
<body>  
    <button onclick=”person1.introduce()”>person1</button>  
    <button onclick=”person2.introduce()”>person2</button>  
    <button onclick=”person3.introduce()”>person3</button>  
    <button onclick=”person4.introduce()”>person4</button>  
    <button onclick=”checkFunc()”>checkFunc</button>  
    <button onclick=”checkFuncByProto()”>checkFuncByProto</button><br/>  
    <button onclick=”testCnstrct()”>testCnstrct</button>  
    <button onclick=”testCnstrctpttp()”>testCnstrctpttp</button>  
    <button onclick=”testDbproto()”>testDbproto</button>  
    <button onclick=”JSONFontI()”>JSONFontI</button>  
    <button onclick=”JSONFontII()”>JSONFontII</button><br/>  
    <button onclick=”testFactory()”>testFactory</button>  
    <button onclick=”testAbstractFactory()”>testAbstractFactory</button>  
      
    <script>  
        var name = “1111111111” 
          
          
          
        /********************************************/ 
        /* 第一种构建对象的办法*/ 
        /* ***推断***,{}即为对象.*/ 
        /********************************************/ 
        var person1 = {};  
        person1.name = “junzi”;  
        person1.age = 23;  
        person1.introduce = function () {  
            alert(“My name is ” + this.name + “.I’m ” + this.age);  
        };  
          
          
          
        /********************************************/ 
        /* 第二种构建对象的办法,类似JSON格式”:”*/ 
        /********************************************/ 
        var person2 = {  
            name: “junzi”,  
            age: 23,  
            introduce: function () {   
                            alert(“My name is ” + this.name + “.I’m ” + this.age);   
                        }  
        };  
          
          
          
        /********************************************/ 
        /* 第三种构建对象的办法,与Java中有些相似*/ 
        /********************************************/ 
        var Person = function () {  
            this.name = “junzi”;  
            this.age = 23;  
            this.introduce = function () {  
                                alert(“My name is ” + this.name + “.I’m ” + this.age);  
                            };  
        };  
        var person3 = new Person();  
          
          
          
        /********************************************/ 
        /* 第四种构建对象,与第三种类似,只不过参数通过new 构造传入 */ 
        /********************************************/ 
        var Person = function (name, age) {  
            this.name = name;  
            this.age = age;  
            this.introduce = function () {  
                                alert(“My name is ” + this.name + “.I’m ” + this.age);  
                            };  
        };  
        var person4 = new Person(“junzi”,23);  
          
          
          
        /********************************************/ 
        /* 看看实例之间的关系@@ */ 
        /********************************************/ 
        var person5 = new Person(“chaokong”,23);  
        function checkFunc(){  
            alert(person4.introduce==person5.introduce);//结果是false,说明introduce有两个实现分别在4和5中  
            alert(person4.age==person5.age);// 结果是true,说明基本类型的话之比较数值是否相同  
            alert(person4.name==person5.name);// 如果两个名字值不同,则为false,***推测***在javascript中的变量比较的是值是否相同,而方法被视为对象.于是下边…  
        }  
          
          
          
        /********************************************/ 
        /* 通过prototype的方式 */ 
        /********************************************/ 
        var PersonI = function(name,age){  
            this.name = name;  
            this.age = age;  
        }  
        /* 
         * 在JavaScript中,prototype对象是实现面向对象的一个重要机制。 
         * 每个函数就是一个对象(Function),函数对象都有一个子对象,即prototype对象,类是以函数的形式来定义的。 
         * prototype表示该函数的原型,也表示一个类的成员的集合。 
         * 在通过new创建一个类的实例对象的时候,prototype对象的成员都成为实例化对象的成员。 
         * 1、该对象被类所引用,只有函数对象才可引用; 
         * 2、在new实例化后,其成员被实例化,实例对象方可调用。 
         * 同时,函数是一个对象,函数对象若直接声明成员,不用被实例化即可调用。  
         */ 
        PersonI.prototype.introduce = function(){  
                                            alert(“My name is ” + this.name + “.I’m ” + this.age);  
                                        }  
        var person6 = new PersonI(“junzi”,23);  
        var person7 = new PersonI(“chaokong”,23);  
        function checkFuncByProto(){  
            alert(person6.introduce==person7.introduce);//  
            alert(person6.age==person7.age);  
            alert(person6.name==person7.name);  
        }  
          
          
          
        /********************************************/ 
        /* 研究研究prototype*/ 
        /********************************************/ 
        /* 
         * JavaScript中创建一个对象分以下几步: 
         * <1> var p={}; 也就是说,初始化一个对象p。 
         * <2> p.__proto__=Person.prototype; 
         * <3> Person.call(p);也就是说构造p,也可以称之为初始化p。 
         */ 
        var PersonII = function () { };  
        //通过prototype创建一个方法  
        PersonII.prototype.sayHello = function(){  
            alert(“hello”);  
        }  
        var p = new PersonII();  
        function testCnstrct(){  
            alert(p.__proto__ === PersonII.prototype);  
        }  
        /* 
         * 首先var p=new PersonII();可以得出p.__proto__=PersonII.prototype。 
         * 那么当我们调用p.sayHello()时,首先p中没有sayHello这个属性, 
         * 于是,他就需要到他的__proto__中去找,也就是PersonII.prototype, 
         * 而我们在上面定义了PersonII.prototype.sayHello=function(){};  
         * 于是,就找到了这个方法。 
         */ 
        function testCnstrctpttp(){  
            p.sayHello();  
        }  
        /** 继续…原型链 */ 
        PersonII.prototype.age = 23;// 设定PersonII的属性  
        var Programmer = function () { };// 创建一个新对象Programmer,可以得出pp.__proto__ = Programmer.prototype;  
        /* 
         * 设 var tempp = new PersonII(); 
         * ∵ Programmer.prototype = new PersonII(); 
         * ∴ Programmer.prototype = tempp; 
         * 
         * ∵ tempp.__proto__ = PersonII.prototype; 
         * ∴ Programmer.prototype.__proto__ = PersonII.prototype; 
         * 设  var pp = new Programmer(); 
         * ∴ pp.__proto__ = Programmer.prototype。 
         * ∴ pp.__proto__.__proto__ = PersonII.prototype。 
         * 
         *  
         * pp中没有sayHello()这个方法,所以到pp.__proto__中查找. 
         * pp.__proto__(也就是Programmer.prototype,也就是tempp,也就是PersonII(),)也没有sayHello()这个方法,所以到pp.__proto__.__proto__中查找 
         * pp.__proto__.__proto__也就是PersonII().prototype,在这里存在sayHello()这个方法 
         * 
         * age属性是同样的道理,只不过在Programmer.prototype的时候就已经找到age了,所以就不继续往下找了. 
         */ 
         /* 这也就是原型链的实现原理。 
         * 其实prototype只是一个假象,他在实现原型链中只是起到了一个辅助作用, 
         * 他只是在new的时候有着一定的价值,而原型链的本质,其实在于__proto__! 
         */ 
        Programmer.prototype = new PersonII();// ***   
        Programmer.prototype.writeCode = function () {  
            alert(“print ‘fuck the js with my jb'”);  
        };  
        Programmer.prototype.age = 22;  
        var pp = new Programmer();  
        function testDbproto(){  
            pp.sayHello();  
            pp.writeCode();  
            alert(pp.age);  
        }  
          
          
          
        /********************************************/ 
        /* JSON格式详细 */ 
        /********************************************/ 
        /* 1. */ 
        var PersonIII = {  
            create: function (name, age) {  
                this.name = name;  
                this.age = age;  
            },  
            introduce: function () {  
                alert(“Hello,My name is ” + this.name + “.I am ” + this.age);  
            }  
        }  
      
        function JSONFontI(){  
            /*  
             * 这样是不行的,因为piii = Person.__proto__,而没有这样的 XXX.__proto___=Person.prototype,所以找不到PersonIII内部的方法 
             * var piii = new PersonIII()  
             * piii.create(“junzi”, 23); 
             * piii.introduce(); 
             */ 
             PersonIII.create(“junzi”, 23);  
             PersonIII.introduce();  
        }  
          
        /* 2. */ 
        /* 用X做一个中间变量,使得我们可以访问JSON对象的内部属性。*/ 
        function JSONFontII(){  
            var x = function(){ };//必须有function()  
            x.prototype = PersonIII;  
            var px = new x();  
            px.create(“junzi”, 23);  
            px.introduce();  
        }  
        /* 3. */ 
        /* 工厂模式 */ 
        var Factory = {  
            createPersonIII : function (className,name,age) {  
                                var temp = function () {  
                                    className.create(name, age);  
                                };  
                                temp.prototype = className;  
                                var result = new temp();  
                                return result;  
                            }  
        };  
        function testFactory(){  
            var person = Factory.createPersonIII(PersonIII,”junzi”,23);  
            person.introduce();  
        }  
 
        /* 4. */ 
        /* 抽象工厂模式 */ 
        var abstractFactory = {  
            create: function (className, params) {  
                        var temp = function () {  
                                className.create.apply(this, params);  
                        };  
                        temp.prototype = className;  
                        var result = new temp();  
                        return result;  
                    }  
        };  
        function testAbstractFactory(){  
            var person = abstractFactory.create(PersonIII,[“junzi”,23]);  
            person.introduce();  
        }  
    </script>  
</body>  
</html> 
 

 

模拟阴影效果纯CSS圆角矩形

项目上需要个弹出菜单,要求要阴影+圆角。。阴影不敢用PNG格式,客户大多是使用IE6的,用滤镜又不好控制。干脆搞个纯CSS的像素圆角+阴影(模拟)吧,哈哈。  
 
思路是这样的:   
 

 

 

 

 

 

 

 

代码如下:  

CSS

.bBox{width:300px;}
.bBox-t1,.bBox-t2,.bBox-b1,.bBox-b2{height:1px;overflow:hidden; margin:0px;}
.bBox-t1{border:0px;margin:0px 2px 0px 1px;}
.bBox-t2{border-width:0px 1px;border-style:solid;margin-right:1px;}
.bBox-offset{margin:0px;border:0px;}
.bBox-body{border-width:0px 1px;border-style:solid;margin-right:1px;}
.bBox-b2{background:#88CB8C;border-width:0px 2px 0px 0px;border-style:solid;margin-left:1px;}
.bBox-b1{margin:0px 1px 0px 2px;}
.bBox-body *{margin:0px;}
/*边框颜色*/
.bBox-t1,.bBox-b2{background:#88CB8C;}
.bBox-t2,.bBox-body{border-color:#88CB8C;}
/*背景颜色*/
.bBox-t2,.bBox-body{background:#B8E0BA;}
/*阴影颜色*/
.bBox-offset,.bBox-b1{background:#0D7813;}
.bBox-b2{border-color:#0D7813}
/*———————————*/

HTML

<div class=”bBox”>
    <div class=”bBox-t1″></div>
    <div class=”bBox-t2″></div>
    <div class=”bBox-offset”>
        <div class=”bBox-body”>
                <h1>模拟阴影效果纯CSS圆角矩形</h1>
                <ul>
                    <li>调用方便</li>
                    <li>支持多浏览器</li>
                    <li>快捷更换边框、背景及阴影颜色</li>
                </ul>
        </div>
    </div>
    <div class=”bBox-b2″></div>
    <div class=”bBox-b1″></div>
</div>

 

效果:

 

 

 

 

 

 

 

 

 

就取名bBox吧~支持ie,firefox,chrome,其他的没试过,替换颜色和调用还是相当方便的。本来想把背景颜色,边框颜色,阴影颜色写在一起,每次只要改3个地方就行,可是bBox-b2实在是太郁闷了,搞不定,只能麻烦点,每次改6个地方了。

JavaScript 的JSON和数组混杂区分

Javascript代码:

var person = { personalInfo:{} , linkmans:[] , accounts:[] , handlers:[] } ;

等我来解释一下:
  首先,person 是一个 json ,它包含四个东东:personalInfo , linkmans, accounts, handlers
  接着,personalInfo 是一个 json ,
           而 这三个 linkmans, accounts, handlers 都分别为 数组

“javascript 脚本‘不支持此属性或方法’错误”主要原因

 

出现“javascript 脚本‘不支持此属性或方法’错误”主要有以下几种原因:

1、方法对应的js函数未定义,如

onclick=”select();”

中,

select()

没有定义,或没有把相应的.js文件包含进来,包含的方法:

<script language=”javascript” src=”xxxx.js”></script>。

 

2、在html中的表单中出现这个问题时,可能是元素的名称和函数的名称相同。这时aspX解释时,会进行把函数当成是元素名,然后认为后面的函数的括号是未定义的函数。如:

 

<script language=”javascript”>

<!–

function ffff()

    … …

end function

–>

</script>

<input name=”aa” type=”button” value=”重置密码” onclick=”ffff();”>

<input name=”ffff” type=”button” value=”sfsdfa” onclick=”ffff();”>

 

上面这个语句通常就会报“对象不支持此属性或方法”的错误。这时,只需要把name=”ffff”改成别的名字或把函数改成别的名字就正常了。

js动态操作表格

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”  
“http://www.w3.org/TR/html4/loose.dtd”> 
<html> 
<head> 
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″> 
<title>js动态操作表格</title> 
<script language=”javascript”> 
 function init(){    
     _table=document.getElementById(“table”);  
     _table.border=”1px”;  
     _table.width=”800px”;  
      
    for(var i=1;i<6;i++){  
         var row=document.createElement(“tr”);    
         row.id=i;  
         for(var j=1;j<6;j++){  
             var cell=document.createElement(“td”);    
             cell.id=i+”/”+j;  
             cell.appendChild(document.createTextNode(“第”+cell.id+”列”));    
             row.appendChild(cell);    
         }  
         document.getElementById(“newbody”).appendChild(row);    
     }  
 }    
   
 function rebulid(){  
    var beginRow=document.getElementById(“beginRow”).value;/*开始行*/  
    var endRow=document.getElementById(“endRow”).value;/*结束行*/  
    /*/*/  
    var beginCol=document.getElementById(“beginCol”).value;/*开始列*/  
    var endCol=document.getElementById(“endCol”).value;/*结束列*/  
      
    var tempCol=beginRow+”/”+beginCol;/*定位要改变属性的列*/  
    alert(tempCol);  
    var td=document.getElementById(tempCol);  
    for(var x=beginRow;x<=endRow;x++){  
        for(var i=beginCol;i<=endCol;i++){  
          if(x==beginRow){  
            document.getElementById(“table”).rows[x].deleteCell(i+1);  
          }  
          else{  
             document.getElementById(“table”).rows[x].deleteCell(i);  
          }  
              
        }  
    }  
    td.rowSpan=(endRow-beginRow)+1;  
}  
 /*添加行,使用appendChild方法*/  
 function addRow(){  
   var length=document.getElementById(“table”).rows.length;  
   /*document.getElementById(“newbody”).insertRow(length);  
   document.getElementById(length+1).setAttribute(“id”,length+2);*/  
   var tr=document.createElement(“tr”);  
   tr.id=length+1;  
   var td=document.createElement(“td”);  
   for(i=1;i<4;i++){  
    td.id=tr.id+”/”+i;  
    td.appendChild(document.createTextNode(“第”+td.id+”列”));  
    tr.appendChild(td);  
     
   }  
  document.getElementById(“newbody”).appendChild(tr);    
 }   
   
 function addRow_withInsert(){  
    var row=document.getElementById(“table”).insertRow(document.getElementById(“table”).rows.length);  
    var rowCount=document.getElementById(“table”).rows.length;  
      
    var countCell=document.getElementById(“table”).rows.item(0).cells.length;  
    for(var i=0;i<countCell;i++){  
      var cell=row.insertCell(i);  
       
      cell.innerHTML=”新”+(rowCount)+”/”+(i+1)+”列”;  
      cell.id=(rowCount)+”/”+(i+1);  
        
      }  
 }  
   
 /*删除行,采用deleteRow(row Index)*/  
 function removeRow(){  
  /* var row=document.getElementById(“2”);   
   var index=row.rowIndex;  
   alert(index);*/  
   document.getElementById(“newbody”).deleteRow(document.getElementById(document.getElementById(“table”).rows.length).rowIndex);   
 }  
   
 /*添加列,采用insertCell(列位置)方法*/  
 function addCell(){  
 /*document.getElementById(“table”).rows.item(0).cells.length  
  用来获得表格的列数  
 */  
    for(var i=0;i<document.getElementById(“table”).rows.length;i++){  
        var cell=document.getElementById(“table”).rows[i].insertCell(2);  
        cell.innerHTML=”第”+(i+1)+”/”+3+”列”;  
          
    }  
 }  
 /*删除列,采用deleteCell(列位置)的方法*/  
 function removeCell(){  
    for(var i=0;i<document.getElementById(“table”).rows.length;i++){  
        document.getElementById(“table”).rows[i].deleteCell(0);  
    }  
}  
</script> 
</head> 
 
<body onLoad=”init();”> 
 
 <table  id=”table” align=”center”>    
     <tbody id=”newbody”></tbody>    
       
 </table>   
  <div> 
    <table width=”800px” border=”1px” align=”center”> 
        <tr><td align=”center”><input type=”button” id=”addRow” name=”addRow” onClick=”addRow();” value=”添加行”/></td><td align=”center”><input type=”button” id=”delRow” name=”delRow” onClick=”removeRow();” value=”删除行”/></td></tr> 
      <tr><td align=”center”><input type=”button” id=”delCell” name=”delCell”  onClick=”removeCell();” value=”删除列”/></td><td align=”center”><input type=”button” id=”addCell” name=”addCell” onClick=” addCell();” value=”添加列”/></td></tr> 
     <tr><td align=”center” colspan=”2″><input type=”button” id=”addRows” name=”addRows”  onClick=”addRow_withInsert();” value=”添加行”/></td></tr> 
    </table> 
 </div> 
 <div> 
    <table width=”800px” border=”1px” align=”center”> 
        <tr><td>从第<input type=”text” id=”beginRow” name=”beginRow”  value=””/>行到<input type=”text”  name=”endRow”  id=”endRow” value=””/>行</td><td rowspan=”2″  id=”test”><input type=”button” name=”hebing” id=”hebing” value=”合并” onClick=”rebulid();”/></td></tr> 
      <tr><td>从第<input type=”text” name=”beginCol” id=”beginCol” value=””/>列到<input type=”text” name=”endCol” id=”endCol” value=””/>列</td></tr> 
    </table> 
 </div> 
</body> 
</html> 

完美兼容IE、FF、Opera的Ajax类支持get、post、自定义回调函数(转载待测)

Js代码

function Ajax(){  
    this.httpXML=false;  
    this.init();  
}  
Ajax.prototype.init=function(){  
    if(window.XMLHttpRequest){  
        this.httpXML=new XMLHttpRequest();   
        if (this.httpXML.overrideMimeType){  
            this.httpXML.overrideMimeType(“text/xml”);   
        }  
    }else if(window.ActiveXObject){  
        try{this.httpXML = new ActiveXObject(“Msxml2.XMLHTTP”);}catch (e){   
             try{this.httpXML = new ActiveXObject(“Microsoft.XMLHTTP”);}catch (e){}   
        }  
    }  
    if(!this.httpXML){  
        window.alert(“can’t create XMLHttpRequest object”);  
        return null;  
    }  
}  
Ajax.prototype.send=function(_method,_url,_data,_callback){  
    this.httpXML.onreadystatechange=function(){  
        if(this.readyState==4&&this.status==200){  
            _callback.call(this,this.responseText);  
        }  
    }  
      
    if (_method.toLowerCase() == “get”){   
         //if(navigator.userAgent.indexOf(“MSIE”)<=0){  
         //     netscape.security.PrivilegeManager.enablePrivilege(“UniversalBrowserRead”);  
         //}  
         this.httpXML.open(_method, _url, true);   
         this.httpXML.send(null);   
    }else if (_method.toLowerCase() == “post”){   
         this.httpXML.open(_method, _url, true);   
         this.httpXML.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);   
         this.httpXML.send(_data);   
    }   
      
}  
 
Ajax.prototype.callback=function(){  
       

function Ajax(){
 this.httpXML=false;
 this.init();
}
Ajax.prototype.init=function(){
 if(window.XMLHttpRequest){
  this.httpXML=new XMLHttpRequest();
  if (this.httpXML.overrideMimeType){
            this.httpXML.overrideMimeType(“text/xml”);
        }
 }else if(window.ActiveXObject){
  try{this.httpXML = new ActiveXObject(“Msxml2.XMLHTTP”);}catch (e){
             try{this.httpXML = new ActiveXObject(“Microsoft.XMLHTTP”);}catch (e){}
        }
 }
 if(!this.httpXML){
  window.alert(“can’t create XMLHttpRequest object”);
  return null;
 }
}
Ajax.prototype.send=function(_method,_url,_data,_callback){
    this.httpXML.onreadystatechange=function(){
        if(this.readyState==4&&this.status==200){
      _callback.call(this,this.responseText);
     }
    }
   
    if (_method.toLowerCase() == “get”){
         //if(navigator.userAgent.indexOf(“MSIE”)<=0){
         //     netscape.security.PrivilegeManager.enablePrivilege(“UniversalBrowserRead”);
         //}
         this.httpXML.open(_method, _url, true);
         this.httpXML.send(null);
    }else if (_method.toLowerCase() == “post”){
         this.httpXML.open(_method, _url, true);
         this.httpXML.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
         this.httpXML.send(_data);
 }
 
}

Ajax.prototype.callback=function(){
 
}

Html代码

<!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> 
    <title>完美兼容IE、FF、Opera浏览器</title> 
    <script type=”text/javascript” src=”js/ajax.js”></script> 
    <script type=”text/javascript”> 
        function send(){  
            ajax=new Ajax();  
            ajax.send(“get”,”listener/Hajax.ashx”,”post测试请求”,ddd);  
        }  
          
        function ddd(data){  
            alert(data);  
        }  
    </script> 
</head> 
<body> 
    <button onclick=”send()”>测试</button> 
</body> 
</html> 

<!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>
    <title>完美兼容IE、FF、Opera浏览器</title>
    <script type=”text/javascript” src=”js/ajax.js”></script>
    <script type=”text/javascript”>
        function send(){
            ajax=new Ajax();
            ajax.send(“get”,”listener/Hajax.ashx”,”post测试请求”,ddd);
        }
       
        function ddd(data){
            alert(data);
        }
    </script>
</head>
<body>
    <button onclick=”send()”>测试</button>
</body>
</html>