JavaScript DOM编程艺术第七章Ajax学习笔记

66 阅读3分钟

关于Ajax原理

本地file浏览不要用webkit核心浏览器,要用firefox。否则就要搭建服务器后通过http访问。

今天学习了Ajax从本地文件获取文本。遇到了些问题,在网络上都找到了解决办法。

先把源码都贴上来吧。

HTML代码

    <!DOCTYPE html>  
    <html lang="en">  
    <head>  
        <meta charset="UTF-8">  
        <title>Ajax</title>  
        <script src="js/getHTTPObject.js"></script>  
		 <script src="js/getNewContent.js"></script>  
    </head>  
    <body>  
        <input type="button" value="读取" onclick="getNewContent('example.txt');"/>
        <p><div id="data" class="divStyle"></div></p>  
    </body>  
    </html>  

getHTTPObject.js代码 getHTTPObject通过对象检测技术检测了XMLHttpRequest.如果失败,则继续检测其他方法,最终返回false或者一个新的XMLHttpReuqest对象

function getHTTPObject(){
		if(typeof XMLHttpRequest == "undefined") return false;
		XMLhttpRequest = function(){
			try{
				return new ActiveXObject("Msml2.XMLHTTP.6.0");
			}catch(e){}
			try{
				return new ActiveXObject("Msml2.XMLHTTP.3.0");
			}catch(e){}
			try{
				return new ActiveXObject("Msml2.XMLHTTP");
			}catch(e){}
			return false;
		}	
		return new XMLHttpRequest();
	}

getNewContent.js代码如下

function getNewContent(url){
	var request = getHTTPObject();//创建request对象
	if(request){
		request.open("GET",url,true);//get类型、url、是否异步

		request.onreadystatechange = function(){//服务器返回响应时触发
			/*
				function要在onreadystatechange被触发时执行,而不是立即执行,所以不要加()
				request.onreadystatechange = doSomething;
			*/
			if(request.readyState == 4){//返回的类型
				/*
					readystate == 0 :未初始化
					readystate == 1 :正在加载
					readystate == 2 :加载成功
					readystate == 3 :正在交互
					readystate == 4 :完成
				*/
				 if(request.status == 200){ //判断是否一切准备就绪
				var para = document.createElement("p");
				var txt = document.createTextNode(request.responseText);
				para.appendChild(txt);
				document.getElementById("data").appendChild(para);		
				//document.getElementById("data").innerHTML = request.responseText;  	
			}
		   }
		};
		request.send();//发送请求GET请求
		//request.send(需要传的数据);发送请求POST请求
	}else{
		alert("Sorry,your browser dosen\'t support XMLHttpRequest !!!");
	}
}

GET和POST区别: GET传输数据较小,并且是附加在URL上传输,会被缓存在浏览器,安全性不高;

var url="__MODULE__/Ucenter/ajax_update"//设置要提交action到后台的那个处理请求的文件名
    url=url+"?userName="+userName+"&passWord="+passWord//为这个路径加上参数用户名和密码
    url=url+"&sid="+Math.random()//为这个路径加上一个随机数
    xmlHttp.open("GET",url,true)//定义请求的参数
!!!对于get请求(或凡涉及到url传递参数的),被传递的参数都要先经encodeURIComponent方法处理.例:var url = "update.php?username=" +encodeURIComponent(username) + "&content=" +encodeURIComponent(content)+"&id=1" ;

POST传输是把数据以一个实体传输,数据量比GET大

1.设置header的Context-Type为application/x-www-form-urlencode确保服务器知道实体中有参数变量.通常使用XmlHttpRequest对象的SetRequestHeader("Context-Type","application/x-www-form-urlencoded;")例:xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
2.参数是名/值一一对应的键值对,每对值用&号隔开.如 var name=abc&sex=man&age=18,注意var name=update.php?abc&sex=man&age=18以及var name=?abc&sex=man&age=18的写法都是错误的;
3.参数在Send(参数)方法中发送,例: xmlHttp.send(name); 如果是get方式,直接 xmlHttp.send(null);4.服务器端请求参数区分Get与Post如果是get方式则$username = $_GET["username"]; 如果是post方式,则$username = $_POST["username"];

点击前 点击前的

点击后 点击后

遇到的问题: 搜狗、chrome、ie均不能读取。 错误 在网上找到一篇分享,说是chrome不支持本地的异步请求。 网上解决不支持本地异步请求

如何在chrome上面也能得到相同的执行,所以需要在Chrome的快捷方式后面添加:--allow-file-access-from-files 即可(注意前面需要额外加一个空格,否则会报错。

如我在本机上的命名是:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files

结果就正常了。