如果有其他参数要传递,程序会使用_setInput函数来创建传递数据的表单控件。 由于生成的form里面只有file控件,要传递其他参数只能用程序生成了。 首先根据自定义的parameter属性创建表单控件: Code
for ( name in this.parameter ) { var input = form[name]; if ( !input ) { input = document.createElement("input"); input.name = name; input.type = "hidden"; form.appendChild(input); } input.value = this.parameter[name]; newInputs[name] = input; delete oldInputs[name]; }
然后移除oldInputs关联的控件: for ( name in oldInputs ) { form.removeChild( oldInputs[name] ); }
这样就能移除上一次生成的无用的控件了。 最后重新记录当前控件到_inputs方便下次使用。
如果想停止当前上传操作,可以调用stop方法。 一般来说当iframe发生重载时,会取消上一次的载入,那么只要重新设置src就能取消上传了。 Code
<body>
<iframe id="ifr" name="ifr"></iframe> <form action="http://cloudgamer.cnblogs.com/" target="ifr"> </form> </body> <script> document.forms[0].submit(); document.getElementById("ifr").src = ""; </script>
当使用结束或其他原因要清除程序时,可以调用remove方法。 remove里面主要做的是清除iframe和form。 var iframe = this._iframe;
$$B.ie ? iframe.detachEvent( "onload", this._fFINISH ) : ( iframe.onload = null ); document.body.removeChild(iframe); this._iframe = null; 十分简单,但在ff有一个问题,测试以下代码: Code
<form target="ifr" action="x"> <input id="btn" type="submit" value="click"> </form> <iframe name="ifr" id="ifr"></iframe> <script> document.getElementById("btn").onclick = function(){ document.getElementById("ifr").onload = function(){ this.parentNode.removeChild(this); }; } </script>
if ( $$B.firefox ) {
setTimeout($$F.bind(this._removeIframe, this), 0); } else { this._removeIframe(); }
var form = this._form, parent = form.parentNode;
if ( parent ) { parent.insertBefore(this.file, form); parent.removeChild(form); } this._form = this._inputs = null;
在实例里,有一个用来重置file控件的ResetFile函数。 重置file控件一般的办法是使所在的form执行reset,但问题是会把其他表单控件也重置了。 file.value = "";
当然其他值还是不允许的。 对于opera,有一个变通的方法,利用它的type属性: file.type = "text"; file.type = "file";
通过修改type得到的file控件,value会自动还原成空值,这样就间接把file控件清空了。 而ie的表单控件的type设置后是不允许修改的,不能用opera的办法。 with(file.parentNode.insertBefore(document.createElement('form'), file)){
appendChild(file); reset(); removeNode(false); } 好处是使用原生的reset,稳定可靠,但效率低。 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(不能是隐藏状态)。 由于程序中file是需要关联的,所以方法2和3都不能用。 Code
<form><input id="test" name="file" type="file"></form> <script> document.getElementById("test").onchange = function(){ this.select(); document.selection.clear(); this.form.submit(); } </script>
看来也只能使用方法1了: Code
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:有更好方法的话记得告诉我啊。 这个函数并不够通用,最好还是根据实际情况选择需要的方法。
【上传文件数】 在文件上传实例中,各个文件是同时上传的。 【传递参数】 上传文件实例中,可以传递对应的修改文件名,在使用“一般上传”多个文件一起上传时也能找到对应的文件名。 【回调函数】 有两个方法可以响应上传完成回调函数。 【处理返回数据】 上面提到,可以在onFinish中处理在iframe中输出的数据。 try{
var info = eval("(" + iframe.contentWindow.document.body.innerHTML + ")"); show("上传完成"); }catch(e){ show("上传失败"); stop(); return; } 只有返回正确的json格式数据才能正常运行,否则就抛出错误,间接地排除了404等错误信息。 |