您的位置:首页 > Web前端 > JavaScript

ajax、javascript学习笔记1

2011-05-03 19:13 357 查看
●简介

Asynchronous Javascript And Xml

异步的javascript和xml

·使用XHTML和CSS的基于标准的表示技术

·使用DOM进行动态显示和交互

·使用XML和XSLT进行数据交换和处理

·使用XMLHTTPREQUEST进行异步数据检索:页面端javascript的浏览器内置对象

·使用Javascript将以上技术融合

与传统模式的对比

//1.取参数

//2.看参数是否有问题

//3.校验操作

//4.和传统应用不同之处,这一步需要将用户感兴趣的数据返回给页面端,而不是将新页面发送给用户。

●初步使用 jquery

html中

包含js文件代码 <script type="text/javascript" src="jslib/jquery.js" ></script>

<script type="text/javascript" src="jslib/verify.js" ></script> 在webroot目录下有个jslib目录下有个verifu.js文件

<!--基于标准的一些好习惯,1标签名要小写,2标签必须关闭,3属性名必须小写 4 属性值应放到双引号-->
itcast.cn用户名校验的ajax实例,请输入用户名: <br/>
<!--ajax方式下不需要使用表单来进行数据提交,因此不用写表单标签-->
<!--ajax方式不需要name属性,需要一个id属性-->
<input type="text" id="userName" />
<input type="button" value="校验" onclick="verify()">
<!--这个div用于存放服务器端返回的信息,开始为空-->
<!--id属性定义是为了利用dom的方式找到某个节点,进行操作-->
<!--div 是CSS中的块级元素-->
<div id="result"></div>
<!--<div id="result">123</div><div id="result1">456</div>-->
<!-- span是CSS中的内联元素-->
<!--<span>123</span><span>456</span>-->
<!--div和span的直观差异,div占独行,span与其前后元素相处很好-->


js文件中

function verify(){
//首先测试一下页面的按钮按下,可以调用这个方法
//使用javascript的alert方法,显示一个弹出提示框
//alert("按钮被点击了");
//1.获取文本框的内容
// document.getElementById("userName"); dom的方式
//Jquery的查找节点的方式,参数中#加上id属性值可以找到一个节点,这是css23定义的表达式方式
//Jquery的方法返回的都是jquery的对象,可以继续在上面执行其他的jquery方法
var jqueryobj = $("#userName");
//获取节点的值
var userName = jqueryobj.val();
//alert(userName);
//2. 将文本狂中的数据发送给服务器的servlet
//使用jquery的XMLHTTPrequrst对象法人请求封装
$.get("AJAXServer?name="+userName,null,callback);

//回调函数
function callback(data){
//alert("服务器端的数据回来了");
//3. 接受服务端的返回的数据
//alert(data);
//4. 将服务器端返回的数据动态显示到页面上
//找到保存结果信息的节点
var resultObj =$("#result");
resultObj.html(data);
alert("");
}
}


●使用httpxmlrequest的api实现ajax的javascript代码

//用户名校验的方法
//这个方法使用XMLHTTPRequest对象进行AJAX的异步数据交互
var xmlhttp;
function verify(){
//1.使用dom的方式获取文本框中的值
//document.getElementBuId("userName")是dom中获取元素节点的一种方法,一个元素节点对应HTML页面中的一个标签,如果<input>
//.value可以获取一个元素节点的value属性值
var userName = document.getElementById("userName").value;
//2.创建XMLHttpRequest对象
//这是XMLHttpRequest兑现使用中最为复杂的一步
//需要这对IE和其他类型浏览器建立这个对象的不方式写不同的代码
if(window.XMLHttpRequest){
//针对FireFox,Mozillar,opera,safari,IE7,IE8
xmlhttp = new XMLHttpRequest();
//针对某些特定版本的mozillar浏览器的bug修正
if(xmlhttp.overrideMimeType){
xmlhttp.overrideMimeType("text/xml")
}
}else if(window.ActiveXObject){
//针对IE5,IE5.5,IE6(IE7,IE8)
//两个可以用于创建XMLHTTPRequest对象的控件名称,保存在一个js数组中
//排在前面的版本较新
var activexName =["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
for(var i=0;i<activexName.length;i++){
try{
//取出一个控件名进行创建,如果创建成功就终止循环
//如果创建失败,抛出异常,然后继续循环,继续尝试创建
xmlhttp = new ActiveXObject(activexName[i]);
break;
}   catch(e){
}
}
}
// 确认XMLHttpRequest对象创建成功
//        if(!xmlhttp){
//             alert("XMLHttpRequest对象创建失败!");
//             return;
//        }else{
//           //alert(xmlhttp);
//            alert(xmlhttp.readyState);
//        }
//2 注册回调函数
//注册回调函数时只需要函数名不要加括号
//我们需要注册的是函数名称,如果加上括号,就把函数的返回值给注册上了,这是错误的
xmlhttp.onreadystatechange = callback;
//3设置连接信息
//第一个参数表示http的请求方式。支持所有http的请求方式。主要使用get和post
//第二个参数表示请求的url地址,get方式的参数也在url中
//第三个参数表示采用异步还是同步方式交互,true表示异步
//GET方式请求的代码
//xmlhttp.open("GET","AJAXServer?name="+userName,true);

//POST方式请求的代码
xmlhttp.open("POST","AJAXServer",true);
//POST方式需要自己设置http的请求头
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//POST方式发送数据
xmlhttp.send("name="+userName);

//4 发送数据,开始和服务器端进行交互
//同步方式下,send这句话会在服务器设置回来后才执行完
//异步方式,send这句话执行晚会立即完成

//GET方式
//xmlhttp.send(null);
}
//回调函数
function callback(){
// alert(xmlhttp.readyState);
//5接收响应数据
//判断对象的状态是交互完成
if(xmlhttp.readyState==4){
//判断http的交互是否成功、
if(xmlhttp.status==200){
//获取服务器端返回的数据
//获取服务器端输出的纯文本数据
var responseText = xmlhttp.responseText;
//将数据显示在页面上
//通过dom方式找到div标签所对应的元素节点
var divNode = document.getElementById("result");
//设置元素节点中的html内容
divNode.innerHTML=responseText;
}else
{
alert("出错了");
}
}
}


●当servlet返回的是一个xml文本时用httpxmlrequest对象接收

即返回一个带有<asdf>asdf</asdf>

这样的文本时

需要在javascript中解析出文本的内容然后将其显示

//用户名校验的方法
//这个方法使用XMLHTTPRequest对象进行AJAX的异步数据交互
var xmlhttp;
function verify(){
//1.使用dom的方式获取文本框中的值
//document.getElementBuId("userName")是dom中获取元素节点的一种方法,一个元素节点对应HTML页面中的一个标签,如果<input>
//.value可以获取一个元素节点的value属性值
var userName = document.getElementById("userName").value;
//2.创建XMLHttpRequest对象
//这是XMLHttpRequest兑现使用中最为复杂的一步
//需要这对IE和其他类型浏览器建立这个对象的不方式写不同的代码
if(window.XMLHttpRequest){
//针对FireFox,Mozillar,opera,safari,IE7,IE8
xmlhttp = new XMLHttpRequest();
//针对某些特定版本的mozillar浏览器的bug修正
if(xmlhttp.overrideMimeType){
xmlhttp.overrideMimeType("text/xml")
}
}else if(window.ActiveXObject){
//针对IE5,IE5.5,IE6(IE7,IE8)
//两个可以用于创建XMLHTTPRequest对象的控件名称,保存在一个js数组中
//排在前面的版本较新
var activexName =["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
for(var i=0;i<activexName.length;i++){
try{
//取出一个控件名进行创建,如果创建成功就终止循环
//如果创建失败,抛出异常,然后继续循环,继续尝试创建
xmlhttp = new ActiveXObject(activexName[i]);
break;
}   catch(e){
}
}
}
// 确认XMLHttpRequest对象创建成功
//        if(!xmlhttp){
//             alert("XMLHttpRequest对象创建失败!");
//             return;
//        }else{
//           //alert(xmlhttp);
//            alert(xmlhttp.readyState);
//        }
//2 注册回调函数
//注册回调函数时只需要函数名不要加括号
//我们需要注册的是函数名称,如果加上括号,就把函数的返回值给注册上了,这是错误的
xmlhttp.onreadystatechange = callback;
//3设置连接信息
//第一个参数表示http的请求方式。支持所有http的请求方式。主要使用get和post
//第二个参数表示请求的url地址,get方式的参数也在url中
//第三个参数表示采用异步还是同步方式交互,true表示异步
//GET方式请求的代码
//xmlhttp.open("GET","AJAXServer?name="+userName,true);
//POST方式请求的代码
xmlhttp.open("POST","AJAXXMLServer",true);
//POST方式需要自己设置http的请求头
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//POST方式发送数据
xmlhttp.send("name="+userName);
//4 发送数据,开始和服务器端进行交互
//同步方式下,send这句话会在服务器设置回来后才执行完
//异步方式,send这句话执行晚会立即完成
//GET方式
//xmlhttp.send(null);
}
//回调函数
function callback(){
// alert(xmlhttp.readyState);
//5接收响应数据
//判断对象的状态是交互完成
if(xmlhttp.readyState==4){
//判断http的交互是否成功、
if(xmlhttp.status==200){
//获取服务器端返回的数据
//使用responseXML的方式接受XML数据对象的Dom对象
var domObj =xmlhttp.responseXML;
if(domObj){
//<message>1231234</message>
//dom中利用getElementsByTagName可以根据标签名来获取元素节点,返回的是一个数组
var messageNodes= domObj.getElementsByTagName("message");
if(messageNodes.length>0){
//获取message节点中的文本内容
//message标签中的文本在dom中是message标签对应的元素的子节点,firstChild可以获取到当前节点的第一个子节点
//通过以下方式就可以获得到文本内容所以对应的节点
var textNode = messageNodes[0].firstChild;
//对于文本节点来说,可以通过nodeValue的方式返回文本节点的文本内容
var responseMessage = textNode.nodeValue;
//将数据显示在页面上
//通过dom方式找到div标签所对应的元素节点
var divNode = document.getElementById("result");
//设置元素节点中的html内容
divNode.innerHTML=responseMessage;
} else{
alert("XML数据格式错误,原始文本内容为:"+xmlhttp.responseText);
}
}else{
alert("XML数据格式错误,原始文本内容为:"+xmlhttp.responseText);
}
}else
{
alert("出错了");
}
}
}


●当servlet返回一个xml时候用jquery对象接收

//定义用户名娇艳的方法
function verify(){
//首先测试一下页面的按钮按下,可以调用这个方法
//使用javascript的alert方法,显示一个弹出提示框
//alert("按钮被点击了");
//1.获取文本框的内容
// document.getElementById("userName"); dom的方式
//Jquery的查找节点的方式,参数中#加上id属性值可以找到一个节点,这是css23定义的表达式方式
//Jquery的方法返回的都是jquery的对象,可以继续在上面执行其他的jquery方法
var jqueryobj = $("#userName");
//获取节点的值
var userName = jqueryobj.val();
//alert(userName);
//2. 将文本狂中的数据发送给服务器的servlet
//javaScript当中,一个简单的对象的定义方式
var obj={name:123,age:20};
//使用jquery的XMLHTTPrequrst对象法人请求封装
$.ajax({
type: "POST",          //http的请求方式
url:"AJAXXMLServer",   //服务器段的URL地址
data:"name="+userName,  //发送到服务器端的数据
dataType: "xml",        //告诉Jquery返回的数据格式
success: callback       //定义交互完成 且服务器正确返回数据时调用的回调函数
});

//回调函数
function callback(data){
//alert("服务器端的数据回来了");
//3. 接受服务端的返回的数据
//需要将data这个doom对象中的数据解析出来
//首先需要将dom的对象转换成JQuery对象
var jqueryObj = $(data);
//获取message节点
var message =jqueryObj.children();
//获取文本内容
var text=message.text();
//4. 将服务器端返回的数据动态显示到页面上
//找到保存结果信息的节点
var resultObj =$("#result");
resultObj.html(text);

}
}


●浏览器缓存问题和中文问题

IE会根据url地址来判断是否读取缓存

所以我们给每次的url加一个时间即可骗过IE

function verify(){
//解决中文问题的方法  1.页面端发出的数据做一次encodeURI,服务器端使用new String(old.getBytes("iso8859-1"),"UTF-8");
//解决中文问题的方法  2.页面端发出的数据做两次encodeURI,服务器端使用String name = URLDecoder.decode(old,"UTF-8");
var url="AJAXServer?name="+encodeURI($("#userName").val());
//var url="AJAXServer?name="+encodeURI(encodeURI($("#userName").val()));
url= converURL(url);
$.get(url,null,function(data){
$("#result").html(data);
});
}
//给url地址增加时间戳,骗过浏览器,不读取缓存
function converURL(url){
//获取时间戳
var timstamp = new Date().valueOf();
//将时间戳品拼接到url上
//url="AJAXServer"
//indexOf("?")查看字符串中是否有?
if(url.indexOf("?")>=0){
url=url + "&t=" + timstamp;
}else{
url=url + "?t=" + timstamp;
}
return url;
}


如换一张图片

<img src="ImageServer" /> src一般是一个servlet服务器返回的图片信息

<a onclick="changimg()" href="#">换一张</a>

●跨域访问

在浏览器端代码中,我们需要在调用open方法之前判断一下要连接的地址是不是以

http开头的,如果是则认为要访问的是跨域资源,首先将当前url中的?变成&,这是

因为将要连接的地址改为"proxy?url="以后如果原来url地址中有参数的话,新的url

地址中就会有两个"?"导致服务器端解析参数错误,"url"之后的内容表示本来要访问

的跨域资源的地址。

function convertURL(url){
if(url.substring(0,7)=="http://"){
url=url.replace("?","&");
url="proxy?url="+url;
}
return url;
}


服务器端代码较复杂自行百度谷歌 :)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: