是否可以<input type='file' />
使用jQuery 清除控件值?我尝试了以下方法:
$('#control').attr({ value: '' });
但这不起作用。
是否可以<input type='file' />
使用jQuery 清除控件值?我尝试了以下方法:
$('#control').attr({ value: '' });
但这不起作用。
Answers:
简易:<form>
将元素环绕起来,在表单上调用reset,然后使用删除表单.unwrap()
。与.clone()
该线程中其他解决方案不同的是,最后得到的元素相同(包括在其上设置的自定义属性)。
经过测试并可以在Opera,Firefox,Safari,Chrome和IE6 +中运行。也适用于其他类型的表单元素,但除外type="hidden"
。
window.reset = function(e) {
e.wrap('<form>').closest('form').get(0).reset();
e.unwrap();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
<input id="file" type="file">
<br>
<input id="text" type="text" value="Original">
</form>
<button onclick="reset($('#file'))">Reset file</button>
<button onclick="reset($('#text'))">Reset text</button>
如下面的Timo所述,如果您有按钮来触发重置内部的字段,则<form>
必须调用.preventDefault()
该事件以防止<button>
触发提交。
由于未修复的错误,因此无法在IE 11中运行。文本(文件名)在输入中被清除,但其File
列表仍被填充。
快速解答:更换它。
在下面的代码中,我使用replaceWith
jQuery方法将控件替换为其自身的副本。如果您有任何绑定到此控件上事件的处理程序,我们也要保留这些处理程序。为此,我们将其true
作为方法的第一个参数传入clone
。
<input type="file" id="control"/>
<button id="clear">Clear</button>
var control = $("#control");
$("#clear").on("click", function () {
control.replaceWith( control = control.clone( true ) );
});
小提琴:http : //jsfiddle.net/jonathansampson/dAQVM/
如果克隆在保留事件处理程序的同时出现任何问题,您可以考虑使用事件委托来处理父元素对此控件的单击:
$("form").on("focus", "#control", doStuff);
这样可以避免在刷新控件时将任何处理程序与元素一起克隆。
input.value = null;
jQuery应该为您解决跨浏览器/旧版浏览器的问题。
这在我测试过的现代浏览器上有效:Chromium v25,Firefox v20,Opera v12.14
使用jQuery 1.9.1
的HTML
<input id="fileopen" type="file" value="" />
<button id="clear">Clear</button>
jQuery的
$("#clear").click(function () {
$("#fileopen").val("");
});
以下javascript解决方案也适用于上述浏览器。
document.getElementById("clear").addEventListener("click", function () {
document.getElementById("fileopen").value = "";
}, false);
我没有办法用IE进行测试,但是从理论上讲这应该可行。如果IE的差异足够大,以至于Java版本由于MS的使用方式不同而无法运行,那么我认为jquery方法应该为您处理它,否则值得将它与jquery团队一起向jquery团队指出。 IE所需的方法。(我看到有人说“这不适用于IE”,但没有任何普通的JavaScript来显示它如何在IE上起作用(应该是“安全功能”?),也许也将它报告为MS的错误(如果他们愿意的话)算一下),以便在任何较新的版本中得到修复)
if ($.browser.msie) {
$('#file').replaceWith($('#file').clone());
} else {
$('#file').val('');
}
但是jquery现在已经删除了对浏览器测试的支持jquery.browser。
这个javascript解决方案也对我有用,它等效于jquery.replaceWith方法。
document.getElementById("clear").addEventListener("click", function () {
var fileopen = document.getElementById("fileopen"),
clone = fileopen.cloneNode(true);
fileopen.parentNode.replaceChild(clone, fileopen);
}, false);
需要注意的重要一点是cloneNode方法不会保留关联的事件处理程序。
请参阅此示例。
document.getElementById("fileopen").addEventListener("change", function () {
alert("change");
}, false);
document.getElementById("clear").addEventListener("click", function () {
var fileopen = document.getElementById("fileopen"),
clone = fileopen.cloneNode(true);
fileopen.parentNode.replaceChild(clone, fileopen);
}, false);
但是jquery.clone提供了此[* 1]
$("#fileopen").change(function () {
alert("change");
});
$("#clear").click(function () {
var fileopen = $("#fileopen"),
clone = fileopen.clone(true);
fileopen.replaceWith(clone);
});
[* 1]如果事件是通过jquery的方法添加的,则jquery能够执行此操作,因为它在jquery.data中保留了一个副本,否则它将无法正常工作,因此有点作弊/变通,这意味着事情不可行在不同的方法或库之间兼容。
document.getElementById("fileopen").addEventListener("change", function () {
alert("change");
}, false);
$("#clear").click(function () {
var fileopen = $("#fileopen"),
clone = fileopen.clone(true);
fileopen.replaceWith(clone);
});
您不能直接从元素本身获取附加的事件处理程序。
这是普通javascript的一般原理,这是jquery和其他所有库的大致用法。
(function () {
var listeners = [];
function getListeners(node) {
var length = listeners.length,
i = 0,
result = [],
listener;
while (i < length) {
listener = listeners[i];
if (listener.node === node) {
result.push(listener);
}
i += 1;
}
return result;
}
function addEventListener(node, type, handler) {
listeners.push({
"node": node,
"type": type,
"handler": handler
});
node.addEventListener(type, handler, false);
}
function cloneNode(node, deep, withEvents) {
var clone = node.cloneNode(deep),
attached,
length,
evt,
i = 0;
if (withEvents) {
attached = getListeners(node);
if (attached) {
length = attached.length;
while (i < length) {
evt = attached[i];
addEventListener(clone, evt.type, evt.handler);
i += 1;
}
}
}
return clone;
}
addEventListener(document.getElementById("fileopen"), "change", function () {
alert("change");
});
addEventListener(document.getElementById("clear"), "click", function () {
var fileopen = document.getElementById("fileopen"),
clone = cloneNode(fileopen, true, true);
fileopen.parentNode.replaceChild(clone, fileopen);
});
}());
当然,jquery和其他库具有维护此类列表所需的所有其他支持方法,这只是一个演示。
.val('')
。这不仅比克隆上载元素或添加嵌套表单还要简单吗?+1。
.val("")
谢谢您,第一个JQuery解决方案(使用)运行良好。比克隆输入并替换它要简单得多。
出于明显的安全原因,您无法设置文件输入的值,甚至不能设置为空字符串。
您所要做的就是重置表单所在的字段,或者如果您只想重置包含其他字段的表单的文件输入,请使用以下命令:
function reset_field (e) {
e.wrap('<form>').parent('form').trigger('reset');
e.unwrap();
}
这是一个示例:http : //jsfiddle.net/v2SZJ/1/
这对我有用。
$("#file").replaceWith($("#file").clone());
http://forum.jquery.com/topic/how-to-clear-a-file-input-in-ie
希望能帮助到你。
在IE8中,为了安全起见,他们将“文件上载”字段设为只读。参见IE团队博客文章:
从历史上看,HTML文件上传控件()已成为大量信息泄露漏洞的源头。为了解决这些问题,对控件的行为进行了两项更改。
为了阻止依靠“窃取”击键来暗中诱骗用户在控件中键入本地文件路径的攻击,“文件路径”编辑框现在为只读。用户必须使用“文件浏览”对话框明确选择要上传的文件。
此外,“ Internet区域”中的“上传文件时包括本地目录路径” URLAction已设置为“禁用”。此更改可防止将潜在敏感的本地文件系统信息泄漏到Internet。例如,Internet Explorer 8现在仅提交文件名image.png,而不是提交完整路径C:\ users \ ericlaw \ documents \ secret \ image.png。
我在这里遇到了所有选择。这是我制作的一个有效的技巧:
<form>
<input type="file">
<button type="reset" id="file_reset" style="display:none">
</form>
并且您可以使用类似以下代码的jQuery触发重置:
$('#file_reset').trigger('click');
(jsfiddle:http : //jsfiddle.net/eCbd6/)
我结束了这个:
if($.browser.msie || $.browser.webkit){
// doesn't work with opera and FF
$(this).after($(this).clone(true)).remove();
}else{
this.setAttribute('type', 'text');
this.setAttribute('type', 'file');
}
可能不是最优雅的解决方案,但据我所知,它仍然有效。
我使用过https://github.com/malsup/form/blob/master/jquery.form.js,它具有一个名为的功能clearInputs()
,该功能是跨浏览器,经过良好测试,易于使用并且还可以处理IE问题和清除隐藏字段如果需要的话。可能只需要清除文件输入的解决方案就比较长,但是如果要处理跨浏览器文件上传,则建议使用此解决方案。
用法很简单:
//清除所有文件字段: $(“ input:file”)。clearInputs(); //清除隐藏的字段: $(“ input:file”)。clearInputs(true); //清除特定字段: $(“#myfilefield1,#myfilefield2”)。clearInputs();
/ ** *清除选定的表单元素。 * / $ .fn.clearFields = $ .fn.clearInputs = function(includeHidden){ var re = / ^(?: color | date | datetime | email | month | number | password | range | search | tel | text | time | url | week)$ / i; //'hidden'不在此列表中 返回this.each(function(){ var t = this.type,tag = this.tagName.toLowerCase(); 如果(re.test(t)||标签=='textarea'){ this.value =''; } 否则if(t =='checkbox'|| t =='radio'){ this.checked = false; } 否则if(tag =='select'){ this.selectedIndex = -1; } 否则,如果(t ==“文件”){ 如果(/MSIE/.test(navigator.userAgent)){ $(this).replaceWith($(this).clone(true)); }其他{ $(this).val(''); } } 否则,如果(includeHidden){ // includeHidden可以为true,也可以为选择器字符串 //表示特殊测试;例如: // $('#myForm')。clearForm('。special:hidden') //上面的代码将清除具有“特殊”类的隐藏输入 如果((includeHidden === true && /hidden/.test(t))|| (typeof includeHidden =='字符串'&& $(this).is(includeHidden))) this.value =''; } }); };
文件输入的值是只读的(出于安全原因)。您不能以编程方式将其清空(除非调用窗体的reset()方法,该方法的作用域不仅限于该字段)。
我一直在寻找清除HTML文件输入的简单干净的方法,上面的答案很不错,但是没有一个能真正回答我想要的答案,直到我在网上找到了一种简单而优雅的方法:
var $input = $("#control");
$input.replaceWith($input.val('').clone(true));
所有的功劳归克里斯·科耶尔(Chris Coyier)。
// Referneces
var control = $("#control"),
clearBn = $("#clear");
// Setup the clear functionality
clearBn.on("click", function(){
control.replaceWith( control.val('').clone( true ) );
});
// Some bound handlers to preserve when cloning
control.on({
change: function(){ console.log( "Changed" ) },
focus: function(){ console.log( "Focus" ) }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="control">
<br><br>
<a href="#" id="clear">Clear</a>
该.clone()
事都没有工作在Opera(和其他)。它保留内容。
对我而言,最接近的方法是乔纳森(Jonathan)的早期方法,但是要确保在我的情况下,该字段保留其名称,类等用于混乱代码。
这样的事情可能会很好地工作(也要感谢Quentin):
function clearInput($source) {
var $form = $('<form>')
var $targ = $source.clone().appendTo($form)
$form[0].reset()
$source.replaceWith($targ)
}
我设法使用以下方法来使其工作...
function resetFileElement(ele)
{
ele.val('');
ele.wrap('<form>').parent('form').trigger('reset');
ele.unwrap();
ele.prop('files')[0] = null;
ele.replaceWith(ele.clone());
}
这已经在IE10,FF,Chrome和Opera中进行了测试。
有两个警告...
在FF中仍然无法正常工作,如果刷新页面,则文件元素会重新填充所选文件。从哪里获取此信息超出了我的范围。我还可以尝试清除与文件输入元素有关的其他内容吗?
切记对您附加到文件输入元素的任何事件都使用委托,这样在进行克隆时它们仍然起作用。
我不明白,到底是谁想到不允许您从无效的不可接受的文件选择中清除输入字段是一个好主意?
好的,不要让我动态地为它设置一个值,这样我就不能从用户的操作系统中浸出文件,而是让我清除无效的选择而不重置整个表单。
并不是说“接受”除了过滤器之外还没有做任何其他事情,在IE10中,它甚至不了解MS Word的MIME类型,这是个玩笑!
.pop()
在文件数组上使用而不是将其设置为null。这似乎可以正确清除文件。
我尝试了用户提到的大多数技术,但是它们都不在所有浏览器中都有效。即:clone()在FF中不适用于文件输入。我最终手动复制了文件输入,然后用复制的文件替换了原始文件。它适用于所有浏览器。
<input type="file" id="fileID" class="aClass" name="aName"/>
var $fileInput=$("#fileID");
var $fileCopy=$("<input type='file' class='"+$fileInput.attr("class")+" id='fileID' name='"+$fileInput.attr("name")+"'/>");
$fileInput.replaceWith($fileCopy);
$("input[type=file]").wrap("<div id='fileWrapper'/>");
$("#fileWrapper").append("<div id='duplicateFile' style='display:none'>"+$("#fileWrapper").html()+"</div>");
$("#fileWrapper").html($("#duplicateFile").html());
这适用于Chrome,FF和Safari
$("#control").val("")
可能不适用于IE或Opera
使它异步,并在完成按钮的所需操作后将其重置。
<!-- Html Markup --->
<input id="btn" type="file" value="Button" onchange="function()" />
<script>
//Function
function function(e) {
//input your coding here
//Reset
var controlInput = $("#btn");
controlInput.replaceWith(controlInput = controlInput.val('').clone(true));
}
</script>
function clear() {
var input = document.createElement("input");
input.setAttribute('type', 'file');
input.setAttribute('value', '');
input.setAttribute('id', 'email_attach');
$('#email_attach').replaceWith( input.cloneNode() );
}
它对我不起作用:
$('#Attachment').replaceWith($(this).clone());
or
$('#Attachment').replaceWith($('#Attachment').clone());
所以在ASP MVC中,我使用剃须刀功能来替换文件输入。首先,使用ID和Name为输入字符串创建一个变量,然后将其用于页面显示并在重置按钮单击时替换:
@{
var attachmentInput = Html.TextBoxFor(c => c.Attachment, new { type = "file" });
}
@attachmentInput
<button type="button" onclick="$('#@(Html.IdFor(p => p.Attachment))').replaceWith('@(attachmentInput)');">--</button>
reset()
为例如。reset2()
,因为至少在Chrome中清除了所有字段(如果已清除)reset()
。并在清除调用后添加event.preventDefault()以防止提交。这种方式:<button onclick="reset2($('#file'));event.preventDefault()">Reset file</button>
。工作示例:jsfiddle.net/rPaZQ/23。