JavaScript로 HTML 파일 입력을 지우려면 어떻게해야합니까?


154

양식에서 파일 입력을 지우고 싶습니다.

소스를 동일한 방법으로 설정하는 방법에 대해 알고 있지만 ...이 방법으로 선택한 파일 경로를 지우지 않습니다.

참고 : 페이지를 다시로드하거나 양식을 재설정하거나 AJAX 호출을 수행하지 않으려 고합니다.

이게 가능해?

답변:


-10

해당 노드를 제거하고 동일한 이름으로 새 노드를 작성하는 것은 어떻습니까?


46
예를 들어주세요.

1
다음과 같이 처리기를 잃게됩니다. var inputPhoto = document.getElementById ( 'photoInput'); inputPhoto.addEventListener ( 'change', handler_file, false);
Rui Martins

누락 된 설명으로 투표했습니다!
Jason

212

자바 스크립트로 파일 입력을 지우는 방법에는 3 가지가 있습니다.

  1. 값 특성을 비어 있거나 널로 설정하십시오.

    IE11 + 및 기타 최신 브라우저에서 작동합니다.

  2. 새 파일 입력 요소를 작성하고 이전 파일 입력 요소를 바꾸십시오.

    단점은 이벤트 리스너와 expando 속성이 손실된다는 것입니다.

  3. form.reset () 메소드를 통해 소유자 양식을 재설정하십시오.

    동일한 소유자 양식의 다른 입력 요소에 영향을주지 않기 위해 비어있는 새 양식을 작성하고 파일 입력 요소를이 새 양식에 추가하고 재설정 할 수 있습니다. 이 방법은 모든 브라우저에서 작동합니다.

자바 스크립트 함수를 작성했습니다. 데모 : http://jsbin.com/muhipoye/1/

function clearInputFile(f){
    if(f.value){
        try{
            f.value = ''; //for IE11, latest Chrome/Firefox/Opera...
        }catch(err){ }
        if(f.value){ //for IE5 ~ IE10
            var form = document.createElement('form'),
                parentNode = f.parentNode, ref = f.nextSibling;
            form.appendChild(f);
            form.reset();
            parentNode.insertBefore(f,ref);
        }
    }
}

1
나중에 생성 된 양식을 제거하지 않아야합니까?
Andrey

1
아니요, 필요 없습니다. 양식 요소가 페이지 문서 트리에 추가되지 않았습니다.
cuixiping

5
프로그래밍 방식으로 요소에 추가 된 이벤트 및 기타 속성을 유지하려는 경우 접근 방식 2 또는 3을 사용하면 경고의 의미를 가질 수 있습니다. 필자의 경우 양식 재설정 후 사라지는 양식 요소에 onclick 이벤트를 추가했습니다. 이 경우 접근 방식 1이 더 좋습니다. (2에 대해서는 언급되었지만 3에 대해서도 발생할 수 있습니다.)
Wolfie Inu

85

tl; dr : 최신 브라우저의 경우

input.value = '';

오래된 답변 :

어때요?

input.type = "text";
input.type = "file";

왜 이것이 웹킷에서 작동 하지 않는지 이해해야 합니다.

어쨌든 이것은 IE9>, Firefox 및 Opera에서 작동합니다.
웹킷의 상황은 파일로 다시 변경할 수없는 것 같습니다.
IE8에서는 보안 예외가 발생합니다.

편집 : 웹 키트, Opera 및 firefox의 경우 다음과 같이 작동합니다.

input.value = '';

(이 제안으로 위의 답변을 확인하십시오)

GC 없이도이 크로스 브라우저를 수행하는 더 깔끔한 방법을 찾을 수 있는지 살펴 보겠습니다.

편집 2 :

try{
    inputs[i].value = '';
    if(inputs[i].value){
        inputs[i].type = "text";
        inputs[i].type = "file";
    }
}catch(e){}

대부분의 브라우저에서 작동합니다. IE <9에서는 작동하지 않습니다.
파이어 폭스 20, 크롬 24, 오페라 12, IE7, IE8, IE9 및 IE10에서 테스트되었습니다.


35

값을로 설정하면 ''모든 브라우저에서 작동하지는 않습니다.

대신 값을 다음 null과 같이 설정하십시오 .

document.getElementById('your_input_id').value= null;

편집 : JS가 파일 입력을 설정하지 못하게하는 매우 유효한 보안상의 이유가 있지만 이미 선택된 출력 을 지우는 간단한 메커니즘을 제공하는 것이 합리적 입니다. 빈 문자열을 사용해 보았지만 모든 브라우저에서 작동하지 않고 NULL시도한 모든 브라우저 (Opera, Chrome, FF, IE11 + 및 Safari)에서 작동했습니다.

편집 : NULL빈 문자열로 설정하는 동안 모든 브라우저 에서 작동 하도록 설정 하지 않았습니다.


6
불행히도 나는 이것을 보지 못했습니다 all browsers... IE8, IE9 또는 IE10에서는 작동하지 않습니다 (그러나 IE11에서는 작동합니다).
freefaller

댕댕 이전 버전의 IE 브라우저는 테스트하지 않았습니다. 죄송합니다.
BigMac66

31

불행히도 위의 답변 중 어느 것도 모든 기초를 다루는 것으로 보이지 않습니다. 적어도 바닐라 자바 ​​스크립트로 테스트하지 않았습니다.

  • .value = null파이어 폭스, 쵸메, 오페라와 IE11에 작업에 나타납니다 (하지만 하지 IE8 / 10분의 9)

  • .cloneNode.clone()FireFox에서 (및 jQuery에서) .value오버 를 복사하는 것처럼 보이 므로 복제본이 무의미합니다.

FireFox (27 및 28), Chrome (33), IE (8, 9, 10, 11), Opera (17)에서 작동하는 바닐라 자바 ​​스크립트 기능은 다음과 같습니다. 이것은 현재 사용 가능한 유일한 브라우저입니다 테스트 할 나에게.

function clearFileInput(ctrl) {
  try {
    ctrl.value = null;
  } catch(ex) { }
  if (ctrl.value) {
    ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);
  }
}

ctrl기능은 다음과 같이 호출 할 수 있도록 매개 변수는 파일 입력 자체가 ...

clearFileInput(document.getElementById("myFileInput"));

1
이것이 답입니다. 이 페이지뿐만 아니라 다른 포럼도 검색하면서이 질문에 대한 답변이 많은 문제 중 하나는 "선택된 3 개의 파일"텍스트를 지울 수 있지만 실제로는 http 파일을 지울 수 없다는 것입니다. 열. 그러면 다음에 업로드하려고 할 때 하나의 파일 만 선택할 수 있으며 더 나쁜 것은 이전 파일 폴더에 저장됩니다. 이 답변은 두 가지를 모두 해결하며 첫 번째 파일 세트를 업로드 한 것처럼 쉽게 다음 파일 세트 업로드를 다시 시작할 수 있습니다.
TARKUS

if문장을 catch블록 안에 넣지 않아야 합니까?
Fahmi

@Fahmi-아니오, 그렇지 않아야합니다.
freefaller

Oh 값을로 설정하려고하면 IE8 / 9 / 10에서 예외가 발생한다고 생각했습니다 null. 퍼팅의 요점 무엇을 설명하는 마음 ctrl.value = null;돌며 try...catch다음 블록은? 새로운 질문에 대해 죄송합니다.
Fahmi

1
ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);-어떤 시점에서 실제로 값 cloneNode을 지우는가?
Fahmi


11

새로운 파일 입력으로 교체해야합니다. 다음은 jQuery로 수행 할 수있는 방법입니다.

var inputFile = $('input[type=field]');
inputFile.wrap('<div />');

입력 필드를 지워야 할 때이 줄을 사용하십시오 (예를 들어 어떤 경우에) :

inputFile.parent().html( inputFile.parent().html() );

원래 요소를 대체하기 위해 다음과 같이 보입니다. stackoverflow.com/questions/1043957/…
Mengdi Gao

9
document.getElementById('your_input_id').value=''

편집 :
이것은 IE와 오페라에서 작동하지 않지만 파이어 폭스, 사파리 및 크롬에서는 작동하는 것 같습니다.


7
나는 항상 나 자신에게 얼마나 오래 요청하지만 이것은 나를 위해 작동합니다.
Pekka

이것은 일부 브라우저에서만 작동하지 않으며 파일 입력의 값을 설정하는 것은 보안 위반입니다.

5

나는 똑같은 문제가 있었고 이것을 생각해 냈습니다.

var file = document.querySelector('input');
var emptyFile = document.createElement('input');
emptyFile.type = 'file';

document.querySelector('button').onclick = function(){
  file.files = emptyFile.files;
}
<input type='file'>
<button>clear</button>


4

실제로는 매우 쉽습니다.

document.querySelector('#input-field').value = '';

3

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>


.. 그리고 친구에게 이것은 잠재적 인 파일 업로드에서 오류를 확인하고 표시 할 때 도움이되었습니다. 오류가 발생하면 재설정되며 누군가가 이와 같은 것을 찾는 경우 사용자가 동일한 파일을 다시 업로드 할 수 있습니다.
클린턴 Dobbs

1

위의 답변은 다음과 같은 이유로 다소 서투른 솔루션을 제공합니다.

  1. 내가하지에있는 같이 할 먼저 다음 HTML을 받고, 매우 복잡하고 지저분합니다.wrapinput

  2. 크로스 브라우저 JS 편리이며이 경우에는 안정적으로 사용하기에 너무 많은 미지수가있는 것 같다 type(다시, 비트 더러운 인) 스위칭 및 설정 value에가''

그래서 jQuery 기반 솔루션을 제공합니다.

$('#myinput').replaceWith($('#myinput').clone())

그것은 입력을 자체 복제본으로 대체합니다. 클론은 파일을 선택하지 않습니다.

장점 :

  1. 간단하고 이해하기 쉬운 코드
  2. 서투른 랩핑 또는 타입 전환 없음
  3. 크로스 브라우저 호환성 (여기서 내가 틀렸다면 수정)

결과 : 행복한 프로그래머


3
Cross browser compatibility... 내 테스트에 따르면 FireFox .value는의 일부로 복사 .clone()하므로 무용지물이됩니다.
freefaller

@freefaller 왜 전화하기 전에 값을 변경하지 replaceWith않습니까? 나는 clone()내 자신을 사용 하고 있으며 파이어 폭스에서 잘 작동하고 있습니다 (1 년 후에도 여전히
그렇습니다

@Abdo- 내 대답 을 보면 내가하는 것을 알 수 있습니다.
freefaller

질문은 jQuery에 대해 묻지 않습니다. 자바 스크립트에 대해 묻습니다.
Arel

1

여기 내 2 센트가 있습니다. 입력 파일은 배열로 저장되므로 여기에 null을 지정하는 방법이 있습니다

document.getElementById('selector').value = []

이것은 빈 배열을 반환하고 모든 브라우저에서 작동합니다


0

내가 도움이 된 것은 큐를 지우지 않고 루프를 사용하여 마지막으로 선택한 파일을 가져 와서 업로드하려고 시도한 것입니다. 코드는 다음과 같습니다.

for (int i = 0; i <= Request.Files.Count-1; i++)
{
 HttpPostedFileBase uploadfile = files[i];
 Stream fs = uploadfile.InputStream;
 BinaryReader br = new BinaryReader(fs);
 Byte[] imageBytes = br.ReadBytes((Int32)fs.Length);
}

이것이 도움이되기를 바랍니다.


0

나는 대부분의 솔루션을 시도했지만 아무도 일하는 것처럼 보이지 않았습니다. 그러나 나는 아래에서 그것을 둘러 보았습니다.

폼의 구조는 : form=> label, inputsubmit button. 파일을 선택하면 JavaScript에서 수동으로 파일 이름이 레이블에 표시됩니다.

그래서 내 전략은 : 처음에는 제출 button이 비활성화되어 파일을 선택한 후 제출 버튼 disabled속성이 제거되어 파일을 제출할 수 있습니다. 제출 한 후에 label는 파일을 지우는 것처럼 input보이지만 실제로는 보이지 않습니다. 그런 다음 양식을 제출하지 못하도록 제출 버튼을 다시 비활성화합니다.

제출 button disable여부 를 설정하면 다른 파일을 선택하지 않으면 파일이 여러 번 제출되지 않습니다.


0

setAttribute를 사용하여 텍스트를 입력하고 파일로 다시 입력하도록 변경했습니다.

'<input file-model="thefilePic" style="width:95%;" type="file" name="file" id="filepicture" accept="image/jpeg" />'

'var input=document.querySelector('#filepicture');'

if(input != null)
{
    input.setAttribute("type", "text");
    input.setAttribute("type", "file");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.