moveNode可以使节点中的自定义元素不丢失鼠标事件吗?
ztree吧
全部回复
仅看楼主
level 3
iudean 楼主
你好,moveNode后,节点中的自定义元素的click事件丢失了,必须得重新注册,可以把事件一并move过去吗?
2012年02月20日 06点02分 1
level 3
iudean 楼主
谢谢,问题解决了。你这样改代码量最小,我后面的自定义元素是动态变化的,用事件代理改的就多一些了。
2012年02月20日 07点02分 3
level 11
非常抱歉,刚才的内容我删掉了,我正在测试,有些问题,重新发一下:
不可否认,这应该算是一个被疏忽的bug了。
(请你看 exedit 这个js 包的 第 951 行,将 varnodeDom = $("#" + node.tId).remove(); 修改为 var nodeDom = $("#" + node.tId); 即可,再使用看看,如果有问题请尽快告诉我,这部分修改不用担心以后的升级,如果一切正常的话,我也会这么修正的。 )
这个不要这么修改,如果move成为其他节点的子节点会有问题!!!
另外,你也可以利用事件代理,将事件注册给 zTree 容器,这样就不需要修改 zTree 的 js 代码了;当然了如果你用的是 onmouseover 和 onmouseout 就别用事件代理了。
非常感谢!!

2012年02月20日 07点02分 4
level 11
如果你使用 jQuery 1.4 以上版本,那么可以吧 remove 修改为 detach 方法,这样完全可以正常,只是为了更好的兼容 jQuery较低版本,我在升级时不会使用 这个方法的,但这个能尽快解决你的燃眉之急!
2012年02月20日 07点02分 5
level 3
iudean 楼主
好,感谢!
2012年02月20日 07点02分 6
level 11
进一步测试发现这里面当初实现的方式有点儿问题。
如果 targetNode 是叶子节点的话,那么移动时实际上还是删除了源节点DOM,然后在展开时又重新创建了这个节点,因为是重新创建,所以会重新执行 addDiyDom 方法;但因为用了detach,会导致原先的事件仍然存在,及时不影响新节点的操作,也会造成一定程度的内存泄漏。 不知道你的实现中是否会出现这种情况?
建议你再多等一下,我争取今天修正这个问题,然后把代码修正方案发给你。 不好意思了!
2012年02月20日 08点02分 7
level 11
这次应该是比较好的解决了,请对 exedit 进行如下修改:
请将 exedit 中 Line 937-958 这段代码替换为以下内容(如有问题请继续沟通):
//move node Dom
var targetObj, target_ulObj;
if (targetNodeIsRoot) {
targetObj = setting.treeObj;
target_ulObj = targetObj;
} else if (!isSilent) {
if (moveType == consts.move.TYPE_INNER) {
view.expandCollapseNode(setting, targetNode, true, false);
} else {
view.expandCollapseNode(setting, targetNode.getParentNode(), true, false);
}
targetObj = $("#" + targetNode.tId);
target_ulObj = $("#" + targetNode.tId + consts.id.UL);
if (!target_ulObj.get(0)) {
var ulstr = [];
view.makeUlHtml(setting, targetNode, ulstr, '');
targetObj.append(ulstr.join(''));
}
target_ulObj = $("#" + targetNode.tId + consts.id.UL);
}
var nodeDom = $("#" + node.tId);
if (target_ulObj.get(0) && moveType == consts.move.TYPE_INNER) {
target_ulObj.append(nodeDom);
} else if (targetObj.get(0) && moveType == consts.move.TYPE_PREV) {
targetObj.before(nodeDom);
} else if (targetObj.get(0) && moveType == consts.move.TYPE_NEXT) {
targetObj.after(nodeDom);
}
2012年02月20日 09点02分 8
level 3
iudean 楼主
好,简单测了一下没发现问题:)
2012年02月20日 09点02分 9
1