使用jQuery清除

2020/09/24 12:21 · javascript ·  · 0评论

是否可以<input type='file' />使用jQuery 清除控件值?我尝试了以下方法:

$('#control').attr({ value: '' }); 

但这不起作用。

简易:<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>

JSFiddle

如下面的Timo所述,如果您有按钮来触发重置内部的字段,则<form>必须调用.preventDefault()该事件以防止<button>触发提交。


编辑

由于未修复的错误,因此无法在IE 11中运行。文本(文件名)在输入中被清除,但其File列表仍被填充。

快速解答:更换它。

在下面的代码中,我使用replaceWithjQuery方法将控件替换为其自身的副本。如果您有任何绑定到此控件上事件的处理程序,我们也要保留这些处理程序。为此,我们将其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);

这样可以避免在刷新控件时将任何处理程序与元素一起克隆。

jQuery应该为您解决跨浏览器/旧浏览器的问题。

该功能适用​​于我测试过的现代浏览器:Chromium v​​25,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("");
});

jsfiddle上

以下javascript解决方案在上面提到的浏览器上也对我有用。

document.getElementById("clear").addEventListener("click", function () {
    document.getElementById("fileopen").value = "";
}, false);

jsfiddle上

我没有办法用IE进行测试,但是从理论上讲这应该可行。如果IE的不同之处足以使Java版本不能运行,因为MS采取了不同的方式,那么我认为jquery方法应该为您处理它,否则值得将其与jquery团队一起向jquery团队指出。 IE所需的方法。(我看到有人说“这在IE上不起作用”,但是没有任何普通的JavaScript来显示它如何在IE上起作用(应该是“安全功能”?),也许也将其报告为MS的错误(如果他们愿意算一下),以便在任何较新的版本中都得到修复)

就像在另一个答案中提到的,jquery论坛上的帖子

 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);

jsfiddle上

需要注意的重要一点是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);

jsfiddle上

但是jquery.clone提供了此[* 1]

$("#fileopen").change(function () {
    alert("change");
});

$("#clear").click(function () {
    var fileopen = $("#fileopen"),
        clone = fileopen.clone(true);

    fileopen.replaceWith(clone);
});

jsfiddle上

[* 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);
});

jsfiddle上

您不能直接从元素本身获取附加的事件处理程序。

这是普通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);
    });
}());

jsfiddle上

当然,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。

$("#control").val('')是你所需要的全部!使用JQuery 1.11在Chrome上进行了测试

其他用户也已经在Firefox中进行了测试。

我在这里遇到了所有选择。这是我所做的一个有效的技巧:

<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()方法,该方法的作用域不仅限于该字段)。

我能够使用以下代码进行操作:

var input = $("#control");    
input.replaceWith(input.val('').clone(true));

我一直在寻找清除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中进行了测试。

有两个警告...

  1. 在FF中仍然无法正常工作,如果刷新页面,则文件元素会重新填充所选文件。从哪里获取此信息超出了我的范围。我还可以尝试清除与文件输入元素有关的其他内容吗?

  2. 切记对已附加到文件输入元素的任何事件都使用委托,这样在进行克隆时它们仍然起作用。

我不明白,到底是谁想到不允许您从无效的不可接受的文件选择中清除输入字段是一个好主意?

好的,不要让我动态地为它设置一个值,这样我就不能从用户的操作系统中浸出文件,而是让我清除无效的选择而不重置整个表单。

并不是说“ accept”除了过滤器之外什么都不做,在IE10中,它甚至不理解MS Word的mime类型,这是在开玩笑!

在我的Firefox 40.0.3上仅与此兼容

 $('input[type=file]').val('');
 $('input[type=file]').replaceWith($('input[type=file]').clone(true));

它适用于所有浏览器。

        var input = $(this);
        var next = this.nextSibling;
        var parent = input.parent();
        var form = $("<form></form>");
        form.append(input);
        form[0].reset();
        if (next) {
            $(next).before(input);
        } else {
            parent.append(input);
        }

我尝试了用户提到的大多数技术,但是它们都不在所有浏览器中都有效。即: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>

一种简单的方法是更改​​输入类型,然后再次将其更改回。

像这样:

var input = $('#attachments');
input.prop('type', 'text');
input.prop('type', 'file')

您可以像这样用它的克隆替换它

var clone = $('#control').clone();

$('#control').replacewith(clone);

但这也克隆了它的价值,所以您最好像这样

var emtyValue = $('#control').val('');
var clone = emptyValue.clone();

$('#control').replacewith(clone);

这很简单(在所有浏览器中均可使用[歌剧除外]):

$('input[type=file]').each(function(){
    $(this).after($(this).clone(true)).remove();
});

JS小提琴:http//jsfiddle.net/cw84x/1/

什么?在您的验证功能中,只需输入

document.onlyform.upload.value="";

假设上传是名称:

<input type="file" name="upload" id="csv_doc"/>

我正在使用JSP,不确定是否会有所不同...

为我工作,我认为这更容易。

本文地址:http://javascript.askforanswer.com/shiyongjqueryqingchu.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!