用ajax和JQuery TreeView 编一个动态的树形结构

最近在做一个项目,就是在老的版本上添加和修改功能。
技术支持:jdk1.4,struts1.0,ibatis2.0,PSQL,javascript,jquery。
我的做的一小部分是将一个表型结构的数据集合,变成一个树形结构的显示出来。经过调查JQuery TreeView可以实现。刚开始做的时候是以一种静态树显示出来。由于自己小组做的数据库的数据太少(拼成字符串340K),显示出来是没问题的。但是到了客户给的数据(拼成字符串12M)时就内存溢出,那个悲剧啊。后来只能重新调查,发现JQuery TreeView还是可以支持动态树的,但是按照网上所说的方法去做,怎么试也试不出来,郁闷 :cry: ;迫不得已,只能自己动手了。直接上代码吧。


<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/tld/biosam.tld" prefix="biosam"%>
<%@ taglib uri="/WEB-INF/tld/struts-logic.tld" prefix="logic"%>
<link rel="stylesheet" type="text/css" href="css/jquery.treeview.css">
<script language="javascript" type="text/javascript" src="js/jquery.numeric.js"></script>
<script type="text/javascript" language="javascript" src="js/jquery.treeview.js"></script>
<script type="text/javascript">
//JQuery树的展现
$(document).ready(function(){
$("#black").treeview({});
});
//通过ajax调用到后台得到树的节点
function getTreeNode(taxonId) {
var xmlHttp;
var getTreeNodeUrl = 'treeSource.do?taxonId='+taxonId;
var ulId ='ul' + taxonId.substring(2);
try {
// Firefox, Opera 8.0+, Safari
xmlHttp = new XMLHttpRequest();
} catch (e){
// Internet Explorer
try {
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e) {
try {
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}catch(e) {
return false;
}
}
}
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState == 4 && xmlHttp.responseXML) {
//通过ajax得到数据变成xml标签
var searchResult = xmlHttp.responseXML;
var treeList = searchResult.getElementsByTagName('node');
//得到想要的数据并拼成显示的字符串
if(treeList.length != 0) {
for(var i=0 ; i<treeList.length ; i++) {
var treeStr = '';
var tree = treeList.item(i);
var eltaxonId = tree.getElementsByTagName('taxonID');
var taxonId = eltaxonId.item(0).firstChild.nodeValue.trim();
var eltaxonText = tree.getElementsByTagName('taxonText');
var taxonText = eltaxonText.item(0).firstChild.nodeValue.trim();
var elchilds = tree.getElementsByTagName('taxonSubCount');
var childs = elchilds.item(0).firstChild.nodeValue.trim();
var elsearchStr = tree.getElementsByTagName('taxonSearchStr');
var searchStr = elsearchStr.item(0).firstChild.nodeValue.trim();
treeStr = treeStr + "<li class='closed' ";
treeStr = treeStr + "id='li" + taxonId + "' value='0' ";
if(childs > 0) {
treeStr = treeStr + "onclick='checkTreeNode(this)' >";
} else {
treeStr = treeStr + ">";
}
treeStr = treeStr + "<span onclick='changeColor(this)' id='span";
treeStr = treeStr + taxonId + "' value='0'>";
treeStr = treeStr + "<a style='text-decoration:none' onclick=\"";
treeStr = treeStr + "doSel(this,'" + searchStr + "')\" ";
treeStr = treeStr + "id='a" + taxonId + "' >";
treeStr = treeStr + taxonText;
if(childs > 0) {
treeStr = treeStr + " [" + childs + " Records]";
treeStr = treeStr + "</a>";
treeStr = treeStr + "</span>";
treeStr = treeStr +"<ul id='ul" + taxonId + "'></ul>";
} else {
treeStr = treeStr + "</a>";
treeStr = treeStr + "</span>";
}
treeStr = treeStr + "</li>";

var branches = $(treeStr).appendTo("#"+ulId);
//刷新树
$("#black").treeview({
add: branches
});
}
}

}
}
xmlHttp.open("POST",getTreeNodeUrl,true);
xmlHttp.send(null);
}
//树节点作为检索条件,传入字符串
function doSel(curObj,selectStr){
document.getElementById('treeTaxon').value = selectStr;
if(document.getElementById('selectstr').value == '') {
document.getElementById('selectstr').value = curObj.id;
}else {
if(document.getElementById('selectstr').value == curObj.id){
document.getElementById('treeTaxon').value = "";
document.getElementById('selectstr').value = '';
}else{
document.getElementById('selectstr').value = curObj.id;
}
}
}

//选中时候的颜色变化
function changeColor(thisO){
var taxId = document.getElementById('spanId').value;
if(taxId.length > 0){
document.getElementById(taxId).style.background="";
}
document.getElementById('spanId').value = thisO.id;
document.getElementById(thisO.id).style.background="#D6DFF7";

if(document.getElementById('color').value == '') {
document.getElementById('color').value = thisO.id;
}else {
if(document.getElementById('color').value == thisO.id){
thisO.style.background = "";
document.getElementById('color').value = '';
}else{
document.getElementById('color').value = thisO.id;
}
}
}
//判断是否已经点过这个节点,防止不断的追加已经存在的节点
function checkTreeNode(thisObj) {
var liId = thisObj.id;
var doFlag = document.getElementById(liId).value;
if(doFlag == '0') {
getTreeNode(liId);
document.getElementById(liId).value = '1';
}
}
</script>

<h3 class="section2" id="treeViewHref" style="width: 860px;">
<img alt="" src="image/open.png" id="treeViewDtlButton" onclick="expansion('treeViewDtl','treeViewDtlButton');">Taxonomy Tree
</h3>

<div id="treeViewDtl" style="width:900px;overflow:scroll;height:300px;overflow:scroll;display: none;">
<div id="main">
<ul id="black" class="treeview-black">
<bean:write property="data.treeString" name="SampleSearchForm" filter="false"/>
</ul>
</div>
</div>
<input type="hidden" id="selectstr" value="">
<input type="hidden" id="color" value="">
<html:hidden name="SampleSearchForm" property ="data.treeString" styleId="data.treeString"/>
<html:hidden property="data.treeTaxon" styleId="treeTaxon" name="SampleSearchForm"/>
<html:hidden property="data.spanId" styleId="spanId" name="SampleSearchForm"/>


后台的代码如下:

//业务逻辑
public ActionForward init(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws SystemException, BusinessException {
getLog().info("TreeNodeAction::init begin");
SampleSearchInData inData = new SampleSearchInData();
SampleSearchOutData result = new SampleSearchOutData();
StringBuffer reslutBuffer = new StringBuffer(
"<?xml version=\"1.0\" encoding=\"SHIFT-JIS\"?>");
String spanId = request.getParameter("taxonId");
String taxonId = spanId.substring(2);
inData.setTaxonId(taxonId);

BaseBusiness getTreeListBusiness = BusinessFactory.createBusiness(SubTaxonBusiness.class);
if (!"".equals(taxonId) && taxonId != null) {
//查找数据库的逻辑
result = (SampleSearchOutData) getTreeListBusiness.execute(inData);
reslutBuffer = formatResult(result.getTreeLineList() , reslutBuffer);
}
printXML(response, reslutBuffer);
return null;
}
//拼成XMl格式
private StringBuffer formatResult(List treeLineList , StringBuffer buffer) {
buffer.append("<root>");
for (int i = 0; i < treeLineList.size(); i++) {
TaxonTempTree tt = (TaxonTempTree) treeLineList.get(i);
buffer.append("<node>");
buffer.append("<taxonID>");
buffer.append(tt.getTaxonId());
buffer.append("</taxonID>");
buffer.append("<taxonText>");
buffer.append(tt.getTaxonText());
buffer.append("</taxonText>");
buffer.append("<taxonSubCount>");
buffer.append(tt.getChilds());
buffer.append("</taxonSubCount>");
buffer.append("<taxonSearchStr>");
buffer.append(tt.getSearchStr());
buffer.append("</taxonSearchStr>");
buffer.append("</node>");
}
buffer.append("</root>");
return buffer;
}

//写到前台的XML
protected void printXML(HttpServletResponse response, StringBuffer sb)
throws SystemException {
setXmlResponse(response);
PrintWriter out = null;
try {
out = response.getWriter();
} catch (IOException e) {
throw new SystemException("Ajax 错误", e);
}
out.write(sb.toString());
out.close();
}


protected void setXmlResponse(HttpServletResponse response) {
response.setContentType("text/xml; charset=Shift_JIS");
response.setHeader("Cache-Control", "no-cache");

}


经过反复的测试,没有什么大问题。做项目就是要根据业务不断的琢磨和研究可行性方案。希望这篇文章能给大家一定的帮助。我会在这些天重构这些代码的,希望看出问题的朋友,不忘的点拨下我,我是菜鸟。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值