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 相关文章推荐
禁止刷新,回退的JS
Nov 25 Javascript
JavaScript Perfection kill 测试及答案
Mar 23 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
Oct 27 Javascript
侧栏跟随滚动的简单实现代码
Mar 18 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
Sep 21 Javascript
Jquery日期选择datepicker插件用法实例分析
Jun 08 Javascript
js实现点击向下展开的下拉菜单效果代码
Sep 01 Javascript
js仿搜狐视频记录片列表展示效果
May 30 Javascript
JSONP原理及应用实例详解
Sep 13 Javascript
vue实现自定义H5视频播放器的方法步骤
Jul 01 Javascript
js getBoundingClientRect使用方法详解
Jul 17 Javascript
vue+elementUI动态生成面包屑导航教程
Nov 04 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
关于PHP实现异步操作的研究
2013/02/03 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
jQuery实现大图轮播
2017/02/13 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
vue中监听返回键问题
2019/08/28 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
python中for语句简单遍历数据的方法
2015/05/07 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
python实现上传下载文件功能
2020/11/19 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
出国导师推荐信
2014/01/16 职场文书
2014年元旦活动方案
2014/02/15 职场文书
校园歌咏比赛主持词
2014/03/18 职场文书
信仰心得体会
2014/09/05 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
财务会计求职信范文
2015/03/20 职场文书
毕业实习感受与体会
2015/05/26 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB