-Javascript一直被定位为客户端的脚本语言,应用最多的地方是表单数据校验。
可用通过Javascript操作XMLHttpRequest,来跟数据库打交道。
-DOM(Document Object Model)是提供给HTML和XML使用的一组API,
提供了文件的表述结构,并可用利用它改变其中的内容和可见物。
脚本语言通过DOM才可以跟页面进行交互。
开发人员可操作及建立文件的属性、方法以及事件都以对象来展现。
-XML(Extensible MarkuP Language)可以规范地定义结构化数据,使网上传输的数据和文档符合统一的标准。
用XML表述的数据和文档,可以很容易地让所有程序共享。
-XMLHttpRequest是XMLHTTP组件的对象。
通过这个对象,Ajax可以像桌面应用程序一样,只同服务器进行数据层面的交换,而不用每次都刷新界面,
也不用每次将数据处理的工作都交给服务器来做。
这样既减轻了服务器负担又加快了响应速度、缩短了用户等待的时间。
·XMLHttpRequest对象初始化:
<script language="javascript">
var HTTP_Request=false;
if(window.XMLHttpRequest) { // Mozilla,Safari,...
HTTP_Request = new XMLHttpRequest();
}
else if(window.ActiveXObject) { // IE
HTTP_Request = new ActiveXObject("Microsoft.XMLHTTP");
}
</script>
·XMLHttpRequest对象的方法:
abort() 停止当前请求
getAllResponseHeaders() 作为字符串返回完整的headers
getResponseHeader("headerLable") 作为字符串返回单个的header标签
setRequestHeader("lable","value") 设置header并和请求一起发送
open("method","URL"[,asyncFlag[,"userName"[,"password"]]]) 设置未决的请求目标URL,方法,和其他参数
send(content) 发送请求
·XMLHttpRequest对象的属性:
onreadystatechange 状态改变的事件触发器
readyState 对象状态(integer) 0=未初始化,1=读取中,2=已读取,3=交互中,4=完成
responseText 服务器进程返回数据的文本版本
responseXML 服务器进程返回数据的兼容DOM的XML文档对象
status 服务器返回的状态码,如404=文件未找到,200=成功
statusText 服务器返回的状态文本信息
2.初步的开发框架:
<script language="javascript">
var HTTP_Request = false;
function send_request(url) {//初始化、指定处理函数、发起请求的函数
HTTP_Request = false;
//开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest) { //Mozilla浏览器
HTTP_Request = new XMLHttpRequest();
if (HTTP_Request.overrideMimeType) {//设置MiME类别
HTTP_Request.overrideMimeType("text/xml");
}
}
else if (window.ActiveXObject) { //IE浏览器
try {
HTTP_Request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
HTTP_Request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!HTTP_Request) { //异常,创建对象实例失败
window.alert("不能创建XMLHttpRequest对象实例.");
return false;
}
HTTP_Request.onreadystatechange = processRequest;
//确定发送请求的方式和URL以及是否同步执行下段代码
HTTP_Request.open("GET",url,true);
HTTP_Request.send(null);
}
//处理返回信息的函数
function processRequest() {
if (HTTP_Request.readyState == 4) { //判断对象状态
if (HTTP_Request.status == 200) { //信息已经成功返回,开始处理信息
alert(HTTP_Request.responseText);
} else { //页面不正常
alert("您所请求的页面有异常。");
}
}
}
</script>
3.DOM树的根结点是个Document对象。
·常用Document方法:
createAttribute(),createComment(),createElement(),createTextNode(),getElementById(),getElementsByTagName()
·Element常用属性:
getAttribute(),getAttributeNote(),getElementByTabName(),hasAttribute(),removeAttribute(),removeAttributeNode(),
setAttribute(),setAttributeNode()
·Node对象常用属性:
attributes,childNodes,firstChild,lastChild,nextSibling,nodeName,nodeType,parentNode,prevIoUsSibling,
appendChild(),cloneNode(),hasChildNodes(),insertBefore(),removeChild(),replaceChild()
4.例子
·数据校验 test.htm,sample1_2.htm,
·级联菜单 test.htm,sample2_2.htm
·历遍文档的节点 sample3_1.htm
·修改文档的内容 sample4_1.htm,sample4_2.htm,sample4_3.htm
·往文档添加新内容 sample5_1.htm
·使用DOM操作XML文档 sample6_1.htm,employees.xml
·处理返回的XML sample7_1.htm
5.XML作为一种数据保存、呈现、交互的文档,其数据往往是动态生成的,通常由JavaBean转换过来。
由JavaBean转换成XML文档的方式有多种,常用两种:
1)类自行序列化成XML:
public Element toXml(){
Element employee = new Element("employee");
element.setAttribute("name",name);
Element jobE = new Element("job").addContent(job);
employee.setContent(jobE);
Element salaryE = new Element("salary").addContent(salary);
employee.setContent(salaryE);
return employee;
}
2)页面模板生成XML方式: 【sample8_2.htm】
5.Ajax实际使用例子:
***************************************
var xh = this.getXMLHTTP();
xh.onreadystatechange = function(){
if(xh.readyState==4 && xh.responseText){
opts.load(null,xh.responseText,null);
try{
_ajaxCallback();
}catch(e){};
}
}
xh.open(isPost ? "POST" : "GET",true);
xh.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
xh.send(isPost ? qs : null);
***************************************
××××××××××××××××××××××××××××××××××【例子如下】×××××××××××××××××××××××××××××××××××××××××
test.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <TITLE>Citibank ICC,A - Systems</TITLE> <Meta name="GENERATOR" content="IBM WebSphere Studio"> <TITLE>Citibank ICC - Change Password</TITLE> <SCRIPT language="javascript"> var HTTP_Request = false; function send_request(url) {//初始化、指定处理函数、发起请求的函数 HTTP_Request = false; //开始初始化XMLHttpRequest对象 if(window.XMLHttpRequest) { //Mozilla浏览器 HTTP_Request = new XMLHttpRequest(); if (HTTP_Request.overrideMimeType) {//设置MiME类别 HTTP_Request.overrideMimeType("text/xml"); } } else if (window.ActiveXObject) { //IE浏览器 try { HTTP_Request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { HTTP_Request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!HTTP_Request) { //异常,创建对象实例失败 window.alert("不能创建XMLHttpRequest对象实例."); return false; } HTTP_Request.onreadystatechange = processRequest; //确定发送请求的方式和URL以及是否同步执行下段代码 HTTP_Request.open("GET",true); HTTP_Request.send(null); } //处理返回信息的函数 function processRequest() { if (HTTP_Request.readyState == 4) { //判断对象状态 if (HTTP_Request.status == 200) { //信息已经成功返回,开始处理信息 document.getElementById(currentPos).innerHTML = HTTP_Request.responseText; } else { //页面不正常 alert("您所请求的页面有异常。"); } } } function userCheck(){ var f=document.form1; var username=f.username.value; if(username==""){ alert("User Name can not be empty!"); f.username.focus(); return false; }else{ send_request('C:/Users/FH37580/Desktop/Ajax/sample1_2.jsp?username='+username); } } function showRoles(obj) { document.getElementById(obj).parentNode.style.display = ""; document.getElementById(obj).innerHTML = "正在读取数据..." currentPos = obj; send_request("sample2_2.jsp?playPos="+obj); } </SCRIPT> </HEAD> <BODY> <CENTER> <TABLE WIDTH="450" border="0" cellspacing="0" cellpadding="0"> <form name="form1" action="" method="post"> UserName<input type="text" name="username" value=""> <input type="button" name="check" value="UniquenessChecking" onClick="userCheck()"> <input type="submit" name="submit" value="submit"> </form> </TABLE> <table width="200" border="0" cellspacing="0" cellpadding="0"> <tr> <td height="20"> <a href="javascript:void(0)" onClick="showRoles('pos_1')">经理室</a> </td> </tr> <tr style="display:none"> <td height="20" id="pos_1"> </td> </tr> <tr> <td height="20"> <a href="javascript:void(0)" onClick="showRoles('pos_2')">开发部</a> </td> </tr> <tr style="display:none "> <td id="pos_2" height="20"> </td> </tr> </table> </CENTER> </FORM> </BODY> </HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <TITLE>Citibank ICC,A - Systems</TITLE> <Meta name="GENERATOR" content="IBM WebSphere Studio"> <TITLE>Citibank ICC - Change Password</TITLE> </HEAD> <BODY> <FORM method="post" action="<%=genericServletName%>" name="changePassword" id="changePassword" > <CENTER> <TABLE WIDTH="450" border="0" cellspacing="0" cellpadding="0"> <%@ page contentType="text/html;charset=utf-8" errorPage="" %> <% String username = request.getParameter("username"); if("huangfei".equals(username)){ out.print("用户名已经被注册,请更换一个用户名。"); }else{ out.print("用户名尚未被使用,您可以继续。"); } %> </TABLE> </CENTER> </FORM> </BODY> </HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> </HEAD> <BODY> <FORM method="post" action="<%=genericServletName%>" name="changePassword" id="changePassword" > <CENTER> <TABLE WIDTH="450" border="0" cellspacing="0" cellpadding="0"> <%@ page contentType="text/html; charset=gb2312" errorPage="" %> <% String playPos = request.getParameter("playPos"); if("pos_1".equals(playPos)) out.print(" 总经理<br> 副总经理"); else if("pos_2".equals(playPos)) out.println(" 总工程师<br> 软件工程师"); %> </TABLE> </CENTER> </FORM> </BODY> </HTML>
<html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题</title> <script language="javascript"> var elementName = ""; //全局变量,保存Element标记名,使用完毕要清空 function countTotalElement(node) { //参数node是一个Node对象 var total = 0; if(node.nodeType == 1) { //检查node是否为Element对象 alert(node.tagName); totaL++; //如果是,计数器加1 elementName = elementName + node.tagName + "\r\n"; //保存标记名 } var childrens = node.childNodes; //获取node的全部子节点 for(var i=0;i<childrens.length;i++) { total += countTotalElement(childrens[i]); //在每个子节点上进行递归操作 } return total; } </script> </head> <body> <a href="javascript:void(0)" onClick="alert('标记总数:'+countTotalElement(document) + '\r\n' + '全部标记如下:' + '\r\n' + elementName)">开始统计</a> <JMK><CBA></CBA></JMK> </body> </html>
<html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>Not Title</title> <script language="javascript"> function reverseNode(node) { //颠倒节点node的顺序 var children = node.childNodes; //获取子节点列表 var childrenNum = children.length; for(var i=childrenNum-1;i>=0;i--) { //逆向历遍子节点列表 var c = node.removeChild(children[i]); //删除指定子节点,保存在c中 node.appendChild(c); //将c放在新位置上 } } </script> </head> <body> <p>第一行</p> <p>第二行</p> <p>第三行</p> <p><input type="button" name="reverseGo" value="颠倒" onClick="reverseNode(document.body)"></p> </body> </html>
<html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题</title> <script language="javascript"> function reverseTable() { var node = document.getElementsByTagName("table")[0]; //第一个表格 var child = node.getElementsByTagName("tr"); //取得表格内的所有行 var newChild = new Array(); //定义缓存数组,保存行内容 for(var i=0;i<child.length;i++) { newChild[i] = child[i].firstChild.innerHTML; } node.removeChild(node.childNodes[0]); //删除全部单元 var header = node.createTHead(); //新建表格行头 for(var i=0;i<newChild.length;i++) { var headerrow = header.insertRow(i); //插入一个单元行 var cell = headerrow.insertCell(0); //在单元行中插入一个单元格 //在单元格中创建TextNode节点 cell.appendChild(document.createTextNode(newChild[newChild.length-i-1])); } } </script> </head> <body> <table width="200" border="1" cellpadding="4" cellspacing="0"> <tr> <td height="25">第一行</td> </tr> <tr> <td height="25">第二行</td> </tr> <tr> <td height="25">第三行</td> </tr> <tr> <td height="25">第四行</td> </tr> </table> <br> <input type="button" name="reverse" value="开始颠倒" onClick="reverseTable()"> </body> </html>
<html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>No Title</title> <script language="javascript"> function replaceContent() { document.getElementById("replaceNode").setAttribute("disabled",true); var table1 = document.getElementsByTagName("table")[0]; var table2 = document.getElementsByTagName("table")[1]; var child1 = table1.firstChild.firstChild.firstChild; //定位到<td>节点 table->tbody->tr->td var child2 = table2.firstChild.firstChild.firstChild; //定位到<td>节点 table->tbody->tr->td var tempChild = child2.firstChild; //定位到表格二<td>内含的TextNode节点 try { //用表格二的单元格内容替换表格一的单元格内容, 表格二变成没有单元格 child1.replaceChild(tempChild,child1.firstChild); //替换的内容在前,被替换的内容在后 //执行后,table2的子节点已经被转移到table1了,table2已经没有子节点,不能再调用table2的子节点。 }catch(e){ alert(e); } } </script> </head> <body> <table width="200" border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td>表格一</td> </tr> </tbody> </table> <br> <table width="200" border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td>表格二</td> </tr> </tbody> </table> <br> <input id="replaceNode" type="button" name="replaceNode" value="替换" onClick="replaceContent()"> </body> </html>
<html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>No Title</title> <script language="javascript"> function insertstr() { var f = document.form1; var value = f.str.value; if(value!="") { //从最终的TextNode节点开始,慢慢形成<tbody>结构 var text = document.createTextNode(value); //新建一个TextNode节点 var td = document.createElement("td"); //新建一个td类型的Element节点 var tr = document.createElement("tr"); //新建一个tr类型的Element节点 var tbody = document.createElement("tbody"); //新建一个tbody类型的Element节点 td.appendChild(text); //将节点text加入tr中 tr.appendChild(td); //将节点td加入tr中 tbody.appendChild(tr); //将节点加入tbody中 var parNode = document.getElementById("table1"); //定位到table上 parNode.insertBefore(tbody,parNode.firstChild); //将节点tbody插入到节点顶部 //parNode.appendChild(tbody); //将节点tbody加入节点尾部 } } </script> </head> <body> <form name="form1" method="post" action=""> <input name="str" type="text" id="str" value=""> <input name="insert" type="button" id="insert" value="留言" onClick="insertstr()"> </form> <table width="400" border="1" cellspacing="0" cellpadding="0" id="table1"> <tbody> <tr> <td height="25">网友留言列表</td> </tr> </tbody> </table> </body> </html>
<html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>No Title</title> <script language="javascript"> function loadXML(handler) { var url = "employees.xml"; if(document.implementation&&document.implementation.createDocument) { var xmldoc = document.implementation.createDocument("","",null); xmldoc.onload = handler(xmldoc,url); xmldoc.load(url); } else if(window.ActiveXObject) { var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); xmldoc.onreadystatechange = function() { if(xmldoc.readyState == 4) handler(xmldoc,url); } xmldoc.load(url); } } function makeTable(xmldoc,url) { var table = document.createElement("table"); table.setAttribute("border","1"); table.setAttribute("width","600"); table.setAttribute("class","tab-content"); document.body.appendChild(table); var caption = "Employee Data from " + url; table.createCaption().appendChild(document.createTextNode(caption)); var header = table.createTHead(); var headerrow = header.insertRow(0); headerrow.insertCell(0).appendChild(document.createTextNode("姓名")); headerrow.insertCell(1).appendChild(document.createTextNode("职业")); headerrow.insertCell(2).appendChild(document.createTextNode("工资")); var employees = xmldoc.getElementsByTagName("employee"); for(var i=0;i<employees.length;i++) { var e = employees[i]; var name = e.getAttribute("name"); var job = e.getElementsByTagName("job")[0].firstChild.data; var salary = e.getElementsByTagName("salary")[0].firstChild.data; var row = table.insertRow(i+1); row.insertCell(0).appendChild(document.createTextNode(name)); row.insertCell(1).appendChild(document.createTextNode(job)); row.insertCell(2).appendChild(document.createTextNode(salary)); } } </script> <link href="css/style.css" rel="stylesheet" type="text/css"> </head> <body onLoad="loadXML(makeTable)"> </body> </html>
<?xml version="1.0" encoding="utf-8"?> <employees> <employee name="J.Doe"> <job>Programmer</job> <salary>32768</salary> </employee> <employee name="A.Baker"> <job>Sales</job> <salary>70000</salary> </employee> <employee name="Big Cheese"> <job>CEO</job> <salary>100000</salary> </employee> </employees>
<html> <head> <Meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>No Title</title> <SCRIPT language="javascript"> var HTTP_Request = false; function send_request(url) {//初始化、指定处理函数、发起请求的函数 HTTP_Request = false; //开始初始化XMLHttpRequest对象 if(window.XMLHttpRequest) { //Mozilla浏览器 HTTP_Request = new XMLHttpRequest(); if (HTTP_Request.overrideMimeType) {//设置MiME类别 HTTP_Request.overrideMimeType("text/xml"); } } else if (window.ActiveXObject) { //IE浏览器 try { HTTP_Request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { HTTP_Request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!HTTP_Request) { //异常,创建对象实例失败 window.alert("不能创建XMLHttpRequest对象实例."); return false; } HTTP_Request.onreadystatechange = processRequest; //确定发送请求的方式和URL以及是否同步执行下段代码 HTTP_Request.open("GET",true); HTTP_Request.send(null); } //处理返回信息的函数 function processRequest() { if (HTTP_Request.readyState == 4) { //判断对象状态 if (HTTP_Request.status == 200) { //信息已经成功返回,开始处理信息 var returnObj = HTTP_Request.responseXML; var xmlobj = HTTP_Request.responseXML; var employees = xmlobj.getElementsByTagName("employee"); var FeedbackStr = ""; for(var i=0;i<employees.length;i++) { //循环读取employees.xml的内容 var employee = employees[i]; FeedbackStr += "员工:" + employee.getAttribute("name"); FeedbackStr += "职位:" + employee.getElementsByTagName("job")[0].firstChild.data; FeedbackStr += "工资:" + employee.getElementsByTagName("salary")[0].firstChild.data; FeedbackStr += "\r\n"; } alert(FeedbackStr); } else { //页面不正常 alert("您所请求的页面有异常。"); } } } </SCRIPT> </head> <body> <input type="button" name="read" value="读取XML" onClick="send_request('C:/Users/FH37580/Desktop/Ajax/employees.xml')"> </body> </html>
<html> <head> </head> <body> <%@ page contentType="application/xml; charset=gb2312" import="Employee"%> <%@ page import="java.util.Collection,java.util.ArrayList"%> <?xml version="1.0"?> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%> <% Employee em1 = new Employee(); em1.setName("J.Doe"); em1.setJob("Programmer"); em1.setSalary("32768"); Employee em2 = new Employee(); em2.setName("A.Baker"); em2.setJob("Sales"); em2.setSalary("70000"); Employee em3 = new Employee(); em3.setName("Big Cheese"); em3.setJob("CEO"); em3.setSalary("100000"); Collection employees = new ArrayList(); employees.add(em1); employees.add(em2); employees.add(em3); pageContext.setAttribute("employees",employees); %> <employees> <logic:iterate name="employees" id="employee"> <employee name="<bean:write name='employee' property='name'/>"> <job><bean:write name="employee" property="job"/></job> <salary><bean:write name="employee" property="salary"/></salary> </employee> </logic:iterate> </employees> </body> </html>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。