编程开发 > ASP > 文章内容

简便无刷新文件上传系统(三)

2010-11-3编辑:dan

【file的reset】

在实例里,有一个用来重置file控件的ResetFile函数。

重置file控件一般的办法是使所在的form执行reset,但问题是会把其他表单控件也重置了。以前由于安全问题,file的value是不允许修改的。但现在ff,chrome和safari可以把它设为空值来实现重置:file.value = "";

当然其他值还是不允许的。ps:记忆中以前是不行的,不知有没有记错。对于opera,有一个变通的方法,利用它的type属性:file.type = "text"; file.type = "file";

通过修改type得到的file控件,value会自动还原成空值,这样就间接把file控件清空了。ps:利用这个方法可以间接得到文件路径,但由于变回去后值就清空了,所以没什么用。

而ie的表单控件的type设置后是不允许修改的,不能用opera的办法。不过还是有以下方法解决:

1,新建一个form,把file插进入后reset,再移除:

以下为引用的内容:
with(file.parentNode.insertBefore(document.createElement('form'), file)){
    appendChild(file); reset(); removeNode(false);
}

好处是使用原生的reset,稳定可靠,但效率低。ps:removeNode只有ie和opera支持,如需兼容可改用removeChild的方式。

2,利用outerHTML,重建一个file控件:file.outerHTML = file.outerHTML; 好处是高效,但由于是新创建的file控件,之前关联的东西都丢失了。

3,利用cloneNode,复制一个file控件:file.parentNode.replaceChild(file.cloneNode(false), file);  跟上一个方法差不多,但效率更低。

4,利用select方法选中file控件的文本域,再进行清空:file.select(); document.selection.clear(); 或 file.select(); document.selection.clear();

基本没有问题,但file必须能被select(不能是隐藏状态)。ps:这两个方法都只能在ie使用。

由于程序中file是需要关联的,所以方法2和3都不能用。方法4貌似也不错,但有一个致命问题,在ie测试以下代码:

以下为引用的内容:
<form><input id="test" name="file" type="file"></form>
<script>
document.getElementById("test").onchange = function(){
    this.select(); document.selection.clear();
    this.form.submit();
}
</script>

执行到submit会显示“拒绝访问”的错误,看来ie早就猜到这种“诡计”不允许这样操作了。

看来也只能使用方法1了:

以下为引用的内容:
function ResetFile(file){
    file.value = "";//ff chrome safari
    if ( file.value ) {
        if ( $$B.ie ) {//ie
            with(file.parentNode.insertBefore(document.createElement('form'), file)){
                appendChild(file); reset(); removeNode(false);
            }
        } else {//opera
            file.type = "text"; file.type = "file";
        }
    }
}

ps:有更好方法的话记得告诉我啊。

这个函数并不够通用,最好还是根据实际情况选择需要的方法。

简便无刷新文件上传系统(二)

热点推荐

登录注册
触屏版电脑版网站地图