Javascript 文件夹选择框的两种解决方案


Posted in Javascript onJuly 01, 2009

解决方案1:
调用windows 的shell,但会有安全问题.

* browseFolder.js
* 该文件定义了BrowseFolder()函数,它将提供一个文件夹选择对话框
* 以供用户实现对系统文件夹选择的功能
* 文件夹选择对话框起始目录由
* Shell.BrowseForFolder(WINDOW_HANDLE, Message, OPTIONS, strPath)函数
* 的strPath参数设置
* 例如:0x11--我的电脑
* 0 --桌面
* "c:\\"--系统C盘
*
* 用如下代码把该函数应用到一个HTML文件中:
* <script src="browseFolder.js"></script>
* 或把下面代码直接COPY到<script language="javascript">...</script>标签中;

* 特别注意的是,由于安全方面的问题,你还需要如下设置才能使本JS代码正确运行,
* 否者会出现"没有权限"的问题.
*
* 1、设置可信任站点(例如本地的可以为:http://localhost)
* 2、其次:可信任站点安全级别自定义设置中:设置下面的选项
* "对没有标记为安全的ActiveX控件进行初始化和脚本运行"----"启用"

browserFolder.js:

/**//*** 
path 要显示值的对象id 
****/ 
function browseFolder(path) { 
try { 
var Message = "\u8bf7\u9009\u62e9\u6587\u4ef6\u5939"; //选择框提示信息 
var Shell = new ActiveXObject("Shell.Application"); 
var Folder = Shell.BrowseForFolder(0, Message, 64, 17);//起始目录为:我的电脑 
//var Folder = Shell.BrowseForFolder(0,Message,0); //起始目录为:桌面 
if (Folder != null) { 
Folder = Folder.items(); // 返回 FolderItems 对象 
Folder = Folder.item(); // 返回 Folderitem 对象 
Folder = Folder.Path; // 返回路径 
if (Folder.charAt(Folder.length - 1) != "\\") { 
Folder = Folder + "\\"; 
} 
document.getElementById(path).value = Folder; 
return Folder; 
} 
} 
catch (e) { 
alert(e.message); 
} 
}

使用的时候:
<td> 
<input type="text" name="path" /> 
</td> 
<td> 
<input type="button" onclick="browseFolder('path')" 
value="选择生成路径" /> 
</td>

2.解决方案二:
自己写一个js读取本地硬盘的选择框, 缺点是外观上较上一个差一些. <html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>无标题文档</title> 
</head> 
<body> 
<table border="0" cellpadding="0" width="100%" id="tb_show"> 
<tr> 
<td width="18%">文件保存位置:</td> 
<td width="82%"> 
<%--<html:file property="file" size="40" styleClass="inputbox"/>--%> 
<input name="backDir" type="text" value ="C:\" size="100" width="500"> 
</td> 
</tr> <tr> 
<td>目录位置:</td> 
<td> 
<select name="tables_drive" id="tables_drives" onchange="get_drives()" ></select> 
</td> 
</tr> 
<tr> 
<td colspan="2"> 
<select name="table_folder" id="table_folder" size="10" multiple ondblclick="get_file()"></select> 
</td> 
</tr> 
<tr> 
<td colspan="2"> 
<font color="red">说明:双击列表框的一个选项,就将该文件夹下面的文件夹显示在该列表框中。第一个就是根目录</font> 
</td> 
</tr> 
</table> 
</body> 
</html> 
<script> 
/**//* 
*初始化,将系统所有的驱动器放入table_drives列表 
*/ 
window.onload = new function init() 
{ 
var fso, s, n, e, x; 
fso = new ActiveXObject("Scripting.FileSystemObject"); 
e = new Enumerator(fso.Drives); 
s = ""; 
for (; !e.atEnd(); e.moveNext()) 
{ 
x = e.item(); 
s = s + x.DriveLetter; 
s += ":"; 
if (x.DriveType == 3) 
n = x.ShareName; 
else if (x.IsReady) 
n = x.VolumeName; 
else 
n = "[驱动器未就绪]"; 
s += n + ","; 
} 
var drives = s.split(","); 
var tableDrives = document.getElementById("tables_drives"); 
for ( var i = 0; i < drives.length-1; i++ ) 
{ 
var option = document.createElement("OPTION"); 
drives[i].split(":"); 
option.value = "["+drives[i].split(":")[0]+":]"+drives[i].split(":")[1]; 
option.text = "["+drives[i].split(":")[0]+":]"+drives[i].split(":")[1]; 
tableDrives.add(option); 
} 
} 
/**//* 
*tables_drives列表中选中的驱动器上所有文件夹放入table_folder列表中 
*/ 
function get_drives() 
{ 
var tableDrives = document.getElementById("tables_drives"); 
var tableFolders = document.getElementById("table_folder"); 
for ( var i = 0; i < tableDrives.options.length; i++ ) 
{ 
if ( tableDrives.options[i].selected == true ) 
{ 
var fso, f, fc, s; 
var drive = tableDrives.options[i].value.split(":")[0].substring(1,tableDrives.options[i].value.split(":")[0].length); 
document.getElementById("backDir").value = drive + ":\\"; 
fso = new ActiveXObject("Scripting.FileSystemObject"); 
if (fso.DriveExists(drive)) 
{ 
d = fso.GetDrive(drive); 
if ( d.IsReady ) 
{ 
f = fso.GetFolder(d.RootFolder); 
fc = new Enumerator(f.SubFolders); 
s = ""; 
for (;!fc.atEnd(); fc.moveNext()) 
{ 
s += fc.item(); 
s += ","; 
} 
var len = tableFolders.options.length; 
while(len >= 0) 
{ 
tableFolders.options.remove(len); 
len--; 
} 
var option = document.createElement("OPTION"); 
option.value = drive + ":\\"; 
option.text = drive + ":\\"; 
tableFolders.add(option); 
var folders = s.split(","); 
for ( j = 0; j < folders.length -1; j++) 
{ 
option = document.createElement("OPTION"); 
option.value = folders[j]; 
option.text = folders[j]; 
tableFolders.add(option); 
} 
} 
else 
{ 
alert("无法改变当前内容!") 
} 
} 
else 
return false; 
} 
} 
} 
/**//* 
*table_folder双击选项中的一个选项,就将该文件夹下面的文件夹显示在table_folder列表中。 
*/ 
function get_file() 
{ 
var tableFolders = document.getElementById("table_folder"); 
var tableDrives = document.getElementById("tables_drives"); 
for ( var i = 0; i < tableFolders.options.length; i++ ) 
{ 
if ( tableFolders.options[i].selected == true ) 
{ 
var fso, f, fc, s; 
var folderpath = tableFolders.options[i].value.substring(0,tableFolders.options[i].value.length); 
if ( folderpath.charAt(folderpath.length-1) == "\\" ) 
{ 
document.getElementById("backDir").value = folderpath; 
} 
else 
{ 
document.getElementById("backDir").value = folderpath + "\\"; 
} 

fso = new ActiveXObject("Scripting.FileSystemObject"); 
f = fso.GetFolder(folderpath); 
fc = new Enumerator(f.SubFolders); 
s = ""; 
for (;!fc.atEnd(); fc.moveNext()) 
{ 
s += fc.item(); 
s += ","; 
} 
var len = tableFolders.options.length; 
while(len >= 0) 
{ 
tableFolders.options.remove(len); 
len--; 
} 
var opt = ""; 
var opt1 = ""; 
for ( j = 0; j < folderpath.split("\\").length; j++ ) 
{ 
var option = document.createElement("OPTION"); 
opt = opt + folderpath.split("\\")[j]+"\\"; 
if ( j > 0) 
{ 
opt1 = opt; 
option.value = opt1.substring(0,opt1.length-1); 
option.text = opt1.substring(0,opt1.length-1); 
tableFolders.add(option); 
} 
else 
{ 
option.value = opt; 
option.text = opt; 
tableFolders.add(option); 
} 
} 
if ( tableFolders.options[0].value == tableFolders.options[1].value ) 
{ 
tableFolders.options.remove(1); 
} 
if ( s != "" ) 
{ 
var folders = s.split(","); 
for ( j = 0; j < folders.length -1; j++) 
{ 
option = document.createElement("OPTION"); 
option.value = folders[j]; 
option.text = folders[j]; 
tableFolders.add(option); 
} 
} 
} 
} 
} 
</script>

如果您还有好的解决方案,回帖分享一下吧.
Javascript 相关文章推荐
JavaScript中的事件处理
Jan 16 Javascript
遍历jquery对象的代码分享
Nov 02 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
Feb 07 Javascript
javascript的alert box在java中如何显示多行
May 18 Javascript
网站基于flash实现的Banner图切换效果代码
Oct 14 Javascript
javascript内置对象操作详解
Feb 04 Javascript
jQuery控制Div拖拽效果完整实例分析
Apr 15 Javascript
JavaScript中捕获与冒泡详解及实例
Feb 03 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
Feb 09 Javascript
简化vuex的状态管理方案的方法
Jun 02 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
Sep 19 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
Feb 05 Javascript
页面中body onload 和 window.onload 冲突的问题的解决
Jul 01 #Javascript
JavaScript XML操作 封装类
Jul 01 #Javascript
js 跨域和ajax 跨域问题小结
Jul 01 #Javascript
javawscript 三级菜单的实现原理
Jul 01 #Javascript
Javascript 函数对象的多重身份
Jun 28 #Javascript
Javascript 阻止javascript事件冒泡,获取控件ID值
Jun 27 #Javascript
event对象的方法 兼容多浏览器
Jun 27 #Javascript
You might like
PHP5 安装方法
2007/01/15 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
js 弹出菜单/窗口效果
2011/10/30 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
JS实现百度搜索框
2021/02/25 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
python实现的解析crontab配置文件代码
2014/06/30 Python
python使用电子邮件模块smtplib的方法
2016/08/28 Python
python编程嵌套函数实例代码
2018/02/11 Python
python3获取当前目录的实现方法
2019/07/29 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
Python插件机制实现详解
2020/05/04 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
公开服务承诺制度
2014/03/26 职场文书
优秀员工推荐信
2014/05/10 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
先进个人材料怎么写
2014/12/30 职场文书
中秋节祝酒词
2015/08/12 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏