dtree点击事件和中文乱码

      最近在做一个类似课件的东西,要用到dtree生成章节目录,dtree是一个开源的框架,下载地址是:http://www.destroydrop.com/javascripts/tree/

 

     dtree的使用参照上面网站的例子就可以了,通过调用add方法和传递相应的参数来控制目录的外观等。

但是在我使用的过程中遇到了这样一个问题:在点击一个节点的时候要调用一个定位函数。

 

     这个定位函数的作用是在一个div标签中,显示出用户看到的当前页面所属的章节信息:

 

     就是点击位置1,然后在2处会显示位置

     最开始的方案:在首页:index.html 中写入如下定位函数:

 

<script type="text/javascript">
/* 获取当前位置的函数*/
function ok(address1,address2)
{
    var currentdiv=document.getElementById("currentdiv");
    currentdiv.innerHTML=address1+">>"+address2;
}
</script> 

以及相应的div:

 

<div style="float:left;">您当前的位置:</div>
<div id="currentdiv" style="float:left;">交互空间>>课件词典</div> 

 

并且利用dtree.js生成一颗目录树:

 

<div class='dtree'>
<script type='text/javascript'>
d = new dTree('d');
d.add(0,-1,'课程目录');
d.add(498,0,'第一讲 编年体');
d.add(3179,498,'本讲导学 ','kcxxContent_4458_1.html','本讲导学 ','secnavframe');
d.add(3180,498,'典籍概述','kcxxContent_3843_1.html','典籍概述','secnavframe');
d.add(3181,498,'史料选讲','kcxxContent_3846_1.html','史料选讲','secnavframe');
d.add(3899,498,'课后练习','kcxxContent_4048_1.html','课后练习','secnavframe');
d.add(499,0,'第二讲 国别体');
d.add(3182,499,'本讲导学 ','kcxxContent_4459_1.html','本讲导学 ','secnavframe');
d.add(3183,499,'典籍概述','kcxxContent_4049_1.html','典籍概述','secnavframe');
d.add(3184,499,'史料选讲','kcxxContent_4295_1.html','史料选讲','secnavframe');
d.add(3900,499,'课后练习','kcxxContent_4456_1.html','课后练习','secnavframe');
d.add(500,0,'第三讲 纪传体');
d.add(3185,500,'本讲导学','kcxxContent_4460_1.html','本讲导学','secnavframe');
d.add(3186,500,'典籍概述','kcxxContent_4058_1.html','典籍概述','secnavframe');
d.add(3187,500,'史料选讲','kcxxContent_4368_1.html','史料选讲','secnavframe');
d.add(3907,500,'课后练习','kcxxContent_4125_1.html','课后练习','secnavframe');
document.write(d);
</script>

 

最开始觉得应该可以自己再多定义一个参数,比如:

 

d.add(3912,505,'课后练习','kcxxContent_4457_1.html','课后练习','secnavframe','ok('1','2')');

但是,由于我是初学者,云山雾绕的引号觉得很麻烦,于是就放弃了……

之后就各种百度,谷歌,发现了一个可行的方案~~

 

mytree.add(1,0,'My Pictures','javascript:alert(\'dddddddd\'););

 

 就是在上面参数中url位置上,把网页地址换成javascript:alert(\'dddd\'),真的可以做到点击树状目录的时候,有反应,弹出提示框,但是在改进的时候发现这种方法不可行的理由:

     1.只能写在这个固定的地方,不能函数调用

     2.点击触发事件的同时我还想打开页面……

也许是自己才疏学浅,所以又放弃了~~~

-------------------------------------------------------------------------------------------- 

纠结了好久,最后终于成功了

方法就是:修改dtree.js文件

 

把函数直接写在dtree.js文件里,不用调用

 在.js文件中有一个函数名字是 s  他的作用是在点击叶子节点的时候使之高亮,我们在这里面添加相应的代码,就能实现点击如上图“本讲导学”的时候,同时触发修改定位和转移页面。而定位函数就是写在了下述代码的后两行。

 

// 点击节点的时候,更改css样式,使选中节点高亮,同时可以在此处编写点击目录节点时想要触发的函数
dTree.prototype.s = function(id) 
{
	// 判断是否允许选中节点
	if (!this.config.useSelection) return;
	// 根据索引值从节点数组中取出节点对象
	var cn = this.aNodes[id];
	var parent = this.aNodes[id].pid;
	var pName;
	for(var i=0;i<this.aNodes.length;i++)
	{
		if(this.aNodes[i].id == parent)
		{
			pName = this.aNodes[i].name;
		}
	}
	// 判断包含子节点的节点是否允许选中
	if (cn._hc && !this.config.folderLinks) return;
	// 交换新旧节点的选中状态,改变css
	if (this.selectedNode != id) 
	{
		if (this.selectedNode || this.selectedNode==0) 
		{
			eOld = document.getElementById("s" + this.obj + this.selectedNode);
			eOld.className = "node";
		}
		eNew = document.getElementById("s" + this.obj + id);
		eNew.className = "nodeSel";
		this.selectedNode = id;
		if (this.config.useCookies) this.setCookie('cs' + this.obj, cn.id);
		var currentdiv=document.getElementById("currentdiv");
		currentdiv.innerHTML = "课程学习>>"+pName+">>"+this.aNodes[id].name;
	}
};

------------------------------------------------------------------------------------------- 

在.js文件中有一个函数名字是  nodeStatus ,他的作用是改变有子节点的节点的展开或者折叠状态,所以在这里我们可以定义在点击二级节点时的动作~~这样就解决了我的问题~~

 

/**
 * 改变节点的状态(展开或折叠)
 * @param status true展开,false折叠;
 * @param id 节点的数组索引值(_ai);
 * @param bottom 是否是本级最后一个节点(_ls);
 * 可以在这个地方编写点击二节目录的函数
 */
dTree.prototype.nodeStatus = function(status, id, bottom) 
{
	eDiv= document.getElementById('d' + this.obj + id);
	eJoin	= document.getElementById('j' + this.obj + id);

	if (this.config.useIcons) {

		eIcon	= document.getElementById('i' + this.obj + id);

		eIcon.src = (status) ? this.aNodes[id].iconOpen : this.aNodes[id].icon;

	}

	eJoin.src = (this.config.useLines)?

	((status)?((bottom)?this.icon.minusBottom:this.icon.minus):((bottom)?this.icon.plusBottom:this.icon.plus)):

	((status)?this.icon.nlMinus:this.icon.nlPlus);

	eDiv.style.display = (status) ? 'block': 'none';

};

 

------------------------------------------------------------------------------------------

 

在这里,也遇到了乱码问题,比如在s函数中的定位函数部分:

var currentdiv=document.getElementById("currentdiv");
currentdiv.innerHTML = "课程学习>>"+pName+">>"+this.aNodes[id].name;

 

   在前台显示的时候,“课程学习”是乱码

其实是因为首页index.html是gb2312编码,而我们从网上下载下来的dtree.js是utf-8编码,所以只要在dreamweaver中改变dtree.js页面的编码格式就行啦~~

修改——页面属性——把编码改成gb2312

 

-----------------------------------over--------------------------------------------------------

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值