7.10
--------
Ajax:Asynchronous JavaScript And XML
异步的 JavaScript 和 XML
1:编写ajax遵守基本标准习惯
标签名全小写,标签必须有结束标签,属性名必须小写,属性值必须位于“”或''内
2:创建ajax服务端代码:AjaxServer.java
和普通的servlet类似,区别在于,普通servlet返回的是页面,而ajax返回的
是我们想要的数据
ajax框架:dwr,dojo,ext,prototype,jquery
3、编写页面:ajax.html
A:编写js:verify.js
B:在页面中引入该js
4、精简js:verify.js--->verify1.js
5、不使用jquery框架,直接使用ajax的异步对象XMLHttpRequest对象去实现ajax应用
步骤:
A:创建XMLHttpRequest对象
B:注册回调函数
C:设置连接信息
D:发送数据到服务端进行交互
E:接受数据
创建js:verifyown.js
相关代码:
------------
var xmlHttp;
function verify()
{
//使用dom方式获取username的值
var username = document.getElementById("username").value;
//A:创建XMLHttpRequest对象
xmlHttp = getXMLHttpRequest();
//判断该异步对象是否创建成功
if(xmlHttp)
{
// B:注册回调函数
xmlHttp.onreadystatechange = callback;
// C:设置连接信息
xmlHttp.open("get","ajaxServer?username="+username,true);
//D:发送数据到服务端进行交互
xmlHttp.send(null);
//xmlHttp.open("post","ajaxServer",true);
//设置请求头
//xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//xmlHttp.send("username="+username);
}
}
//D:发送数据到服务端进行交互
function callback()
{
//判断数据是否交互完成
if(xmlHttp.readyState == 4)
{
//判断http交互是否成功
if(xmlHttp.status == 200)
{
//返回响应数据
//alert(xmlHttp.responseText);
var text = xmlHttp.responseText;
//alert(text);
document.getElementById("result").innerHTML = text;
}
}
}
//A:创建XMLHttpRequest对象
function getXMLHttpRequest()
{
var xmlHttp = null;
try
{
//FF Safari Opera IE
xmlHttp = new XMLHttpRequest();
}
catch(e)
{
try
{
//IE 5,6
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
}
6:接收返回值类型为xml格式的数据
A:AjaxServer.java--->AjaxXMLServer.java
B:配置web.xml
c:verifyown.js--->verifyXML.js
function callback()
{
//判断数据是否交互完成
if(xmlHttp.readyState == 4)
{
//判断http交互是否成功
if(xmlHttp.status == 200)
{
//返回响应数据 xml返回的是个对象
//alert(xmlHttp.responseText);
var xml = xmlHttp.responseXML;
//var xml = xmlHttp.responseText;
//alert(xml);
var msgs = xml.getElementsByTagName("message");
if(msgs.length > 0)
{
textNode = msgs[0].firstChild;
//alert(textNode.nodeValue);
var msg = textNode.nodeValue;
//alert(msgs.length);
document.getElementById("result").innerHTML = msg;
}
else
{
alert("xml数据解析错误,原始内容为:"+xmlHttp.responseText);
}
}
}
}
7.11
------------
7、使用jquery的ajax方法实现文本数据的返回
verify.js---->verifyJquery.js
$.ajax({
//type:"get",//url:"ajaxServer?username="+username,type:"post",url:"ajaxServer",data:"username="+username,success:function(data)
{
//alert(data);
$("#result").html(data);
}
});
8、使用jquery的ajax方法实现xml数据的返回
verifyJquery.js---->verifyJqueryXML.js
$.ajax({
//type:"get",url:"ajaxXMLServer",dataType:"xml",success:callback
});
function callback(data)
{
//dom--->jquery $(dom)
//jquery-->dom jquery.get(0)
var jqueryObj = $(data);
var msgs = jqueryObj.children();
var text = msgs.text();
$("#result").html(text);
}
9、缓存问题:
FF每次都发送请求。IE到哪个请求路径一样时,会调用缓存
解决方案:时间戳
function convertURL(url)
{
var timestamp = new Date().getTime();
//将该时间戳加到url上
if(url.indexOf("?") >= 0)
{
url += "&t="+timestamp;
}
else
{
url += "?t="+timestamp;
}
return url
}
简单的Math.Random()
var url = "ajaxServer?username="+username+"&t="+Math.random();
10、解决中文乱码问题
get/post
//服务器端解码一次
username = URLDecoder.decode(username,"utf-8");
//在js端编码2次
username = encodeURI(username);
username = encodeURI(username);
字节码编码的原理:
在文本框中输入“中”
11:jQuery部分方法练习
test1.html
-------
//1、简单:伪类
//:first
var firstul = $("ul:first");
//alert(firstul.get(0).id);
//:last
var lastul = $("ul:last");
//alert(lastul.get(0).id);
var ul = $("ul").get(1);
//alert(ul.id);
//:not
//var notul = $("ul:not");
var notul = $("#newsList li:not(.highlight)");
//alert(notul.length);
//alert(notul.text());
//手动遍历该集合
notul.each(function(){
//alert(this.innerHTML);
//alert($(this).html());
});
//将记录的间隔显示不同颜色
//:odd(单数) even(双数)
var uls = $("li:even");
//alert(uls.length); //5
/* uls.each(function(){
this.className="highlight"; //添加class属性值
});
*/
//使用隐式递归
//uls.addClass("highlight"); //为每个元素添加class属性值
//alert($("span").html());
//$("span").text("<font color='red'>haha</a>");
//$("span").html("<font color='red'>haha</a>");
//$("li:first").addClass("highlight");
//$($("li").get(2)).addClass("highlight");
//$("li:eq(2)").addClass("highlight");
//$("li:gt(2)").addClass("highlight");
//$("li:lt(2)").addClass("highlight");
//获取所有的h标签
//var hs = $("h1,h2,h3,h4,h5,h6");
//hs.addClass("head");
//$(":header").addClass("head");
//内容
//contains
//var nodes = $("li:contains(4)");
//nodes.addClass("highlight");
//var ele = $(":hidden");
//var ele = $(":visible");
//表单
//var ele = $(":text");
//var ele = $(":input");
//表单对象属性
//var fms = $("form").get(0);
//alert(fms.elements.length);
//alert($("input:checked").length);
//alert($("form :checked").length);
//var eles = $("li:contains(4)");
//eles.css("color","red");
----------------
//链式调用源码分析
function Demo()
{
}
Demo.prototype={
setName:function(name)
{
this.name = name;
//返回对象本身
return this;
},getName:function()
{
return this.name;
},setAge:function(age)
{
this.age = age;
return this;
},getAge:function()
{
return this.age;
}
}
//工厂函数
function D()
{
return new Demo();
}
var o = D().setName("xwq").setAge("14");
alert(o.getName()+" "+o.getAge());
});
-------------
1:应用案例1:弹出窗口
A:编写页面:jqueryWin.html
B:编写css:win.css
C:编写js:jqueryWin.js
function showWin()
{
var winNode = $("#win");
//方法一 修改css
//winNode.css("display","block");
//方法二 show()
//winNode.show("slow"); //slow normal fast 可选
//方法三:fadeIn();
//winNode.fadeIn("slow");
//方法四 slideDown
winNode.slideDown(3000);
}
function hide()
{
var winNode = $("#win");
//方法一 修改css
//winNode.css("display","none");
//方法二
//winNode.hide();
//方法三:fadeOut();
//winNode.fadeOut();
winNode.slideUp();
}
7.12
------
2、应用案例2 弹出菜单
A:编写页面:jqueryMenu.html
B:编写css:menu.css
C:编写js:menu.js
完善点1:单击ul节点任何位置都会触发click事件
完善点2:为二级菜单添加连接,单击后将相关页面在类似与iframe中显示
jQuery(function()
//$(document).ready(function()
{
//var uls = $("ul");
var as = $("ul>a");
as.click(function()
{
//取得当前的点击的ul
var ulNode = $(this);
//找到当前ul下所有li子元素集合 toggle() 切换的显示和隐藏
//ulNode.children("li").toggle("slow");
//完善点一 方法一、nextAll() prevAll()所有li兄弟元素
ulNode.nextAll("li").toggle("slow");
//方法二、parent() 父元素
//ulNode.parent().children("li").toggle("slow");
});
//完善点二
//给子菜单绑定click事件
$("li>a").click(function()
{
//load事件不能用于 $(document).ready
//$("#content").load(this.id);
$("#content").load($(this).attr("id"));
});
});
3、应用案例3:编辑文本框
A:编写html页面-jqueryEdit.html
B:编写css:edit.css
逻辑:
1、让这两个td绑定一个click事件
2、获取当前点击的td对象
3、取出当前td的值,存入临时变量
4、清空td的内容
5、创建一个input输入域
6、将临时变量的值赋给input输入域的value值
7、将该input元素插入到当前td中
8、取消绑定到该td上的click事件
完善点1:修改后单击回车键,修改过的值写入td,input消失,重新单击时,又可以进入编辑状态
完善点2:文本框内容高亮显示
jQuery(function()
{
//绑定事件方法
//$("td").click(tdclick);
//可以绑定多个
$("td").bind(
{
click:tdclick
});
//
});
function tdclick()
{
//获取当前对象中的值
var td = $(this);
var text = td.text();
//var len = text.length;
//清空当前对象中的内容
td.empty();
//创建一个input输入域
var input = $("<input>");
//设置
input.attr("value",text);
//给input绑定keyup事件
input.keyup(function(event)
{
//解决多浏览器获取事件的差异
var myEvent = event||window.event;
//判断是否按下回车键
if(myEvent.keyCode == 13)
{
//保存input元素的内容
var value = input.val();
td.html(value);
//重新获取click事件
td.click(tdclick);
}
});
//将input插入到当前td中
input.appendTo(td);
//td.append(input);
//文本框内容高亮显示
input.get(0).select();
//取消绑定的事件
td.unbind("click");
//另一种方法
//td.html("<input value='"+text+"' size='"+len+"' />");
}
---------------
jQuery(function()
{
$("td").click(tdclick);
});
function tdclick()
{
var td = $(this);
var text = td.text();
td.html("<input value='"+text+"'/>");
var input = td.children();
input.keyup(function(event)
{
var e = event||window.event;
if(e.keyCode == 13)
{
var value = input.val();
td.html(value);
td.click(tdclick);
}
});
td.unbind("click");
}
4:jquery综合案例1:模拟股票涨跌功能
A:建立一个封装股票信息对象:Stock.java
B: 编写服务端的servlet:用于返回实时更新的股票信息 GetStockInfo.java
C:配置web.xml
D:编写页面:jqueryStock.html
完善点1:每隔一秒自动刷新指数
完善点2:当前价格低于昨天收盘价,显示绿盘,否则显示红盘
第二部分:
实现当鼠标移到某个链接后,填出窗口,显示该股票的具体信息
A:修改jqueryStock.html,加入弹出窗口div
B:jqueryStock.js----》jqueryStock1.js
C:编写css,修饰该弹出框:stock.css
D:通过js可控制弹出框的位置
E:返回的JSON格式的值是数组或对象的不同处理方式
var obj;
var sid;
jQuery(function(){
//alert(1);
var stockNode=$("#stock");
//隐藏该弹出框
stockNode.hide();
var as=$("a");
as.mouSEOver(function(event){
var aNode=$(this);
//alert(aNode);
var divNode=aNode.parent();
//对象格式
//sid=divNode.attr("id");
//数组格式
sid=divNode.attr("name");
//更新弹出框
updateDIV();
//通过js可控制弹出框的位置
//A:直线移动
//创建该链接的偏移量
//var offset=aNode.offset();
//设置弹出框的left,top
//stockNode.css("left",offset.left+"px")
//.css("top",offset.top+aNode.height()+"px");
//B:平面移动
//FF/IE兼容
var myEvent = event||window.event;
//alert("x:"+myEvent.clientX+"y:"+myEvent.clientY);
stockNode.css("left",myEvent.clientX+5+"px")
.css("top",myEvent.clientY+5+"px");
//显示该弹出框
stockNode.show();
});
as.mouSEOut(function(){
//隐藏该弹出框
stockNode.hide();
});
getInfo();
setInterval(getInfo,1000);
});
function getInfo()
{
$.get("getStockInfo",null,function(data)
{
//data=[{name:"上证指数",yes:2067.2,tod:2056.3,now:2046.71},// {name:"美利纸业",yes:5.12,tod:5.23,now:5.44}]
//将返回的字符串解析成js对象
var obj = eval(data);
//获取该集合中的具体的股票对象(数组格式)
var szzs = obj[0];
var mlzy = obj[1];
//对象格式
//data=
//{
// "000001":{name:"上证指数",now:2051.3},// "000815":{name:"美利纸业",tod:5.32,now:5.34}
}
//var szzs = obj["000001"];
//var mlzy = obj["000815"];
var span1 = $("#000001").children("span");
span1.html(szzs.now);
var span2 = $("#000815").children("span");
span2.html(mlzy.now);
//当前价格低于昨天收盘价,显示绿盘,否则显示红盘
if(szzs.now > szzs.yes)
{
span1.css("color","red");
}
else
{
span1.css("color","green");
}
if(mlzy.now > mlzy.yes)
{
span2.css("color","red");
}
else
{
span2.css("color","green");
}
//更新弹出框
updateDIV();
});
}
//更新弹出框
function updateDIV(){
var stockObj = obj[sid];
//alert(stockObj.name);
for(var proname in stockObj){
//alert(proname);
if(proname !="name"){
//找到div节点
var spanDiv=$("#"+proname).children("span");
spanDiv.html(stockObj[proname]);
//重新设置红绿盘
if(stockObj.now > stockObj.yes){
$("#now").children("span").css("color","red");
}
else{
$("#now").children("span").css("color","green");
}
}
}
}
5、jquery综合案例2:模拟下拉框自动补全功能
A:编写服务端代码:AutoComplete.java
B:配置web.xml
C:配写数据文件:word.xml
D:编写页面:jqueryAutoComplete.html
E:编写js:jqueryAuto.js
F:编写补全框的样式:使用js的css方法
G:增加键盘事件:jqueryAuto.js---》jqueryAuto1.js
//定义一个当前高亮显示的节点的索引号
var highlightindex = -1;
jQuery(function()
{
var timeout; //定时器
var wordInput = $("#word");
//获取该输入框的偏移量
var wordInputOffset = wordInput.offset();
//获取autodiv节点对象
var autoNode = $("#auto");
//将自动提示框先隐藏
autoNode.hide().css("border","1px black solid")
.css("backgroundColor","gray")
.css("position","absolute")
.css("left",wordInputOffset.left+"px")
.css("top",wordInputOffset.top+wordInput.height()+7+"px")
.css("width",wordInput.width()+2+"px");
//.width(wordInput.width()+"px");
wordInput.keyup(function(event)
{
var myEvent = event||window.event;
var code = myEvent.keyCode;
//判断是否是a-z,退格键,delete键
if(code >=65 && code<=90 || code==8 || code ==46)
{
var word = wordInput.val();
//将该值交给ajax引擎请求后台服务器
if(word != "")
{
clearTimeout(timeout);
//服务器请求加上延时,最后一个keyup再发送请求
timeout = setTimeout(function()
{
$.post("autoComplete",function(data)
{
var jqueryObj = $(data);
//找到所有的word节点
var wordNodes = jqueryObj.find("word");
//清空该提示框
autoNode.empty();
wordNodes.each(function()
{
var text = $(this).text();
if(text.indexOf(word) == 0)
{
//$("<div>").html(text).appendTo(autoNode);
$("<div>").text(text).appendTo(autoNode);
}
});
autoNode.show();
});
},500);
}
else
{
autoNode.hide();
}
}
//单独处理向上和向下键
//向上键
else if(code == 38)
{
var autoNodes = autoNode.children("div");
if(highlightindex == -1)
{
//将索引值置为长度-1
highlightindex = autoNodes.length -1;
}
else
{
//将原来的记录背景还原为白色
autoNodes.eq(highlightindex).css("background-color","white");
highlightindex--;
autoNodes.eq(highlightindex).css("background-color","blue");
}
}
else if(code == 40)
{
var autoNodes = autoNode.children("div");
autoNodes.eq(highlightindex).css("background-color","white");
if(highlightindex == autoNodes.length-1)
{
highlightindex = -1;
}
highlightindex++;
autoNodes.eq(highlightindex).css("background-color","blue");
}
else if(code == 13)
{
if(highlightindex >=0 )
{
var autoNodes = autoNode.children("div");
var wordText = autoNodes.eq(highlightindex).text();
wordInput.val(wordText);
autoNode.hide();
highlightindex = -1;
}
else
{
alert(wordInput.val());
wordInput.blur();
}
}
});
//给按钮绑定click事件
$("input[type='button']").click(function()
{
alert(wordInput.val());
});
});
补充
---------
//js中定义一个对象的方法
var obj={name:"mike",age:12};
jquery中的两大特性:链式调用和隐式递归
html() html(val) //匹配第一个元素
text() text(val) //匹配所有的元素
val() val(val) //匹配第一个元素
jquery中的相当于js中的onload方法
//jQuery(function()
$(document).ready(function()
/*让相邻框合并*/
border-collapse: collapse;
$():返回一个空的jQuery对象。
$(html):根据提供的HTML字符串,创建DOM 元素,如:$(“<h1>Hello</h1>")
$(elements):将一个或多个DOM元素转化为jQuery对象,如:$(document.body)
//web.xml中的启动时就加载 1是优先级
<servlet>
<servlet-name>getStockInfo</servlet-name>
<servlet-class>com.itany.servlet.GetStockInfo</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
---------
1、使用第三方jar包提供的方法实现将java对象转成JSON格式字符串
A:test.jsp
B:test.js
C:javabean:Person.java,Address.java
D:编写servlet:DemoServlet.java
E:web.xml
servlet
------
resp.setContentType("text/html;charset=utf-8");
//设置该页面无缓存
resp.setHeader("cache-control","no-cache");
//初始化Person对象
Person p = new Person("xwq","男",24,new Address("江苏省","南京市","浦口区"));
Person p1 = new Person("sj","女",22,"浦口区"));
//将该值存入list集合
List<Person> ps = new ArrayList<Person>();
ps.add(p);
ps.add(p1);
//将该集合转成json数组对象
JSONArray jsonArray = JSONArray.fromObject(ps);
//将sjon数据传给客户端
JSONObject jsonObject = new JSONObject();
jsonObject.put("person",jsonArray);
resp.getWriter().print(jsonObject.toString());
//resp.getWriter().print(JsonUtil.list2json(ps));
js
----
function addPerson()
{
$.ajax(
{
type:"post",url:"demoServlet",dataType:"json",success:function(data)
{
//获取person对象集合
var ps = data.person;
$("#planTable").empty();
$.each(ps,function(i,p)
{
//拷贝行
var row = $("#tr").clone();
//对该行的每个子元素设置
row.find("#name").text(p.name);
row.find("#age").text(p.age);
row.find("#gendar").text(p.gendar);
row.find("#address").text(p.address.province
+p.address.city+p.address.country);
//将该tr追加到table
row.appendTo("#planTable");
});
}
});
}
原文链接:https://www.f2er.com/ajax/165597.html