📄 drag-drop-folder-tree.js
字号:
if(uls.length>0){
ul = uls[0];
ul.style.display='block';
var lis = ul.getElementsByTagName('LI');
if(lis.length>0){ // Sub elements exists - drop dragable node before the first one
ul.insertBefore(JSTreeObj.dragNode_source,lis[0]);
}else { // No sub exists - use the appendChild method - This line should not be executed unless there's something wrong in the HTML, i.e empty <ul>
ul.appendChild(JSTreeObj.dragNode_source);
}
}else{
var ul = document.createElement('UL');
ul.style.display='block';
JSTreeObj.dragNode_destination.appendChild(ul);
ul.appendChild(JSTreeObj.dragNode_source);
}
var img = JSTreeObj.dragNode_destination.getElementsByTagName('IMG')[0];
img.style.visibility='visible';
img.src = img.src.replace(JSTreeObj.plusImage,JSTreeObj.minusImage);
}else{
if(JSTreeObj.dragNode_destination.nextSibling){
var nextSib = JSTreeObj.dragNode_destination.nextSibling;
nextSib.parentNode.insertBefore(JSTreeObj.dragNode_source,nextSib);
}else{
JSTreeObj.dragNode_destination.parentNode.appendChild(JSTreeObj.dragNode_source);
}
}
/* Clear parent object */
var tmpObj = JSTreeObj.dragNode_parent;
var lis = tmpObj.getElementsByTagName('LI');
if(lis.length==0){
var img = tmpObj.parentNode.getElementsByTagName('IMG')[0];
img.style.visibility='hidden'; // Hide [+],[-] icon
tmpObj.parentNode.removeChild(tmpObj);
}
}else{
// Putting the item back to it's original location
if(JSTreeObj.dragNode_sourceNextSib){
JSTreeObj.dragNode_parent.insertBefore(JSTreeObj.dragNode_source,JSTreeObj.dragNode_sourceNextSib);
}else{
JSTreeObj.dragNode_parent.appendChild(JSTreeObj.dragNode_source);
}
}
JSTreeObj.dropTargetIndicator.style.display='none';
JSTreeObj.dragDropTimer = -1;
if(showMessage && JSTreeObj.messageMaximumDepthReached)alert(JSTreeObj.messageMaximumDepthReached);
}
,
createDropIndicator : function()
{
this.dropTargetIndicator = document.createElement('DIV');
this.dropTargetIndicator.style.position = 'absolute';
this.dropTargetIndicator.style.display='none';
var img = document.createElement('IMG');
img.src = this.imageFolder + 'dragDrop_ind1.gif';
img.id = 'dragDropIndicatorImage';
this.dropTargetIndicator.appendChild(img);
document.body.appendChild(this.dropTargetIndicator);
}
,
dragDropCountLevels : function(obj,direction,stopAtObject){
var countLevels = 0;
if(direction=='up'){
while(obj.parentNode && obj.parentNode!=stopAtObject){
obj = obj.parentNode;
if(obj.tagName=='UL')countLevels = countLevels/1 +1;
}
return countLevels;
}
if(direction=='down'){
var subObjects = obj.getElementsByTagName('LI');
for(var no=0;no<subObjects.length;no++){
countLevels = Math.max(countLevels,JSTreeObj.dragDropCountLevels(subObjects[no],"up",obj));
}
return countLevels;
}
}
,
cancelEvent : function()
{
return false;
}
,
cancelSelectionEvent : function()
{
if(JSTreeObj.dragDropTimer<10)return true;
return false;
}
,getNodeOrders : function(initObj,saveString)
{
if(!saveString)var saveString = '';
if(!initObj){
initObj = document.getElementById(this.idOfTree);
}
var lis = initObj.getElementsByTagName('LI');
if(lis.length>0){
var li = lis[0];
while(li){
if(li.id){
if(saveString.length>0)saveString = saveString + ',';
var numericID = li.id.replace(/[^0-9]/gi,'');
if(numericID.length==0)numericID='A';
var numericParentID = li.parentNode.parentNode.id.replace(/[^0-9]/gi,'');
if(numericID!='0'){
saveString = saveString + numericID;
saveString = saveString + '-';
if(li.parentNode.id!=this.idOfTree)saveString = saveString + numericParentID; else saveString = saveString + '0';
}
var ul = li.getElementsByTagName('UL');
if(ul.length>0){
saveString = this.getNodeOrders(ul[0],saveString);
}
}
li = li.nextSibling;
}
}
if(initObj.id == this.idOfTree){
return saveString;
}
return saveString;
}
,highlightItem : function(inputObj,e)
{
if(JSTreeObj.currentlyActiveItem)JSTreeObj.currentlyActiveItem.className = '';
this.className = 'highlightedNodeItem';
JSTreeObj.currentlyActiveItem = this;
}
,
removeHighlight : function()
{
if(JSTreeObj.currentlyActiveItem)JSTreeObj.currentlyActiveItem.className = '';
JSTreeObj.currentlyActiveItem = false;
}
,
hasSubNodes : function(obj)
{
var subs = obj.getElementsByTagName('LI');
if(subs.length>0)return true;
return false;
}
,
deleteItem : function(obj1,obj2)
{
var message = 'Click OK to delete item ' + obj2.innerHTML;
if(this.hasSubNodes(obj2.parentNode)) message = message + ' and it\'s sub nodes';
if(confirm(message)){
this.__deleteItem_step2(obj2.parentNode); // Sending <LI> tag to the __deleteItem_step2 method
}
}
,
__refreshDisplay : function(obj)
{
if(this.hasSubNodes(obj))return;
var img = obj.getElementsByTagName('IMG')[0];
img.style.visibility = 'hidden';
}
,
__deleteItem_step2 : function(obj)
{
var saveString = obj.id.replace(/[^0-9]/gi,'');
var lis = obj.getElementsByTagName('LI');
for(var no=0;no<lis.length;no++){
saveString = saveString + ',' + lis[no].id.replace(/[^0-9]/gi,'');
}
// Creating ajax object and send items
var ajaxIndex = JSTreeObj.ajaxObjects.length;
JSTreeObj.ajaxObjects[ajaxIndex] = new sack();
JSTreeObj.ajaxObjects[ajaxIndex].method = "GET";
JSTreeObj.ajaxObjects[ajaxIndex].setVar("deleteIds", saveString);
JSTreeObj.__addAdditionalRequestParameters(JSTreeObj.ajaxObjects[ajaxIndex], JSTreeObj.additionalDeleteRequestParameters);
JSTreeObj.ajaxObjects[ajaxIndex].requestFile = JSTreeObj.filePathDeleteItem; // Specifying which file to get
JSTreeObj.ajaxObjects[ajaxIndex].onCompletion = function() { JSTreeObj.__deleteComplete(ajaxIndex,obj); } ; // Specify function that will be executed after file has been found
JSTreeObj.ajaxObjects[ajaxIndex].runAJAX(); // Execute AJAX function
}
,
__deleteComplete : function(ajaxIndex,obj)
{
if(this.ajaxObjects[ajaxIndex].response!='OK'){
alert('ERROR WHEN TRYING TO DELETE NODE: ' + this.ajaxObjects[ajaxIndex].response); // Rename failed
}else{
var parentRef = obj.parentNode.parentNode;
obj.parentNode.removeChild(obj);
this.__refreshDisplay(parentRef);
}
}
,
__renameComplete : function(ajaxIndex)
{
if(this.ajaxObjects[ajaxIndex].response!='OK'){
alert('ERROR WHEN TRYING TO RENAME NODE: ' + this.ajaxObjects[ajaxIndex].response); // Rename failed
}
}
,
__saveTextBoxChanges : function(e,inputObj)
{
if(!inputObj && this)inputObj = this;
if(document.all)e = event;
if(e.keyCode && e.keyCode==27){
JSTreeObj.__cancelRename(e,inputObj);
return;
}
inputObj.style.display='none';
inputObj.nextSibling.style.visibility='visible';
if(inputObj.value.length>0){
inputObj.nextSibling.innerHTML = inputObj.value;
// Send changes to the server.
if (JSTreeObj.renameState != JSTreeObj.RENAME_STATE_BEGIN) {
return;
}
JSTreeObj.renameState = JSTreeObj.RENAME_STATE_REQUEST_SENDED;
var ajaxIndex = JSTreeObj.ajaxObjects.length;
JSTreeObj.ajaxObjects[ajaxIndex] = new sack();
JSTreeObj.ajaxObjects[ajaxIndex].method = "GET";
JSTreeObj.ajaxObjects[ajaxIndex].setVar("renameId", inputObj.parentNode.id.replace(/[^0-9]/gi,''));
JSTreeObj.ajaxObjects[ajaxIndex].setVar("newName", inputObj.value);
JSTreeObj.__addAdditionalRequestParameters(JSTreeObj.ajaxObjects[ajaxIndex], JSTreeObj.additionalRenameRequestParameters);
JSTreeObj.ajaxObjects[ajaxIndex].requestFile = JSTreeObj.filePathRenameItem; // Specifying which file to get
JSTreeObj.ajaxObjects[ajaxIndex].onCompletion = function() { JSTreeObj.__renameComplete(ajaxIndex); } ; // Specify function that will be executed after file has been found
JSTreeObj.ajaxObjects[ajaxIndex].runAJAX(); // Execute AJAX function
}
}
,
__cancelRename : function(e,inputObj)
{
JSTreeObj.renameState = JSTreeObj.RENAME_STATE_CANCELD;
if(!inputObj && this)inputObj = this;
inputObj.value = JSTreeObj.helpObj.innerHTML;
inputObj.nextSibling.innerHTML = JSTreeObj.helpObj.innerHTML;
inputObj.style.display = 'none';
inputObj.nextSibling.style.visibility = 'visible';
}
,
__renameCheckKeyCode : function(e)
{
if(document.all)e = event;
if(e.keyCode==13){ // Enter pressed
JSTreeObj.__saveTextBoxChanges(false,this);
}
if(e.keyCode==27){ // ESC pressed
JSTreeObj.__cancelRename(false,this);
}
}
,
__createTextBox : function(obj)
{
var textBox = document.createElement('INPUT');
textBox.className = 'folderTreeTextBox';
textBox.value = obj.innerHTML;
obj.parentNode.insertBefore(textBox,obj);
textBox.id = 'textBox' + obj.parentNode.id.replace(/[^0-9]/gi,'');
textBox.onblur = this.__saveTextBoxChanges;
textBox.onkeydown = this.__renameCheckKeyCode;
this.__renameEnableTextBox(obj);
}
,
__renameEnableTextBox : function(obj)
{
JSTreeObj.renameState = JSTreeObj.RENAME_STATE_BEGIN;
obj.style.visibility = 'hidden';
obj.previousSibling.value = obj.innerHTML;
obj.previousSibling.style.display = 'inline';
obj.previousSibling.select();
}
,
renameItem : function(obj1,obj2)
{
currentItemToEdit = obj2.parentNode; // Reference to the <li> tag.
if(!obj2.previousSibling || obj2.previousSibling.tagName.toLowerCase()!='input'){
this.__createTextBox(obj2);
}else{
this.__renameEnableTextBox(obj2);
}
this.helpObj.innerHTML = obj2.innerHTML;
}
,
initTree : function()
{
JSTreeObj = this;
JSTreeObj.createDropIndicator();
document.documentElement.onselectstart = JSTreeObj.cancelSelectionEvent;
document.documentElement.ondragstart = JSTreeObj.cancelEvent;
document.documentElement.onmousedown = JSTreeObj.removeHighlight;
/* Creating help object for storage of values */
this.helpObj = document.createElement('DIV');
this.helpObj.style.display = 'none';
document.body.appendChild(this.helpObj);
/* Create context menu */
if(this.deleteAllowed || this.renameAllowed){
try{
/* Creating menu model for the context menu, i.e. the datasource */
var menuModel = new DHTMLGoodies_menuModel();
if(this.deleteAllowed)menuModel.addItem(1,'Delete','','',false,'JSTreeObj.deleteItem');
if(this.renameAllowed)menuModel.addItem(2,'Rename','','',false,'JSTreeObj.renameItem');
menuModel.init();
var menuModelRenameOnly = new DHTMLGoodies_menuModel();
if(this.renameAllowed)menuModelRenameOnly.addItem(3,'Rename','','',false,'JSTreeObj.renameItem');
menuModelRenameOnly.init();
var menuModelDeleteOnly = new DHTMLGoodies_menuModel();
if(this.deleteAllowed)menuModelDeleteOnly.addItem(4,'Delete','','',false,'JSTreeObj.deleteItem');
menuModelDeleteOnly.init();
window.refToDragDropTree = this;
this.contextMenu = new DHTMLGoodies_contextMenu();
this.contextMenu.setWidth(120);
referenceToDHTMLSuiteContextMenu = this.contextMenu;
}catch(e){
}
}
var nodeId = 0;
var dhtmlgoodies_tree = document.getElementById(this.idOfTree);
var menuItems = dhtmlgoodies_tree.getElementsByTagName('LI'); // Get an array of all menu items
for(var no=0;no<menuItems.length;no++){
// No children var set ?
var noChildren = false;
var tmpVar = menuItems[no].getAttribute('noChildren');
if(!tmpVar)tmpVar = menuItems[no].noChildren;
if(tmpVar=='true')noChildren=true;
// No drag var set ?
var noDrag = false;
var tmpVar = menuItems[no].getAttribute('noDrag');
if(!tmpVar)tmpVar = menuItems[no].noDrag;
if(tmpVar=='true')noDrag=true;
nodeId++;
var subItems = menuItems[no].getElementsByTagName('UL');
var img = document.createElement('IMG');
img.src = this.imageFolder + this.plusImage;
img.onclick = JSTreeObj.showHideNode;
if(subItems.length==0)img.style.visibility='hidden';else{
subItems[0].id = 'tree_ul_' + treeUlCounter;
treeUlCounter++;
}
var aTag = menuItems[no].getElementsByTagName('A')[0];
aTag.id = 'nodeATag' + menuItems[no].id.replace(/[^0-9]/gi,'');
//aTag.onclick = JSTreeObj.showHideNode;
if(!noDrag)aTag.onmousedown = JSTreeObj.initDrag;
if(!noChildren)aTag.onmousemove = JSTreeObj.moveDragableNodes;
menuItems[no].insertBefore(img,aTag);
//menuItems[no].id = 'dhtmlgoodies_treeNode' + nodeId;
var folderImg = document.createElement('IMG');
if(!noDrag)folderImg.onmousedown = JSTreeObj.initDrag;
folderImg.onmousemove = JSTreeObj.moveDragableNodes;
if(menuItems[no].className){
folderImg.src = this.imageFolder + menuItems[no].className;
}else{
folderImg.src = this.imageFolder + this.folderImage;
}
menuItems[no].insertBefore(folderImg,aTag);
if(this.contextMenu){
var noDelete = menuItems[no].getAttribute('noDelete');
if(!noDelete)noDelete = menuItems[no].noDelete;
var noRename = menuItems[no].getAttribute('noRename');
if(!noRename)noRename = menuItems[no].noRename;
if(noRename=='true' && noDelete=='true'){}else{
if(noDelete == 'true')this.contextMenu.attachToElement(aTag,false,menuModelRenameOnly);
else if(noRename == 'true')this.contextMenu.attachToElement(aTag,false,menuModelDeleteOnly);
else this.contextMenu.attachToElement(aTag,false,menuModel);
}
}
this.addEvent(aTag,'contextmenu',this.highlightItem);
}
initExpandedNodes = this.Get_Cookie('dhtmlgoodies_expandedNodes');
if(initExpandedNodes){
var nodes = initExpandedNodes.split(',');
for(var no=0;no<nodes.length;no++){
if(nodes[no])this.showHideNode(false,nodes[no]);
}
}
document.documentElement.onmousemove = JSTreeObj.moveDragableNodes;
document.documentElement.onmouseup = JSTreeObj.dropDragableNodes;
}
,
__addAdditionalRequestParameters : function(ajax, parameters)
{
for (var parameter in parameters) {
ajax.setVar(parameter, parameters[parameter]);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -