用 ajax寫一個

創(chuàng)新互聯(lián)建站專注于紅古網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供紅古營銷型網(wǎng)站建設(shè),紅古網(wǎng)站制作、紅古網(wǎng)頁設(shè)計、紅古網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造紅古網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供紅古網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
script language="javascript" type="text/javascript"
var xmlrequest=null;
function createXMLHttpRequest()
{
if(window.XMLHttpRequest)
{
//針對IE以外的其他瀏覽器創(chuàng)建的 主要是FireFox
xmlrequest=new XMLHttpRequest();
}else if(window.ActiveXObject)
{
//主要針對IE瀏覽器的不同版本
try{
xmlrequest=new ActiveXObject("Msxml2.XMLHTTP");
}catch(e)
{
try{
xmlrequest=new ActiveXObject("Microsoft.XMLHTTP");
}catch(e)
{
}
}
}
}
function showCity()
{
createXMLHttpRequest();
var url="showCity.do";
var parentid=document.getElementById("province").value;
xmlrequest.open("post",url,true);//創(chuàng)建連接
//設(shè)置頭信息,告訴服務(wù)器如何識別請求數(shù)據(jù)
xmlrequest.setRequestHeader( "Content-Type" , "application/x-www-form-urlencoded" );
//設(shè)置響應(yīng)處理的回調(diào)函數(shù) 所謂的回調(diào)函數(shù) 就是一個專門處理服務(wù)器發(fā)回響應(yīng)的函數(shù)
//這個值只能是一個函數(shù)名 不能加上()
xmlrequest.onreadystatechange=processResponse;
//調(diào)用send方法開始發(fā)送數(shù)據(jù)
xmlrequest.send("parentid="+parentid);
}
function processResponse()
{
//readyState=1時:開始發(fā)送請求
//readyState=2時:對象請求發(fā)送完成
//readyState=3時:開始讀取服務(wù)器響應(yīng)
//readyState=4時:對象讀取服務(wù)器響應(yīng)結(jié)束
if(xmlrequest.readyState==4)//調(diào)用xmlrequest的readyState方法得到服務(wù)器發(fā)回的響應(yīng)結(jié)果
{
if(xmlrequest.status==200)
{
var userdiv=document.getElementById("cityDIV");
userdiv.innerHTML=xmlrequest.responseText;//查詢成功返回servlet的out內(nèi)容.
}
}else
{
var userdiv=document.getElementById("cityDIV");
userdiv.innerHTML="img src='image/1.gif'/";//查詢受阻時顯示等待gif動畫
}
}
/script
下面是放在body里面的
select id="province" onchange="showCity()"
option value="1"浙江/option
option value="2"湖南/option
option value="3"湖北/option
/select
div id="cityDIV"
/div
最后寫一個showCity.do的servlet用來調(diào)用數(shù)據(jù)
servlet:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
String parentid=request.getParameter("parentid");//得到j(luò)sp頁面?zhèn)鬏斶^來您所選的省的參數(shù)
ListArea list=new AreaDao().getCity(Integer.parseInt(parentid));
//getCity()是通過傳入省參數(shù)返回一個裝有該省下所有城市列表的list集合
PrintWriter out = response.getWriter();
//以下拉框代碼輸出城市
out.println("select name='city' ");
for(int i=0;ilist.size();i++){
Area area=list.get(i);
out.println("option value='"+area.getId()+"'"+area.getName()+"/option");
}
out.println("/select ");
out.close();
}
總體思路就是如果你選擇第一個province(省)的下拉框 會觸發(fā)一個onchange的事件 然后我們將此事件觸發(fā)后 調(diào)用showCity()這個方法
執(zhí)行 ajax調(diào)用 servlet幫助查找選擇的省下面的對應(yīng)城市數(shù)據(jù),然后返回數(shù)據(jù)后,放入ID="cityDIV"的層中顯示.
大概是這樣的 如果樓主還有什么不明白的 可以找我討論討論
這個是目前在網(wǎng)站中比較流行的技術(shù) 如果樓主要簡單明了的作業(yè)js樹 那給我百度消息
!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""
head
meta http-equiv="Content-Type" content="text/html; charset=utf-8"
meta name="author" content="心夢緣ocean ocl" /
titleMy tree demo/title
style type="text/css"
/*主頁面樣式*/
.leftNav {
? width: 20%;
? height:500px;
? border:#B9E0F7 1px solid;
? margin-left: 1%;
? margin-right: 1%;
}
#footer {
color:#808080;
line-height: 1.6em;
padding: 0 0 1em 0;
}
/*我的樹樣式表*/
.treeDiv {
color: #636363;
font-size: 14px;
font-weight: normal;
background-color: #fff;
color: black;
overflow: auto;
padding: 0 0 1em 0;
overflow-x: hidden;
}
.treeNode {
white-space: nowrap;
text-indent: -14px;
margin: 6px 2px 5px 14px;
}
a.treeUnselected:hover, a.treeSelected:hover {
background-color: #BFD9ED;
text-decoration: none;
}
a.treeUnselected, a.treeSelected {
color: black;
padding: 1px 3px 1px 0;
text-decoration: none;
}
a.treeSelected {
background-color: #B9E0F7;
}
a.treeUnselected {
background-color: transparent;
}
.treeSubnodes {
display: block;
}
.treeSubnodesHidden {
display: none;
}
.treeNode img.treeNoLinkImage, .treeNode img.treeLinkImage {
height: 15px;
margin-left: 5px;
margin-right: 0px;
width: 15px;
}
.treeNode img.treeLinkImage {
cursor: pointer;
}
div.treeNode a, div.treeNode span.apiRoot {
display: inline-block;
margin-left: 24px;
text-indent: 0;
white-space: normal;
width: 95%;
word-wrap: break-word;
}
div.treeNode span.category {
cursor: pointer;
}
/style
/head
body
div class="leftNav"
div id="samplesToc"
? div id="tree" style="top: 35px; left: 0px;" class="treeDiv"
? ? div id="treeRoot" onselectstart="return false" ondragstart="return false"
? ? ? div class="treeNode"
? ? ? ? img src="../graphics/treenodeplus.gif" onclick="expandCollapse(this.parentNode)" class="treeLinkImage"
? ? ? ? span onclick="expandCollapse(this.parentNode)" class="category"目錄節(jié)點一 /span
? ? ? ? div class="treeSubnodesHidden"
? ? ? ? ?
? ? ? ? ? ? div class="treeNode"
? ? ? ? ? ? ? ? ?img src="../graphics/treenodeplus.gif" onclick="expandCollapse(this.parentNode)" class="treeLinkImage"
? ? ? ? ? ? ? ? ?span onclick="expandCollapse(this.parentNode)" class="category"目錄節(jié)點一子目錄 /span
? ? ? ? ? ? ? ? ?div class="treeSubnodesHidden"
? ? ? ? ? ? ? ? ? ? ?div class="treeNode"
? ? ? ? ? ? ? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"二級葉子結(jié)點一/a
? ? ? ? ? ? ? ? ? /div
? ? ? ? ? ? ? ? ? div class="treeNode"
? ? ? ? ? ? ? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"二級葉子結(jié)點二/a
? ? ? ? ? ? ? ? ? /div
? ? ? ? ? ? ? /div
? ? ? ? ? ? /div
? ? ? ? ?
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點一/a
? ? ? ? ? /div
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點二/a
? ? ? ? ? /div
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點三/a
? ? ? ? ? /div
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點四/a
? ? ? ? ? /div
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點五/a
? ? ? ? ? /div
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點六/a
? ? ? ? ? /div
? ? ? ? /div
? ? ? /div
? ? ? !--end block--
? ? ? div class="treeNode"
? ? ? ? img src="../graphics/treenodeplus.gif" onclick="expandCollapse(this.parentNode)" class="treeLinkImage"
? ? ? ? span onclick="expandCollapse(this.parentNode)" class="category"目錄節(jié)點二/span
? ? ? ? div class="treeSubnodesHidden"
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點一/a
? ? ? ? ? /div
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點二/a
? ? ? ? ? /div
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點三/a
? ? ? ? ? /div
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點四/a
? ? ? ? ? /div
? ? ? ? ? div class="treeNode"
? ? ? ? ? ? a href="#" class="treeUnselected" onclick="clickAnchor(this)"葉子結(jié)點五/a
? ? ? ? ? /div
? ? ? ? /div
? ? ? /div
? ? ? !--end block--
? ? /div
? /div
/div !-- end samplesToc --
/div !-- end leftNav --
div class="right content"
/div!-- end main ?content--
div id="footer" align="center"
?
/div!-- end footer--
script type="text/javascript"
var treeSelected = null;//選中的樹節(jié)點
var imgPlus = new Image();
imgPlus.src="../graphics/treenodeplus.gif";
var imgMinus = new Image();
imgMinus.src="../graphics/treenodeminus.gif";
//父節(jié)點展開事件
function expandCollapse(el)
{
//如果父節(jié)點有字節(jié)點(class 屬性為treeSubnodesHidden),展開所有子節(jié)點
if (el.className!= "treeNode"){
? return; ? ?//判斷父節(jié)點是否為一個樹節(jié)點,如果樹節(jié)點不能展開,請檢查是否節(jié)點的class屬性是否為treeNode
} ?
var child;
var imgEl;//圖片子節(jié)點,在樹展開時更換圖片
for(var i=0; i el.childNodes.length; i++)
{
? child = el.childNodes[i];
? if (child.src)
? {
? ? ? imgEl = child;
? }
? else if (child.className == "treeSubnodesHidden")
? {
? ? ? child.className = "treeSubnodes";//原來若隱藏,則展開
? ? ? imgEl.src = imgMinus.src;//更換圖片
? ? ? break;
? }
? else if (child.className == "treeSubnodes")
? {
? ? ? child.className = "treeSubnodesHidden";//原來若展開,則隱藏
? ? ? imgEl.src = imgPlus.src;//更換圖片
? ? ? break;
? }
}
}
//子節(jié)點點擊事件,設(shè)置選中節(jié)點的樣式
function clickAnchor(el)
{
selectNode(el.parentNode);
el.blur();
}
function selectNode(el)
{
if (treeSelected != null)
{
? setSubNodeClass(treeSelected, 'A', 'treeUnselected');
}
setSubNodeClass(el, 'A', 'treeSelected');
treeSelected = el;
}
function setSubNodeClass(el, nodeName, className)
{
var child;
for (var i=0; i el.childNodes.length; i++)
{
? child = el.childNodes[i];
? if (child.nodeName == nodeName)
? {
? ? ? child.className = className;
? ? ? break;
? }
}
}
/script
/body
/html
運行效果:
title: JS樹結(jié)構(gòu)數(shù)據(jù)的遍歷
date: 2022-04-14
description: 針對項目中出現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)的時候,我們怎樣去操作他
項目中我們會經(jīng)常出現(xiàn)對樹形結(jié)構(gòu)的遍歷、查找和轉(zhuǎn)換的場景,比如說DOM樹、族譜、社會機構(gòu)、組織架構(gòu)、權(quán)限、菜單、省市區(qū)、路由、標(biāo)簽等等。那針對這些場景和數(shù)據(jù),我們又如何去遍歷和操作,有什么方式或者技巧可以簡化我們的實現(xiàn)思路。下面我們將針對常規(guī)出現(xiàn)的場景去總結(jié)一下我們的遍歷方式
樹的特點
1、每個節(jié)點都只有有限個子節(jié)點或無子節(jié)點;
2、沒有父節(jié)點的節(jié)點稱為根節(jié)點;
3、每一個非根節(jié)點有且只有一個父節(jié)點;
4、除了根節(jié)點外,每個子節(jié)點可以分為多個不相交的子樹;
5、樹里面沒有環(huán)路
下面的圖片表示一顆樹
在下面的JS中我們由多棵樹組成我們的數(shù)據(jù)
在這數(shù)據(jù)中我們?nèi)绾卧u判數(shù)據(jù)是否為葉節(jié)點(也就是最后一級),我們每個節(jié)點都會存在children屬性,如果不存在children屬性或者children不是一個數(shù)組或者children為數(shù)組且長度為0我們則認(rèn)為他是一個葉節(jié)點
我們針對樹結(jié)構(gòu)的操作離不開遍歷,遍歷的話又分為廣度優(yōu)先遍歷、深度優(yōu)先遍歷。其中深度優(yōu)先遍歷可以通過遞歸和循環(huán)的方式實現(xiàn),而廣度優(yōu)先遍歷的話是非遞歸的
從上往下對每一層依次訪問,在每一層中,從左往右(也可以從右往左)訪問結(jié)點,訪問完一層就進入下一層,直到?jīng)]有結(jié)點可以訪問為止。即訪問樹結(jié)構(gòu)的第n+1層前必須先訪問完第n層。
簡單的說,BFS是從根節(jié)點開始,沿著樹的寬度遍歷樹的節(jié)點。如果所有節(jié)點均被訪問,則算法中止。
所以我們的實現(xiàn)思路是,維護一個隊列,隊列的初始值為樹結(jié)構(gòu)根節(jié)點組成的列表,重復(fù)執(zhí)行以下步驟直到隊列為空:
取出隊列中的第一個元素,進行訪問相關(guān)操作,然后將其后代元素(如果有)全部追加到隊列最后。
深度優(yōu)先搜索算法(英語:Depth-First-Search,DFS)是一種用于遍歷或搜索樹或圖的算法。這個算法會盡可能深的搜索樹的分支。當(dāng)節(jié)點v的所在邊都己被探尋過,搜索將回溯到發(fā)現(xiàn)節(jié)點v的那條邊的起始節(jié)點。這一過程一直進行到已發(fā)現(xiàn)從源節(jié)點可達(dá)的所有節(jié)點為止。如果還存在未被發(fā)現(xiàn)的節(jié)點,則選擇其中一個作為源節(jié)點并重復(fù)以上過程,整個進程反復(fù)進行直到所有節(jié)點都被訪問為止
1、先序遍歷
訪問子樹的時候,先訪問根再訪問根的子樹
2、后序遍歷
訪問子樹的時候,先訪問子樹再訪問根
1、先序遍歷
先序遍歷與廣度優(yōu)先循環(huán)實現(xiàn)類似,要維護一個隊列,不同的是子節(jié)點不追加到隊列最后,而是加到隊列最前面
2、后序遍歷
后序遍歷就略微復(fù)雜一點,我們需要不斷將子樹擴展到根節(jié)點前面去,執(zhí)行列表遍歷,并且通過一個臨時對象維護一個id列表,當(dāng)遍歷到某個節(jié)點如果它沒有子節(jié)點或者它本身已經(jīng)存在于我們的臨時id列表,則執(zhí)行訪問操作,否則繼續(xù)擴展子節(jié)點到當(dāng)前節(jié)點前面
對于樹結(jié)構(gòu)的遍歷操作,其實遞歸是最基礎(chǔ),也是最容易理解的。遞歸本身就是循環(huán)的思想,所以可以用循環(huán)來改寫遞歸,以上的方式在項目中已經(jīng)廊括了大部分的場景了,我們在日常開發(fā)中可以根據(jù)場景或者需要去選擇我們的遍歷方式,或者基于此對他進行調(diào)整和優(yōu)化,至于每種方式的空間復(fù)雜度和時間復(fù)雜度我們在這個地方就不去嘗試了,各位感興趣可以自己去驗證。
廣度優(yōu)先搜索
樹的遍歷
深度優(yōu)先搜索
圖文詳解兩種算法:深度優(yōu)先遍歷(DFS)和廣度優(yōu)先遍歷(BFS)
二叉樹遍歷(前序,后序,中序,層次)遞歸與迭代實現(xiàn)JavaScript
JS樹結(jié)構(gòu)操作:查找、遍歷、篩選、樹和列表相互轉(zhuǎn)換
var arr=[];
var fun = function(arr, key){
var result = [];
for(var i=0;iarr.length;i++) result.push(arr[i][key]);
return result;
}
//diaoyong
var result = fun(arr,"treeId");
console.log(result);
1、javascript 獲取 Dom 樹比較簡單。直接獲取document 文檔對象就可以了,或者也可以直接從具體的控件對象進行獲取。
2、比較困難的是如何獲取之前舊的dom 樹對象。常見的思路是可以設(shè)置一個全局的數(shù)組變量保存之前的dom樹對象,注意此對象保存的只是引用,你做變更,之前保存的對象也是變的,因為兩者本來就是同一個對象。所以你要保存的必須是dom樹的復(fù)制對象,也就是所謂的深拷貝對象,這個是有點復(fù)雜度的,節(jié)點如果復(fù)雜的話,容易出現(xiàn)問題,要注意處理。
3、希望對你有幫助。
網(wǎng)頁名稱:樹javascript的簡單介紹
當(dāng)前路徑:http://chinadenli.net/article14/dsgdjde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、網(wǎng)站改版、品牌網(wǎng)站設(shè)計、域名注冊、網(wǎng)站策劃、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)