[javascript] jQuery를 사용하여 <input type = ‘file’/> 지우기

<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 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("");
});

jsfiddle

다음 자바 스크립트 솔루션은 위의 브라우저에서 저에게 효과적이었습니다.

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

jsfiddle

IE로 테스트 할 방법이 없지만 이론적으로는 작동합니다. MS가 다른 방식으로 수행했기 때문에 IE가 Javascript 버전이 작동하지 않을만큼 충분히 다른 경우 jquery 메소드는 귀하를 대신하여 처리해야합니다. 그렇지 않으면 jquery 팀과 함께 jquery 팀을 지적 할 가치가 있습니다. IE가 요구하는 방법. ( “IE에서는 작동하지 않을 것”이라고 말하는 사람들이 있지만 IE에서 작동하는 방식을 보여주는 바닐라 자바 ​​스크립트 (아마도 “보안 기능”?)는없는 것으로 보입니다. 아마도 MS에게도 버그로보고 할 것입니다. 최신 릴리스에서 수정되도록))

다른 답변에서 언급했듯이 jquery 포럼 의 게시물

 if ($.browser.msie) {
      $('#file').replaceWith($('#file').clone());
 } else {
      $('#file').val('');
 }

그러나 jquery는 이제 브라우저 테스트 jquery.browser에 대한 지원을 제거 했습니다.

이 자바 스크립트 솔루션도 저에게 효과적이었습니다 .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

첨부 된 이벤트 핸들러를 요소 자체에서 직접 가져올 수 없습니다.

여기에 바닐라 자바 ​​스크립트의 일반적인 원칙이 있습니다. 이것은 다른 모든 라이브러리에서 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 파일 업로드 컨트롤 ()은 수많은 정보 유출 취약점의 원인이었습니다. 이러한 문제를 해결하기 위해 컨트롤의 동작이 두 가지로 변경되었습니다.

사용자가 컨트롤에 로컬 파일 경로를 입력하도록 속이는 “스틸 링”키 입력에 의존하는 공격을 차단하기 위해 이제 파일 경로 편집 상자가 읽기 전용입니다. 파일 찾아보기 대화 상자를 사용하여 업로드 할 파일을 명시 적으로 선택해야합니다.

또한 인터넷 영역에 대해 “파일을 업로드 할 때 로컬 디렉토리 경로 포함”URLAction이 “사용 안 함”으로 설정되었습니다. 이 변경은 잠재적으로 민감한 로컬 파일 시스템 정보가 인터넷으로 유출되는 것을 방지합니다. 예를 들어, 전체 경로 C : \ users \ ericlaw \ documents \ secret \ image.png를 제출하지 않고 Internet Explorer 8은 이제 파일 이름 image.png 만 제출합니다.


답변

$("#control").val('')당신이 필요한 전부입니다! JQuery 1.11을 사용하여 Chrome에서 테스트

다른 사용자도 Firefox에서 테스트했습니다.