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中cookie的使用详细分析
May 28 Javascript
JS小框架 fly javascript framework
Nov 26 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
Jan 16 Javascript
Javascript Throttle &amp; Debounce应用介绍
Mar 19 Javascript
AspNet中使用JQuery上传插件Uploadify详解
May 20 Javascript
bootstrap实现的自适应页面简单应用示例
Mar 09 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
Mar 23 Javascript
Vue路由跳转问题记录详解
Jun 15 Javascript
JS实现移动端按首字母检索城市列表附源码下载
Jul 05 Javascript
微信小程序实现两个页面传值的方法分析
Dec 11 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
May 14 Javascript
ztree+ajax实现文件树下载功能
May 18 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
相对路径转化成绝对路径
2007/04/10 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
深入php self与$this的详解
2013/06/08 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
laravel批量生成假数据的方法
2019/10/09 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
javascript验证内容为数字以及长度为10的简单实例
2016/08/20 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
详解tween.js 中文使用指南
2018/01/05 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
Vue3为什么这么快
2020/09/23 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
Python 操作MySQL详解及实例
2017/04/30 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
python实现飞机大战微信小游戏
2020/03/21 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
专科毕业生求职简历的自我评价
2013/10/12 职场文书
机关财务管理制度
2014/01/17 职场文书
中华魂演讲稿
2014/05/13 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书