Sep 17

小试Ajax 不指定

felix021 @ 2008-9-17 18:49 [IT » 网络] 评论(0) , 引用(0) , 阅读(4336) | Via 本站原创 | |
今天继续看ajax。
以前写过一个ajax的聊天室,但是只能在IE下面运行。
今天写了一个全新的,在Firefox下面也运行正常了。
附上代码(PHP + Ajax):
下载文件 (已下载 1090 次)


做一些笔记:

1. 考虑多浏览器的兼容性,在创建XMLHttpRequest对象的时候要多加处理
一般如下代码就OK了:
    function GetXMLHTTP()
    {
        var xmlHttp=null;
        try{
            try{ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }
            catch(e1){ xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");}
        }catch(e2){ xmlHttp=new XMLHttpRequest;}
        return xmlHttp;
    }

2. 不要直接把onreadystatechange事件绑定到一个匿名函数(Firefox貌似不兼容此方式)
一般使用如下代码:
//可以将以下代码放在一个函数里面
       var handleStateChange = function (){
            if(xml.readyState == 4){ //表示请求结束
                if(xml.status == 200){ //HTTP状态200表示一切正常
                    //do something
                }
                else alert(xml.status);
            }
        }
        try{
            xml.onreadystatechange = handleStateChange;
            xml.open("GET", url, true);
            xml.send(null);
        }catch(e){alert("Error: " + e);}

3. 在提交post请求的时候用如下代码
try{
    var xml = getXmlHttpRequest();
    var content = document.getElementById("content").value;
    xml.onreadystatechange = handleStateChange;
    xml.open("POST", url, true); // POST请求
    //加上一个http头,表示提交一个POST请求,包含一个表单
    xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
    //使用encodeURIComponent()函数对表单内容进行URL编码,用&连接两个不同的表单元素值
    xml.send("content="+encodeURIComponent(content)+"&name=felix021");
}catch(e){alert("Error:" + e);}

4. 善用try-catch结构,捕捉运行时错误
使用try-catch结构可以捕捉到运行时的错误,不仅可以进行错误处理,而且也方便调试。比如:
try{
    //do something
}catch(e){
   //错误处理
   alert(e); //显示错误信息
}

5. 为每一个异步请求创建一个xmlHttpRequest对象。
这样可以避免多个请求之间的冲突问题,也没有必要创建一个队列。
可以把每个请求封装到一个函数里面,每次调用即可。
具体代码参见前面附件里面index.html中的update和talk函数。

6. encodeURI(String)和encodeURIComponent(String)函数
对URI编码,区别在于encodeURI把String当作一个URI来解析,
而encodeURIComponent把String当作URI中的一个部分来解析。
举个例子,对URI (http://a.com/test.php?a=哈哈)的编码结果为:
encodeURI: http://a.com/test.php?a=%E5%93%88%E5%93%88
encodeURIComponent: http%3A%2F%2Fa.com%2Ftest.php%3Fa%3D%E5%93%88%E5%93%88
所以在send函数里面应该使用encodeURIComponent函数。
对应这两个函数分别有decodeURI和decodeURIComponent这两个函数
另外还有个escape和unescape函数对不是很好使,具体的baidu一下,自己写个脚本测试一下就知道了。

7. setTimeout("code", Interval)和setInterval("code", Interval)函数
这两个函数的作用是在以毫秒为单位的Interval间隔之后运行一段由code指定的javascript代码。
区别在于 setTimeout只运行一次该代码, 而setInterval在每隔一段Interval指定的时间之后运行一次代码,
直到窗口关闭为止。对于setTimeout,要实现重复运行该代码,可以在code里面指定一个函数,函数里面再
运行一次setTimeout,这样可以动态修改函数运行时间;而setInterval的时间间隔是不能修改的。

8. 对于xmlHttpRequest对象取回的responseText,如果要显示在div这类元素内,可能需要对其进行html编码
编码函数如下:
    function htmlspecialchars(str)  
    {  
        var s = "";
        if (str.length == 0) return "";
        for   (var i=0; i<str.length; i++)
        {
            switch (str.substr(i,1))
            {
                case "<": s += "&lt;"; break;
                case ">": s += "&gt;"; break;
                case "&": s += "&amp;"; break;
                case " ":
                    if(str.substr(i + 1, 1) == " "){
                        s += " &nbsp;";
                        i++;
                    } else s += " ";
                    break;
                case "\"": s += "&quot;"; break;
                case "\n": s += "<br/>"; break;
                default: s += str.substr(i,1); break;
            }
        }
        return s;
    }




欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]