ajax的HelloWorld会写了,也算是我进门了,慢慢来吧,这次准备写一个tab切换的效果,以前都是页面初次加载,就将所有帧的内容都读出来,然后触发事件,让层显示或者消失就ok。这次想来个ajax版的,也就是页面初次加载只加载第一帧的内容,然后鼠标挪上去切换帧异步读取数据,就这么简单。
程序设计思路:
1,页面初次加载,绑定window.onload事件,异步读取works_0.xml文件中的内容并显示,一帧一个xml文件,帧切换其实就是读取不同的xml文件。
2,鼠标挪上去,触发一个异步请求,读取相应的xml文件
3,解析xml文件内容
4,拼接html字符串
5,使用innerHTML方法显示到指定div中
容易忽略的问题:
1,鼠标挪到当前的标签,就不应该触发请求,应当做个判断
2,每一帧的请求只请求一次,然后将数据保存起来,触发请求前应当判断,如是第一次触发,请求;如是非第一次则不请求,直接将第一次请求保存的结果显示。我是在页面使用了一个hidden,将结果保存到了它的Value值当中,当然也有其他办法,以后再说。
3,加载xml字符串进行处理的时候,IE和FF的方法不一样,应当注意,我在网上搜了一段通用函数用上了^_^
4,好像没有什么了.......
html代码:
view plaincopy to clipboardprint?<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html" charset="utf-8" /> <meta http-equiv="pragma" content="no-cache"> <title>myTino月度优秀会员作品展示</title> <link type="text/css" href="css/reset.css" mce_href="css/reset.css" rel="stylesheet" media="all" /> <link type="text/css" href="css/default.css" mce_href="css/default.css" rel="stylesheet" media="all" /> <!--[if IE 7]> <link type="text/css" href="css/ie7.css" mce_href="css/ie7.css" rel="stylesheet" media="screen" /> <![endif]--> <!--[if IE 6]> <link type="text/css" href="css/ie6.css" mce_href="css/ie6.css" rel="stylesheet" media="screen" /> <![endif]--> <mce:script type="text/javascript" src="js/works.js" mce_src="js/works.js"></mce:script> <?php include_once("../header_index.php");?> <div id="wrap"> <div id="header"></div> <div id="bodyContent"> <div id="tabs" class="clearfix"> <ul> <li class="curTab" οnmοuseοver="changeTab(this,'works_0');"><h2>最近7天优秀作品</h2& gt;</li> <li οnmοuseοver="changeTab(this,'works_1');"><h2>本月度优秀作品</h2></li> <li οnmοuseοver="changeTab(this,'works_2');"><h2>随机推荐作品</h2></li> </ul> </div> <div id="worksContent"> <ul id="works" class="works clearfix"> </ul> </div> </div> <div id="footer"></div> <?php require_once("../../templates/foot.php")?> </div> <input type="hidden" id="works_0" value="" /> <input type="hidden" id="works_1" value="" /> <input type="hidden" id="works_2" value="" /> <?php include_once("../../commonphp/google_analytics.php");?> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html" charset="utf-8" /> <meta http-equiv="pragma" content="no-cache"> <title>myTino月度优秀会员作品展示</title> <link type="text/css" href="css/reset.css" mce_href="css/reset.css" rel="stylesheet" media="all" /> <link type="text/css" href="css/default.css" mce_href="css/default.css" rel="stylesheet" media="all" /> <!--[if IE 7]> <link type="text/css" href="css/ie7.css" mce_href="css/ie7.css" rel="stylesheet" media="screen" /> <![endif]--> <!--[if IE 6]> <link type="text/css" href="css/ie6.css" mce_href="css/ie6.css" rel="stylesheet" media="screen" /> <![endif]--> <mce:script type="text/javascript" src="js/works.js" mce_src="js/works.js"></mce:script> <?php include_once("../header_index.php");?> <div id="wrap"> <div id="header"></div> <div id="bodyContent"> <div id="tabs" class="clearfix"> <ul> <li class="curTab" οnmοuseοver="changeTab(this,'works_0');"><h2>最近7天优秀作品</h2& gt;</li> <li οnmοuseοver="changeTab(this,'works_1');"><h2>本月度优秀作品</h2></li> <li οnmοuseοver="changeTab(this,'works_2');"><h2>随机推荐作品</h2></li> </ul> </div> <div id="worksContent"> <ul id="works" class="works clearfix"> </ul> </div> </div> <div id="footer"></div> <?php require_once("../../templates/foot.php")?> </div> <input type="hidden" id="works_0" value="" /> <input type="hidden" id="works_1" value="" /> <input type="hidden" id="works_2" value="" /> <?php include_once("../../commonphp/google_analytics.php");?> </body></html>
css样式:
view plaincopy to clipboardprint?/* General */ body { text-align:center; background:#F1F1F1; width:980px; } /* layerout*/ #wrap { width:980px; margin:10px auto; text-align:left; } #header { background:url(../images/works_header.gif); height:180px; } #bodyContent { margin-bottom:10px; border:solid 1px #ccc; } .last { margin-right:0; } /* clear both */ .clearfix {display: inline-block;} /* Hides from IE-mac /*/ * html .clearfix {height: 1%;} .clearfix {display: block;} /* End hide from IE-mac */ .clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden } /* End layerout*/ /* @navigation */ #tabs { display:inline-block; } #tabs li { background:url("../images/tab_bg.gif") repeat-x; float:left; width:200px; height:33px; border-left:solid 1px #fff; border-right:solid 1px #cecece; cursor:pointer; } #tabs h2 { height:33px; line-height:33px; text-align:center; } #tabs .curTab { background:#ffffff; border-right:0; font-weight:bold; } /* End navigation */ /* @worksContent */ #worksContent { padding:15px; _padding:10px; background-color:#fff; } #works li { float:left; width:186px; height:134px; margin:5px; _margin:4px; padding:20px; background:url("../images/work_bg.gif"); } #worksContent .works { } /* End worksContent */ /* General */body { text-align:center; background:#F1F1F1; width:980px;}/* layerout*/#wrap { width:980px; margin:10px auto; text-align:left;}#header { background:url(../images/works_header.gif); height:180px;}#bodyContent { margin-bottom:10px; border:solid 1px #ccc;}.last { margin-right:0;}/* clear both */.clearfix {display: inline-block;}/* Hides from IE-mac /*/* html .clearfix {height: 1%;}.clearfix {display: block;}/* End hide from IE-mac */.clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden}/* End layerout*//* @navigation */#tabs { display:inline-block;}#tabs li { background:url("../images/tab_bg.gif") repeat-x; float:left; width:200px; height:33px; border-left:solid 1px #fff; border-right:solid 1px #cecece; cursor:pointer;}#tabs h2 { height:33px; line-height:33px; text-align:center;}#tabs .curTab { background:#ffffff; border-right:0; font-weight:bold;}/* End navigation *//* @worksContent */#worksContent { padding:15px; _padding:10px; background-color:#fff;}#works li { float:left; width:186px; height:134px; margin:5px; _margin:4px; padding:20px; background:url("../images/work_bg.gif");}#worksContent .works { }/* End worksContent */
js代码:
view plaincopy to clipboardprint?/** * @author liuyong */ var xmlHttp; var xmlDoc; var works_0 =''; var works_1 =''; var works_2 =''; //标志变量,存储第一次请求拼好的content_str var divId = ''; function loadXmlStr(strxml){ //兼容IE和FF的加载xml字符串的通用函数 try{ xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.loadXML(strxml); } catch(e){ var oParser=new DOMParser(); xmlDoc=oParser.parseFromString(strxml,"text/xml"); } return xmlDoc; } function createXMLHttpRequest(){ if(window.ActiveXObject){ /*在IE下初始化XMLHttpRequest对象 */ try{ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); //新版本IE }catch(otherMicrosoft){ try{ //较老版本的 Internet Explorer xmlHttp= new ActiveXObject("Microsoft.XMLHTTP"); }catch(failed){ // 还是失败,那么就认为创建失败…… xmlHttp= false; } } }else if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); } if(!xmlHttp){ alert("创建 XMLHttpRequest 对象失败!"); } } function startRequest(fileName){ divId = fileName; createXMLHttpRequest(); try{ if(document.getElementById(fileName).value == '' ){ xmlHttp.onreadystatechange = handleStateChange; xmlHttp.open("GET", "data/" + fileName + ".xml", true); xmlHttp.send(null); }else{ document.getElementById("works").innerHTML = document.getElementById(fileName).value; } }catch(exception){ alert("您要访问的资源不存在!"); } } function handleStateChange(){ if(xmlHttp.readyState == 4){ if (xmlHttp.status == 200 || xmlHttp.status == 0){ // 取得XML的DOM对象 //alert(xmlHttp.responseText); xmlDoc = loadXmlStr(xmlHttp.responseText); // 取得XML文档的根 var root = xmlDoc.documentElement; try { // 取得<works>结果 var works = root.getElementsByTagName('work'); //alert(works.length); var userid; var foldID; var workid; var content_str = ''; //拼好的HTML字符串 for(i = 0;i<works.length;i++){ userid = works[i].getElementsByTagName("userid")[0].firstChild.nodeValue; foldID = works[i].getElementsByTagName("foldID")[0].firstChild.nodeValue; workid = works[i].getElementsByTagName("workid")[0].firstChild.nodeValue; content_str = content_str + '<li><a href="/" mce_href="/""http://www.mytino.com/cn/profile/profile_works_detail.php?workid=' + workid + '&foldID=' + foldID + '&type=2&userid=' + userid + '/" target=/"_blank/"><img src="/" mce_src="/""images/'+workid+'.jpg/" alt=/"/" /></a></li>'; } document.getElementById("works").innerHTML = content_str; document.getElementById(divId).value = content_str; divId = ''; }catch(exception) { alert("异常情况!"); } } }else{ document.getElementById("works").innerHTML = '<img src="/" mce_src="/""images/loading.gif/" />'; } } function changeText(str,element){ if(navigator.appName.indexOf("Explorer") > -1){ document.getElementById(element).innerText = str; }else{ document.getElementById(element).textContent = str; } } var arr_li; function changeTab(arg,con){ arr_li = document.getElementById("tabs").getElementsByTagName("li"); for(var i = 0;i<arr_li.length;i++){ arr_li[i].className = 'none'; } arg.className = 'curTab'; if(arg.className == 'curTab'){ if (con == 'works_0') { startRequest('works_0'); }else if(con == 'works_1'){ startRequest('works_1'); }else if(con == 'works_2'){ startRequest('works_2'); } } } window.onload = function(){ startRequest('works_0'); } /** * @author liuyong */var xmlHttp;var xmlDoc;var works_0 ='';var works_1 ='';var works_2 =''; //标志变量,存储第一次请求拼好的content_strvar divId = '';function loadXmlStr(strxml){ //兼容IE和FF的加载xml字符串的通用函数 try{ xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.loadXML(strxml); } catch(e){ var oParser=new DOMParser(); xmlDoc=oParser.parseFromString(strxml,"text/xml"); } return xmlDoc;}function createXMLHttpRequest(){ if(window.ActiveXObject){ /*在IE下初始化XMLHttpRequest对象 */ try{ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); //新版本IE }catch(otherMicrosoft){ try{ //较老版本的 Internet Explorer xmlHttp= new ActiveXObject("Microsoft.XMLHTTP"); }catch(failed){ // 还是失败,那么就认为创建失败…… xmlHttp= false; } } }else if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); } if(!xmlHttp){ alert("创建 XMLHttpRequest 对象失败!"); }}function startRequest(fileName){ divId = fileName; createXMLHttpRequest(); try{ if(document.getElementById(fileName).value == '' ){ xmlHttp.onreadystatechange = handleStateChange; xmlHttp.open("GET", "data/" + fileName + ".xml", true); xmlHttp.send(null); }else{ document.getElementById("works").innerHTML = document.getElementById(fileName).value; } }catch(exception){ alert("您要访问的资源不存在!"); } }function handleStateChange(){ if(xmlHttp.readyState == 4){ if (xmlHttp.status == 200 || xmlHttp.status == 0){ // 取得XML的DOM对象 //alert(xmlHttp.responseText); xmlDoc = loadXmlStr(xmlHttp.responseText); // 取得XML文档的根 var root = xmlDoc.documentElement; try { // 取得<works>结果 var works = root.getElementsByTagName('work'); //alert(works.length); var userid; var foldID; var workid; var content_str = ''; //拼好的HTML字符串 for(i = 0;i<works.length;i++){ userid = works[i].getElementsByTagName("userid")[0].firstChild.nodeValue; foldID = works[i].getElementsByTagName("foldID")[0].firstChild.nodeValue; workid = works[i].getElementsByTagName("workid")[0].firstChild.nodeValue; content_str = content_str + '<li><a href="/" mce_href="/""http://www.mytino.com/cn/profile/profile_works_detail.php?workid=' + workid + '&foldID=' + foldID + '&type=2&userid=' + userid + '/" target=/"_blank/"><img src="/" mce_src="/""images/'+workid+'.jpg/" alt=/"/" /></a></li>'; } document.getElementById("works").innerHTML = content_str; document.getElementById(divId).value = content_str; divId = ''; }catch(exception) { alert("异常情况!"); } } }else{ document.getElementById("works").innerHTML = '<img src="/" mce_src="/""images/loading.gif/" />'; } }function changeText(str,element){ if(navigator.appName.indexOf("Explorer") > -1){ document.getElementById(element).innerText = str; }else{ document.getElementById(element).textContent = str; }}var arr_li;function changeTab(arg,con){ arr_li = document.getElementById("tabs").getElementsByTagName("li"); for(var i = 0;i<arr_li.length;i++){ arr_li[i].className = 'none'; } arg.className = 'curTab'; if(arg.className == 'curTab'){ if (con == 'works_0') { startRequest('works_0'); }else if(con == 'works_1'){ startRequest('works_1'); }else if(con == 'works_2'){ startRequest('works_2'); } } }window.onload = function(){ startRequest('works_0');}
xml文件:
works_0.xml
<?xml version="1.0" encoding="utf-8"?><root> <work> <userid>97026</userid> <foldID>3893</foldID> <workid>8379</workid> </work> <work> <userid>97026</userid> <foldID>3893</foldID> <workid>8378</workid> </work> <work> <userid>97026</userid> <foldID>3893</foldID> <workid>8374</workid> </work> <work> <userid>97026</userid> <foldID>3893</foldID> <workid>8369</workid> </work> <work> <userid>358611</userid> <foldID>14049</foldID> <workid>33964</workid> </work> <work> <userid>358611</userid> <foldID>14046</foldID> <workid>33960</workid> </work> <work> <userid>358611</userid> <foldID>14046</foldID> <workid>33959</workid> </work> <work> <userid>358542</userid> <foldID>14033</foldID> <workid>33951</workid> </work> </root>
works_1.xml
<?xml version="1.0" encoding="utf-8"?><root> <work> <userid>358457</userid> <foldID>14027</foldID> <workid>33946</workid> </work> <work> <userid>358413</userid> <foldID>14025</foldID> <workid>33936</workid> </work> <work> <userid>358413</userid> <foldID>14025</foldID> <workid>33935</workid> </work> <work> <userid>358413</userid> <foldID>14025</foldID> <workid>33934</workid> </work> <work> <userid>358458</userid> <foldID>14024</foldID> <workid>33931</workid> </work> <work> <userid>233263</userid> <foldID>8049</foldID> <workid>33927</workid> </work> <work> <userid>162003</userid> <foldID>14016</foldID> <workid>33925</workid> </work> <work> <userid>162003</userid> <foldID>14015</foldID> <workid>33919</workid> </work></root>
works_2.xml
<?xml version="1.0" encoding="utf-8"?><root> <work> <userid>358818</userid> <foldID>14082</foldID> <workid>34050</workid> </work> <work> <userid>358818</userid> <foldID>14082</foldID> <workid>34045</workid> </work> <work> <userid>196211</userid> <foldID>5503</foldID> <workid>11983</workid> </work> <work> <userid>92431</userid> <foldID>13756</foldID> <workid>33296</workid> </work> <work> <userid>358704</userid> <foldID>14089</foldID> <workid>34060</workid> </work> <work> <userid>359066</userid> <foldID>14094</foldID> <workid>34070</workid> </work> <work> <userid>358656</userid> <foldID>14061</foldID> <workid>33998</workid> </work> <work> <userid>359206</userid> <foldID>14104</foldID> <workid>34089</workid> </work></root>
本文来自博客,转载请标明出处:http://blog.csdn.net/liuyong0818/archive/2009/04/21/4098062.aspx