模拟文件夹

本来是要做一个命令行的,这个算是铺垫。

规定一个文件的表示形式:

            file_0 : {
type : 'folder',
name : 'folder_0',
length : 2,
files[fileContent] :{}
}

type:文件类型,分为disk、folder和file

name:文件(夹)名

length:文件夹中的文件个数,file类型没有length属性

files:子文件

fileContent:文件内容

fileArray:主要是想用来进行排序的。

作为demo的文件结构

    var fileSystem = {
type : 'disk',
name : 'C:',
length : 8,
fileArray:['file_0','file_1','file_2','file_3','file_4','file_5','file_6','file_7'],
files : {
file_0 : {
type : 'folder',
name : 'folder_0',
fileArray:['file_0','file_1'],
length : 2,
files :{
file_0 : {
type : 'file',
name : 'file_1'
},
file_1 : {
type : 'folder',
name : 'folder_0_0',
length : 3,
fileArray:['file_0','file_1','file_2'],
files :{
file_0 : {
type : 'file',
name : 'file_2'
},
file_1 : {
type : 'file',
name : 'file_3'
},
file_2:{
type : 'folder',
name : 'folder_0_0_0',
length : 0,
files :{}
}
}
}
}
},
file_1 : {
type : 'folder',
name : 'folder_2',
length : 2,
fileArray:['file_0','file_1'],
files :{
file_0 : {
type : 'file',
name : 'file_2'
},
file_1 : {
type : 'file',
name : 'file_3'
}
}
},
file_2:{
type : 'file',
name : 'file_2',
fileContent:'小西山子'
},
file_3:{
type : 'file',
name : 'file_3',
fileContent:'小西山子'
},
file_4:{
type : 'file',
name : 'file_4',
fileContent:'小西山子'
},
file_5:{
type : 'file',
name : 'file_5',
fileContent:'小西山子'
},
file_6:{
type : 'file',
name : 'file_6',
fileContent:'小西山子'
},
file_7:{
type : 'folder',
name : 'folder_7',
length : 0,
fileArray:[],
files :{}
}
}
}

这是一个树形结构,

第一层有8个文件——包括2个文件夹(type:folder)和6个文件(type:file),以此类推

基本的HTML结构:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
*
{ margin: 0; padding: 0;}
body
{ font-size: 12px;}
ul
{ list-style: none;}

#fileWindow
{ position: relative; width: 600px; height: 400px; margin:10px 0 0 20px; border: 5px solid #808080; border-radius: 5px; box-shadow: 5px 5px 10px #000; overflow: hidden;}
#fileWindow li
{ float: left; width: 50px; height: 50px; line-height: 50px; margin: 10px; cursor: pointer; border-radius: 5px; box-shadow: 5px 5px 10px #000; font-size: 14px; color: #fff; text-align: center;}
.folder
{ background: #008b8b; }
.folder:after
{ content: '文件夹';}
.file
{ background: #006400;}
.file:after
{ content: '文件';}

#defaultWindow,.subWindow
{ position: absolute; top:0; width: 100%; height: 100%; background: #7fffd4;}
#defaultWindow
{ left: 0; }

.subWindow
{ left: 602px;}
.subWindow .title
{ height: 30px; line-height: 30px; background: #a9a9a9;}
.subWindow .title span
{ float: right; cursor: pointer;}

#contentWindow
{ position: absolute; left: 650px; top:0; width: 400px; height: 200px; margin:10px 0 0 20px; border: 3px dotted #ff8c00; font-size: 14px;}
</style>
</head>
<body>
<div id="fileWindow">
<div id="defaultWindow"></div>
</div>
<div id="contentWindow"></div>
</body>
</html>

其中<div#defaultWindow作为默认的显示窗口。div#contentWindow是为了简化显示文件内容的

暂时的原理是:

点击文件时,在div#contentWindow里面直接显示文件内容。

点击文件夹时,创建一个新窗口,然后覆盖当前窗口,这里有个问题就是重复创建窗口以及窗口过多引起性能下降,所以需要进行处理,由于demo个数较少,而且我限制在单窗口打开,所以没有处理,后面实现成弹出窗口时,就需要考虑了。

下面是demo:

View Code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
*
{ margin: 0; padding: 0;}
body
{ font-size: 12px;}
ul
{ list-style: none;}

#fileWindow
{ position: relative; width: 600px; height: 400px; margin:10px 0 0 20px; border: 5px solid #808080; border-radius: 5px; box-shadow: 5px 5px 10px #000; overflow: hidden;}
#fileWindow li
{ float: left; width: 50px; height: 50px; line-height: 50px; margin: 10px; cursor: pointer; border-radius: 5px; box-shadow: 5px 5px 10px #000; font-size: 14px; color: #fff; text-align: center;}
.folder
{ background: #008b8b; }
.folder:after
{ content: '文件夹';}
.file
{ background: #006400;}
.file:after
{ content: '文件';}

#defaultWindow,.subWindow
{ position: absolute; top:0; width: 100%; height: 100%; background: #7fffd4;}
#defaultWindow
{ left: 0; }

.subWindow
{ left: 602px;}
.subWindow .title
{ height: 30px; line-height: 30px; background: #a9a9a9;}
.subWindow .title span
{ float: right; cursor: pointer;}

#contentWindow
{ position: absolute; left: 650px; top:0; width: 400px; height: 200px; margin:10px 0 0 20px; border: 3px dotted #ff8c00; font-size: 14px;}
</style>
</head>
<body>
<div id="fileWindow">
<div id="defaultWindow"></div>
</div>
<div id="contentWindow"></div>
<script type="text/javascript">
var fileSystem = {
type :
'disk',
name :
'C:',
length :
8,
fileArray:[
'file_0','file_1','file_2','file_3','file_4','file_5','file_6','file_7'],
files : {
file_0 : {
type :
'folder',
name :
'folder_0',
fileArray:[
'file_0','file_1'],
length :
2,
files :{
file_0 : {
type :
'file',
name :
'file_1'
},
file_1 : {
type :
'folder',
name :
'folder_0_0',
length :
3,
fileArray:[
'file_0','file_1','file_2'],
files :{
file_0 : {
type :
'file',
name :
'file_2'
},
file_1 : {
type :
'file',
name :
'file_3'
},
file_2:{
type :
'folder',
name :
'folder_0_0_0',
length :
0,
files :{}
}
}
}
}
},
file_1 : {
type :
'folder',
name :
'folder_2',
length :
2,
fileArray:[
'file_0','file_1'],
files :{
file_0 : {
type :
'file',
name :
'file_2'
},
file_1 : {
type :
'file',
name :
'file_3'
}
}
},
file_2:{
type :
'file',
name :
'file_2',
fileContent:
'小西山子'
},
file_3:{
type :
'file',
name :
'file_3',
fileContent:
'小西山子'
},
file_4:{
type :
'file',
name :
'file_4',
fileContent:
'小西山子'
},
file_5:{
type :
'file',
name :
'file_5',
fileContent:
'小西山子'
},
file_6:{
type :
'file',
name :
'file_6',
fileContent:
'小西山子'
},
file_7:{
type :
'folder',
name :
'folder_7',
length :
0,
fileArray:[],
files :{}
}
}
}

function $(id){
return document.getElementById(id);
}
var fileWindow = $('fileWindow');
var defaultWindow = $('defaultWindow');
var contentWindow = $('contentWindow');

// var windowStack = [defaultWindow];//用作栈
//
var windowPointer = defaultWindow;//栈指针
var textContent = document.body.innerText !== null ? 'innerText' : 'textContent';

var mainList = createFolderTree(fileSystem);
defaultWindow.appendChild(mainList);

fileWindow.onclick
= function(e){
var e = e || window.event;
var target = e.target || e.srcElement;
if(target.tagName.toLowerCase() == 'li'){
switch(target.content.type){
case('folder') : {
openFolder(target.content);
break;
}
case('file') : {
openFile(target.content);
break;
}
}

}
if(target.className == 'back'){
goBack(target);
}
}

//返回上一级
function goBack(target){
target.wrapWindow.style.left
= '602px';
return 0;
}
//打开文件夹
function openFolder(targetFolder){
//如果打开了就不用在创建了,这里后面需要限制一下最大个数
if(!targetFolder.subWindow){
targetFolder.subWindow
= createWindow(targetFolder);
targetFolder.subWindow.bd.appendChild(createFolderTree(targetFolder));
fileWindow.appendChild(targetFolder.subWindow);
}
// windowStack.push(targetFolder.subWindow);
targetFolder.subWindow.style.left = 0;
return 0;
}
//创建新窗口
function createWindow(targetFolder){
var subWindow = document.createElement('div');
subWindow.className
= 'subWindow';
var hd = document.createElement('div');
hd.className
= 'title';
var title = document.createElement('h3');
title[textContent]
= targetFolder.name;
var back = document.createElement('span');
back.className
= 'back';
back.innerHTML
= '返回';
back.wrapWindow
= subWindow;

hd.appendChild(back);
hd.appendChild(title);

var bd = document.createElement('div');

subWindow.appendChild(hd);
subWindow.appendChild(bd);

subWindow.back
= back;
subWindow.bd
= bd;
return subWindow;
}
//显示文件结构
function createFolderTree(targetFolder){
var fileList = document.createElement('ul');
for(var i = 0; i < targetFolder.length; i++){
var li = document.createElement('li');
li.content
= targetFolder.files[targetFolder.fileArray[i]];
li.className
= targetFolder.files[targetFolder.fileArray[i]]['type'];
fileList.appendChild(li);
}
return fileList;
}
//打开文件
function openFile(targetFile){
contentWindow[textContent]
= targetFile.fileContent || '空文件';
return 0;
}
</script>
</body>
</html>

大致是这个样子的,有些想法并不成熟,只是今天临时想到的,有什么问题,欢迎指出。




转载请注明来自小西山子【http://www.cnblogs.com/xesam/
本文地址:http://www.cnblogs.com/xesam/archive/2011/12/09/2282942.html

posted @ 2011-12-09 23:37  西山  阅读(437)  评论(0编辑  收藏  举报