前几天看到iteye上,有人需要实现“把菜单中的项拖到TAB页就多一个TAB的功能”,就闲时写个简单实现。
先上效果图:

图1

图2
<script type="text/javascript">
Ext.onReady(function(){
//主要思路是用Ext.dd实现,定义一个TreePanel开启enableDrag允许拖动
var treePanel = new Ext.tree.TreePanel({
enableDrag : true,
ddGroup : 'dd',
region:'west',
title:'菜单',
root : new Ext.tree.AsyncTreeNode({
id : 'root',
text:'系统管理',
expanded : true,
children:[
{id:'c1',text:'用户管理',leaf:true},
{id:'c2',text:'账户管理',leaf:true},
{id:'c3',text:'日志管理',leaf:true}
]
}),
width : 150,
height:200
});
//
var tabPanel = new Ext.TabPanel({
region:'center',
activeTab : 0,
width:500,
height:200,
items:[
{title:'我的首页',html:'My HomePage'}
]
});
new Ext.Viewport({
layout:'border',
items:[treePanel,tabPanel]
});
//保证拖放到tabPanel容器中
var ddTargetEl = tabPanel.body.dom;
//以ddTargetEl,新建DropTarget,ddGroup同TreePanel的保存一致,
//以保证TreePanel中的拖放节点能够放到容器中
var tabPanelDropTarget = new Ext.dd.DropTarget(ddTargetEl, {
ddGroup : 'dd',
//notifyOver : 当拖动节点经过目标容器时触发执行
notifyOver : function(ddSource, e, data){
//如果被拖动节点不是叶子节点,则经过容器时,该被拖动元素样式指定为不允许 见图2所示
//通过使用样式[dropNotAlowed,dropAllowed]给用户很直观的感受:哪些拖动节点可以允许拖动
if(!data.node.isLeaf())
return this.dropNotAllowed;
return this.dropAllowed;
},
//notifyDrop : 当在目标容器,释放拖动元素时触发执行
//如果return false;表示当前拖动不可行;反之,可行
notifyDrop : function(ddSource, e, data){
//如果被拖动节点不是叶子节点,则拖动不可行,返回false
if(!data.node.isLeaf()) return false;
//判断检查targetPanel目标组件中是否存在相同id的tab
//如果有,则setActiveTab显示该tab
//否则新增tab,并显示
var n = this.targetPanel.getComponent(data.node.id);
var c = {
'id':data.node.id,
'title':data.node.text,
'html':'Welcome to '+data.node.text,
closable:true
};
if(n){
this.targetPanel.setActiveTab(data.node.id);
}else{
n = this.targetPanel.add(c);
n.show().doLayout();
}
return(true);
}
});
//新建属性targetPanel用于指代目标TabPanel
Ext.apply(tabPanelDropTarget,{targetPanel : tabPanel});
});
</script>

本文介绍如何使用 ExtJS 实现从菜单拖拽项到 Tab 面板以添加新 Tab 的功能。通过配置 TreePanel 和 TabPanel,结合 Ext.dd 实现拖放效果,确保只有叶子节点才能被拖拽并添加到 Tab 面板。
180

被折叠的 条评论
为什么被折叠?



