在xloadtree的主页上, 有项目xtree 和xloadtree 一个是固定显示的树,一个是动态加载的树.
在他的隐藏目录里,有一个xtree2 地址为 http://webfx.eae.net/dhtml/xtree2b/ 这个是正在测试的版本, 融合了xtree和xloadtree. 更新了代码, 但还是beta版.
xloadtree 可以在各种浏览器下通用. 兼容性效果非常好.
主要的三个文件: xtree2.js, xloadtree2.js, xtree2.css
xloadtree2.js 主要是对ajax方式的封装, 实现异步调用. 显示树的时候,调用xtree2.js里面的代码. xtree2.css 控制树的显示式样. 在查看他的文档的时候,主要看xtree2的文档,这里面才有对树怎样进行操作. xloadtree只是个调用包装.
xtree2.js :
输出html代码的时候, 调用的是toHtml() 方法. 在这个方法中,其中最主要的是getRowHtml() 来得到每一行的输出. 方法中用 getExpandIconHtml() 来控制展开后图标的代码输出, getIconHtml()控制未展开的图标输出. getLabelHtml() 控制文本的输出, 如果不想要图标,就把图标的输出代码屏蔽掉就OK.
关于在页面输出后,看不到源代码的调试方法:
< INPUT type = " button " name = " ad " onclick = " charge(); " value = " change " >
< br />
< TEXTAREA rows = " 10 " cols = " 30 " id = " ttt " name = " ttt " ></ TEXTAREA >
< br />
< INPUT type = " button " name = " findnode " onclick = " findnode(); " value = " findnode " >
< br />
< INPUT type = " button " name = " openpath " onclick = " openpath(); " value = " openpath " >
< script >
function charge(){
document.getElementById('ttt').value = tree.getSelected().toHtml();
}
function findnode(){
tree.findChildByText(document.getElementById('ttt').value, 0 );
}
function openpath(){
tree.openPath(webFXTreeHandler.htmlToText(document.getElementById('ttt').value), true );
tree.getSelected().expand();
}
</ script >
在页面中放置如上代码. 注意,先要获得树的句柄. 比较创建树的时候,用如下代码:
在展开的树点,选择后, 点击change 按钮,可以得到这个节点对应的html代码. 然后对应html可以找到相应的CSS. 这个就不多写了.
xloadtree在调用子节点树的时候,和服务器之间传输的是xml.
DTD的定义如下
<! ATTLIST tree
text CDATA #REQUIRED
src CDATA #IMPLIED
action CDATA #IMPLIED
icon CDATA #IMPLIED
openIcon CDATA #IMPLIED
target CDATA #IMPLIED >
其中 text为显示文本, src为下级目录目录的地址. action为点击的链接. icon为图标,openIcon为节点打开后的图标. target为目标,和a标签的target用法一样.
因为xml 文件不能传送< > 这种符号, 可以采用< > 传送. 因为项目里需要在树上显示HTML代码,所以在js里面做了修改. 修改的部分比较多. 还没有测试有没有意外情况. 这个以后再说.
还有, 在使用过程中,有一个BUG. 是设置tabindex的. 会出错.
将xtree2.js文件中的这一行屏蔽掉就行了. 当然,先要确定你不需要使用tab键定位. :)
2006- 4- 22 增加:
在要打开指定目录树的时候 如果树里面包含html代码, 可以用如下语句
<script>try{top.tree.tree.openPath(webFXTreeHandler.htmlToText("/北京新东方学校/<font color=red><b>留学考试</b></font>/fff"),true);}catch(err){}</script>
2006-5-19
前天在同事应用的时候,出现的问题是加载过程中如果树结点为中文,就加载不上. 后来找到问题的原因是在用servlet输出xml 的时候,是用的steam的方式, 后来改成字符输出方式才正确. 如下.
out.write(outputXML.toString());
out.flush();
out.close();
<script type="text/javascript"> // </script>
Feedback
我做了一个把数据库中取得的结果生成xml文件,在使用xloadtree,可以用.
我想请教你怎样可以取得节点的信息,因为当我取到了节点的信息,我可以通过该信息到数据库查找该节点包含的子节点并显示.
我说的可能不是太清楚,你能理解我的意思吗?可以告诉我一个解决的办法吗? 回复 更多评论
我的想法如下
-root
|
|---1
|
|---2
| |
| |-----2.1
| |-----2.2
| |-----2.3
|
|---3
| |
| |-----3.1
| |-----3.2
| |-----3.3
在这个里面,当我点击节点2的时候,应该可以出现子节点2.1,2.2,2.3;点击节点3出现3的子节点,这样我需要判断鼠标点击的是节点2还是节点3在去生成对应的子节点.
var rti;
var tree = new WebFXTree("Root");
tree.add(new WebFXTreeItem("1"));
tree.add(new WebFXLoadTreeItem("2", "2.xml"));
tree.add(new WebFXLoadTreeItem("3", "3.xml"));
在这段代码中,testtree.xml这个地方必须指定一个xml的文件,我试过把
tree.add(new WebFXLoadTreeItem("2", "2.xml"));
改为
tree.add(new WebFXLoadTreeItem("2", "2.jsp?id=2"));
,通过2.jsp来生成节点2的子节点,这些节点都是从数据库取出来的,但这样就会报错,所以我现在只能自己写一个2.jsp的程序来生成2.xml文件,这样的话就导致了这个树不是动态的生成.
我这样说你可以理解吗,我想请教你我这个程序是不是写的有问题,或者思路本身就是不对的.谢谢你的回复. 回复 更多评论
var tree = new WebFXTree("酷学社区","forumIndex.jspa");
tree.setTarget("content");
提示:无法识别setTarget该方法.我看了WebFXTree的api也没有这个方法,
var category119=new WebFXLoadTreeItem("直播课堂", "forumTreeControl!load.jspa?treeNode=119","category.jspa?categoryID=119");
category119.setTarget("content");
tree.add(category119);
上面这段代码,我的理解是,
节点名称:直播课堂
生成节点的文件:forumTreeControl!load.jspa?treeNode=119
action:category.jspa?categoryID=119
setTarget是将action的路径在网页的哪个位置打开
这样理解对吗?
如果这样理解正确的话,
tree.add(new WebFXLoadTreeItem("esport", "node.jsp?nodeid=2"));
这样写就是没有问题的.是这样的吗? 回复 更多评论
1、我点开3个目录,那么重新load的时候,这三个目录自动展开。能不能自动展开最后一个,而不是全部3个,或者都不展开。
2、加载子目录的xml,里面的对象名称该怎么取,因为刷新之后我想把焦点还定位到已选择的目录。 回复 更多评论
我是按这种方法引用的,这里有几个问题想请教一下:
1.我的node.php可以生成我想要的XML而且格式没有问题,但这里 esport 结点不会展开,只出现一个没有任何内容的对话框,很郁闷。
2.我对XML文件不了解,没用过,下面是我的XML请教一下:
<?xml version="1.0"?>
<tree>
<tree text="1sub" action="plist.php" target="main"/>
</tree>
这个XML没有问题,但如果我改成
<tree text="中文" action="plist.php" target="main"/>
这时就出问题了,问题就出在中文字符上,难道它不支持中文?
如果我改成
<tree text="1sub" action="plist.php?mid=3&sid=6" target="main"/>
这时也出现了问题,错误信息显示 应有分号 实在不明白。
以上两点,请教一下,谢谢。
回复 更多评论
1) WebFXLoadTreeItem 这个我是用的三个参数. 没有出现问题.
这样 : new WebFXLoadTreeItem("<%=category.getName()%>", "forumTreeControl!load.jspa?treeNode=<%=category.getID()%>","category.jspa?categoryID=<%=category.getID()%>");
2) 可能和你网页的编码有关... 回复 更多评论
非常感谢你的帮助,关于我的第二个问题已经在你的帮助下解决了,谢谢你.
还是第一个问题,你提供的方法,可不可以详细些呀?
更重要的是 forumTreeControl!load.jspa
category.jspa 这两个文件是做什么用的,内容如何呀?
其实我的问题是,可以用 node.php?nodeid=2 生成相关 XML 文件, 但生成的XML如何才会自动被 WebFXLoadTreeItem 读入,调用呀?
谢谢你了 回复 更多评论
<tree>
<tree text="1sub" action="plist.php?mid=3&sid=6" target="main"/>
</tree>
这几行XML问题出在 plist.php?mid=3&sid=6 如果我改成 plist.php?mid=3或
plist.php?sid=6 都不会有问题
为什么这行语句不能有 & 这个字符呀,郁闷呀,求救一下,拜托了. 回复 更多评论
那就改成& 试试? 回复 更多评论
我是用一个Servlet 直接吐出数据的,只要编码正确,都没有问题
想问一个问题,我树图是逐层加载的,当加载到最后一个节点的时候,后台会返回空数据,xloadtree就会出现错误,我只好返回一个xml来表示是空节点,比较难看,如何解决? 回复 更多评论
QQ:28308402 回复 更多评论
具体我的步骤是将节点的src指定到一个jsp文件中,该jsp文件完成生成XML文件,并使用recpose.sendredirect到新的xml文件,不知是不是我的步骤有什么问题。我试了如果把生成文件和载入xml文件分在两个文件中分步完成基本没有问题。难道生成文件和载入xml要分为两步完成吗? 回复 更多评论
不应该转发, 应该直接输出xml. 回复 更多评论
tree.expandAll();
另外,我也有一个问题,关于动态加载的。
我在自己的PHP程序中加载子节点。如果直接使用xtree2b演示使用的tree.xml,
var tic = new WebFXLoadTreeItem('asdf', 'tree.xml')
这样可以加载没有任何问题,但是我一旦把src参数改为php文件,不管带不带参数,都不能加载节点,即使我把tree.xml直接改名为tree.php都一样,显示的错误信息为:
Error loading tree.php (200: OK)
请问这是怎么回事?另外有没有什么方法可以调试? 回复 更多评论
<div class="dynamicMenu">
<menu:useMenuDisplayer name="ListMenu" pository="repository">
<menu:displayMenu name="DatabaseMenu"/>
<menu:displayMenu name="StandaloneMenu"/>
</menu:useMenuDisplayer>
</div>
怎样才能做到进入页面菜单以全展开的形式显现 回复 更多评论
為什麼我加上main就不行呢,一片空白,去掉就好了
可是我不想把連接開在本窗口,而是想開在main窗口
有辦法嗎? 回复 更多评论
我的问题很简单
我想运行demo.html文件,demo.html和Tree.xml都是下载的源文件,
用 IE 时 加载 XML 失败
用 Firefox 加载 XML 成功
放到Tomcat 使用IE中 成功
但是放到Weblogic使用IE 失败了
我们的工程使用的Weblogic,什么原因呀 回复 更多评论
我的问题很简单
我想运行demo.html文件,demo.html和Tree.xml都是下载的源文件,
用 IE 时 加载 XML 失败
用 Firefox 加载 XML 成功
放到Tomcat 使用IE中 成功
但是放到Weblogic使用IE 失败了
我们的工程使用的Weblogic,什么原因呀 回复 更多评论
xloadtree和用的什么服务器是没有关系的.
回复 更多评论
应该没有关系,只要客户断支持JavaScript好像就行了:) 回复 更多评论
我采用了你提供的Xloadtree,一个JSP文件在执行的时候首先在指定的目录中生成了一个一个tree.xml文件,最后还是在这个页面下面调用了这个tree.xml
var atree = new WebFXLoadTree("系统权限","xmltreea.xml");
atree.build();
但是如果用户刷新了本页面后,tree.xml文件已经更新了内容,但是显示的还是上一次没有刷新的内容,为什么?
还有你给出的example.htm页面上有一个“重新加载异步树”的按钮调用了atree.reload()方法,但是我如果采用自己生成的XML调用这个方法IE就报错,后来发现,如果XML文件中没有这一行“<TreeNode text="递归加载" radio="true" src="tree.xml" />” 这个按钮就不起作用,能给我解答一下吗?
我所需要的就是每次调入的时候,能够都重新加载一遍XML文件,谢谢!
我的联络方式:
msn:qiutian1976@minihome.8800.org
QQ:568670(请注明XloadTree)
Email:qiutian1976@163.com
希望您能够在百忙之中抽出一些时间给与解答,谢谢! 回复 更多评论
但是如果用户刷新了本页面后,tree.xml文件已经更新了内容,但是显示的还是上一次没有刷新的内容,为什么?
这个情意我没有碰到过,重新开个IE 呢? 可能跟IE的缓存有关系,在request和meta里面设一下,不缓存,应该就没有问题了.
回复 更多评论
你好,虽然添加在Request和Meta上添加了禁用缓存,但是在同一个IE浏览器中,刷新页面还是不好用,显示的还是第一次load进来的信息。
但是新开一个网页,输入网址却能解决这个问题,但是实际应用中我是用这个Tree来显示用户的权限列表的,当第一次调入的时候显示的是A的用户的权限列表,当我返回后点击B后,虽然XML文件已经更新,列表显示的还是A的权限,
我都郁闷了:(
回复 更多评论
你的xml文件没有加吧...xml文件我也不知道怎么加...-_- 用servlet输出下? 回复 更多评论
总结问题如下:
1.按照例子正确的配置了文件的路径和XML文件的路径,第一次打开本网页,可以显示正常信息,当进入同一个网页,但是参数传递不同的时候,后台已经重建了这个XML文件,但是,仍旧显示原来的信息
找到一个貌似可以解决的办法,再开一个新网页,然后输入这个XML文件的地址,例如: http://localhost:8080/test/xmltree.xml,浏览器就显示出了重建后的内容(说明,系统已经根据传递参数重新建立,并且文件生成正确),然后在切换到第一次打开的那个浏览器,这个时候刷新页面的时候,就会显示正确的结果了
但这个方法不具备实用性,因为用户不会按照你的这个麻烦的方式去操作
2.当把IE的缓存由“自动”设置成“每次访问页面都检测”,这样虽然刷新还是显示原有内容,但是刷新两次后就会显示正确内容。
以上问题通过不同的机器和操作系统反复测试,问题依旧。
我是用的环境是Tomcat 5 +JSP
通过以上情况判断,由于我的XML文件名称从来没有变更过(虽然内容在更新),Tomcat 缓存了我的这个XML文件,导致刷新后内容不变,但是我又找不到Tomcat怎么禁止缓存XML文件的方法,郁闷!
我猜想的解决方式,页面调用前,随机生成一个XML文件名称,然后让xloadtree去调用,调用结束后,在页尾删除这个XML文件,这样每次用户访问的时候是用的都是不同的XML文件,这样可以避免Tomcat缓存已经使用过的XML文件,这个只是我的想法,有时间测试一下。 回复 更多评论
不用随机文件名吧,加个随机参数就行了.. 回复 更多评论
呵呵没有大区别了 :) 现在好用了! 谢谢你:) 回复 更多评论
你用的是这个么?
open ('GET', file, true);
send ('');
每刷新一次,
就读一次文件
cache
是么 回复 更多评论
有人做过类似的操作吗? 回复 更多评论
很简单的,代码如下
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.io.*" %>
<%@ page import="org.jdom.*" %>
<%@ page import="org.jdom.input.DOMBuilder" %>
<%@ page import="org.jdom.output.*" %>
<%
try {
org.jdom.Document doc = (org.jdom.Document)request.getSession().getAttribute("TreeDoc");
response.setContentType("text/xml");
PrintWriter outt = response.getWriter();
XMLOutputter outer=new XMLOutputter(" ",true,"GBK");
outt.println(outer.outputString(doc));
}
catch (Exception ex) {
ex.printStackTrace();
}
%> 回复 更多评论
String s = (String)request.getParameter("keyID");
String s1 = ",again";
response.setContentType("text/xml, charset = GBK");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
out.println("<?xml version=/"1.0/" encoding=/"gb2312/"?>");
out.println("<tree>");
out.println(" <tree text=/"myxml1测试" + s + s1 + "/" action=/" http://webfx.eae.net"> http://webfx.eae.net/" />");
out.println(" <tree text=/"myxml2/">");
out.println(" <tree text=/"myxml2.1/" action=/"javascript:alert(2.1)/" />");
out.println(" </tree>");
out.println(" <tree text=/"myxm13/" action=/" http://webfx.eae.net"> http://webfx.eae.net/" />");
out.println("</tree>");
out.close();
这样不行吗?不支持中文!
org.jdom这个包我没有找到 回复 更多评论
out.write(outputXML.toString());
out.flush();
out.close();
这里的 outputXML是什么东西啊,我用一个StringBuffer得到xml格式的字符串,然后输入,还是不支持中文? 回复 更多评论
我是用jdom 来解析xml 的
如果是用Servlet来输出数据,我设置如下
response.setCharacterEncoding("text/xml; charset=GBK");
..................
response.getWriter().println(str);//这里的str是一个xml字符,encoding="GBK"
页面的编码也是"GBK"
这里要注意Servlet的输入格式和编码,xml字符串的encoding,页面的编码 回复 更多评论
:(
是否编码不统一? 你先把xml字符串直接在页面上打印(servlet输出或jsp打印)看看,如果可以正常显示一般不会有问题
回复 更多评论
这行代码上,如果有中文MyXmlHttp.responseXML取到的就是空,所有总是弹出一个空提示框,难道你们和我的js文件不同? 回复 更多评论
这是一个动态加载树,如果是从xml文件读取节点,直接改xml文件的第一个字段就可以了,如果是从数据库读取,就不存在问题了 回复 更多评论
responseXML的确有时候会有问题,接收的东西为空
换成responseText试试
这个是开源的,不会有问题 回复 更多评论
谢谢指点,我查资料改好了。
现在我想问一下这个target在哪里设置,怎么设置呢? 回复 更多评论
<tree>
<tree id="1" text="test1" src="" action="test?type=1" toolTip="test1" target="leftframe" />
</tree>
是这个target么? 回复 更多评论
var tree = new WebFXTree("Root");
tree.add(new WebFXTreeItem("Tree Item 11","testxml.jsp"));
如果这个地方要加target,怎么加啊,试了好长时间没有成功! 回复 更多评论
添加2个方法
//在1522行原先方法下添加
//zz
function WebFXTreeItem(sText, oAction,target) {
WebFXTreeAbstractNode.call(this, sText, oAction,target);
}
在288 行原先方法下添加
//zz
function WebFXTreeAbstractNode(sText, oAction,target) {
this.childNodes = [];
if (sText) this.text = sText;
if (oAction) this.action = oAction;
if (target) this.target = target;
this.id = webFXTreeHandler.getUniqueId();
if (webFXTreeConfig.usePersistence) {
this.open = webFXTreeHandler.persistenceManager.getExpanded(this);
}
webFXTreeHandler.addNode(this);
}
测试代码:
tree.add(new WebFXTreeItem("Tree Item 1"," http://www.google.com","_about")); 回复 更多评论
回复 更多评论
" http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>XTree 2 Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link type="text/css" rel="stylesheet" href="css/xtree2b/xtree2.links.css"> _fcksavedurl=""css/xtree2b/xtree2.links.css">"
<script type="text/javascript" src="js/xtree2b/xtree2.js"></script>
<script type="text/javascript" src="js/xtree2b/xloadtree2.js"></script>
</head>
<body>
<script type="text/javascript">
//alert("ok");
var tree = new WebFXLoadTree("Hello World", "tree.xml");
tree.write();
</script>
</body>
</html>
以上代码出现问题 WebFXLoadTree 该问题怎么跟踪呢? 回复 更多评论
请问这是怎么回事? 回复 更多评论
怎么用随机参数啊?
我搞了一天也没有搞定,我是通过servlet从数据库中取数据,
但数据库数据更新了,但目录树怎么刷新也更新不了。
希望每次点击一个节点的时候能重新从数据库中取数据。
我用的web服务器是weblogic 8.14
回复 更多评论
回复 更多评论
var tic = new WebFXLoadTreeItem('asdf', 'tree.xml')
这样可以加载没有任何问题,但是我一旦把src参数改为php文件,不管带不带参数,都不能加载节点,即使我把tree.xml直接改名为tree.php都一样,显示的错误信息为:
Error loading tree.php (200: OK)
请问这是怎么回事?
谢谢了 回复 更多评论
我用这个控件读取xml文件成功了,我用dom4j从数据库中读出文件,生成xml文件,然后进行 加载,添加子节点,删除节点都可以,但是我在删除最后一个节点之后,在初始化xml文件,xml文件已经变了,就是生成的树还是空的,我把网页关了,然后再打开就可以了,不知道原因,希望高手给与指教。 回复 更多评论
if (count == 0) {
jsNode.errorText = "Error loading " +jsNode.src + " (???)";
} 回复 更多评论
String action = "javascript:doPriCategoryAction('" + name +"')";
能不能够写成两种方法?一种是点击节点时跳转页面,另外一种是鼠标滑移到某一个节点时能够显示一些节点信息?
希望大家共同讨论。 回复 更多评论