동일한 파일을 선택할 때 HTML 입력 파일 선택 이벤트가 실행되지 않습니다


204

요소 input유형 의 HTML 에 대해 사용자가 선택한 모든 파일을 감지 할 기회가 file있습니까?

이것은 여러 번 요청되었지만 onchange사용자가 동일한 파일을 다시 선택하면 일반적으로 제안되는 이벤트가 발생하지 않습니다.


7
그런 다음 사용자가 취소를 누르면 코드도 실행해야합니까? 취소를 누르면 아무 일도 일어나지 않을 것으로 예상되며 대부분의 사용자는 동일한 파일을 다시 선택하면 취소와 동일한 효과가있을 것으로 기대합니다. 이것이 가능한지 모르겠지만 어쨌든이 디자인을 재고하는 것이 좋습니다.
KRyan

1
취소하면 발사하거나 감지 할 수 없어야합니다. UI ceveat을 제거하는 것이 더 좋습니다. 파일을 선택한 후 일부 작업이 호출되면 사용자는 일반적으로 파일을 다시 선택하면 작업이 반복 될 것으로 예상합니다.
dronus

input파일로 무언가를 한 후 s 값을 ''로 설정하면이 동작 을 수행 할 수 있습니다. 그러나 보이는 파일 이름도 제거됩니다. 그러나 파일이 실제로 처리되고 해당 작업의 결과가 다른 곳에 나타날 수 있으므로 괜찮습니다.
dronus

Plz Que에게 설명하고 싶은 일이 있습니까?
Champ

1
내가 원하는 것은 오래된 학교 행동 데스크탑 응용 프로그램을 시뮬레이션하는 것입니다. 데스크톱 응용 프로그램에서 동일한 파일을 다시 '열면'일반적으로 파일이 다시로드되거나 파일에 대한 일부 작업 (예 : 다른 형식으로 변환하는 등)이 수행되면이 작업이 다시 수행됩니다. 이것은 데스크톱 사용자가 웹 앱에서도 기대할 수 있지만 file입력 onchange이벤트와 비슷하지 않습니다.
dronus

답변:


278

의 값을 설정 input으로 nullonclick이벤트. 동일한 경로를 선택하더라도 input의 값 이 재설정되고 onchange이벤트가 트리거 됩니다.

input.onclick = function () {
    this.value = null;
};

input.onchange = function () {
    alert(this.value);
};​

여기 데모가 있습니다.

참고 : 파일에 'C : \ fakepath \'접두사가있는 경우 정상입니다. 이는 JavaScript가 파일의 절대 경로를 알 수 없도록하는 보안 기능입니다. 브라우저는 여전히 내부적으로 알고 있습니다.


1
데모를 시도했지만 (Chrome 21 사용)`C : \ fakepath` + 다음에 선택한 파일 이름 (경로 제외)을 계속 얻습니다. 그래도 동일한 파일을 선택할 때마다 경고가 표시됩니다.
재스퍼 드 베리

1
@JasperdeVries JavaScript가 파일의 절대 경로를 알지 못하게하는 보안 기능입니다. 브라우저는 여전히 내부적으로 경로를 알고 있습니다.
Brian Ustas

1
또한 <input type = "file">에 허용되는 유일한 값은 null입니다. 따라서 정의하지 않고 예외를 설정하려고하면 그 이유입니다.
Noel Abrahams

5
약간 변경하지 않으면 IE11에서 제대로 작동하지 않습니다 : demo .

21
키보드를 사용하여 클릭하지 않고 입력 요소를 활성화 할 수 있기 때문에 this.value = null끝에 추가하는 것이 좋습니다 onchange. input.files나중에 참조해야 할 경우 저장할 수 있습니다 .
Halcyon

24
<form enctype='multipart/form-data'>
    <input onchange="alert(this.value); this.value=null; return false;" type='file'>
    <br>
    <input type='submit' value='Upload'>
</form>

this.value=null; Chrome에만 필요하며 Firefox는 다음과 같이 잘 작동합니다. return false;

여기 FIDDLE이 있습니다


2
최신 IE 및 크롬에서 테스트 된 간단하고 효과적이며 매력처럼 작동합니다. 그것을 공유 주셔서 감사합니다
아툴 Chaudhary을

8

이 기사에서 "선택할 때 양식 입력 사용"제목 아래

http://www.html5rocks.com/en/tutorials/file/dndfiles/

<input type="file" id="files" name="files[]" multiple />

<script>
function handleFileSelect(evt) {

    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
     // Code to execute for every file selected
    }
    // Code to execute after that

}

document.getElementById('files').addEventListener('change', 
                                                  handleFileSelect, 
                                                  false);
</script>

그것은 '변경'에 이벤트 리스너를 추가하지만 테스트했으며 동일한 파일을 선택하더라도 취소하지 않고 트리거합니다.


이 경우 "변경"이라는 잠재적으로 모호한 의미를 고려하여 여러 브라우저에서 시도 했습니까? 웹에서와 같이 시도한 것을 지정할 수 있습니다. 브라우저는 이러한 것들에 대해 항상 합의 된 것은 아닙니다.
Thor84no

2
테스트에 어떤 환경을 사용하십니까? Chrome에 대한 나의 경험은 내가 질문에서 언급 한 change것이며 , 이벤트는 파일 이름 변경에서만 발생합니다.
dronus

7

사용자가 필드를 클릭 할 때마다 onClick 이벤트를 사용하여 대상 입력 값을 지 웁니다. 이렇게하면 onChange 이벤트가 동일한 파일에 대해서도 트리거됩니다. 나를 위해 일했다 :)

onInputClick = (event) => {
    event.target.value = ''
}

<input type="file" onChange={onFileChanged} onClick={onInputClick} />

TypeScript 사용

onInputClick = ( event: React.MouseEvent<HTMLInputElement, MouseEvent>) => {
    const element = event.target as HTMLInputElement
    element.value = ''
}

솔루션 주셔서 감사합니다.
Deepak Tekchandani

1

파일이 성공적으로로드 된 후 원하는 작업을 수행하십시오. 예를 들어 당신은이 일을 할 수 있고 매력처럼 나를 위해 일했습니다.

   $('#myFile').change(function () {
       LoadFile("myFile");//function to do processing of file.
       $('#myFile').val('');// set the value to empty of myfile control.
    });

1
handleChange({target}) {
    const files = target.files
    target.value = ''
}

1
ngCourse! 코드 전용 답변으로 문제를 해결할 수 있지만 해결 방법을 설명하면 훨씬 유용합니다. 커뮤니티는 귀하의 답변을 완전히 이해하기 위해 이론뿐만 아니라 코드가 필요합니다.
RBT

이 코드가 문제를 해결하는 방법과 이유에 대한 설명포함 하여 문제를 해결할 수는 있지만 게시물의 품질을 향상시키는 데 도움이되며 더 많은 투표를 할 수 있습니다. 지금 질문하는 사람뿐만 아니라 앞으로 독자들에게 질문에 대답하고 있음을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을. 검토에서
이중 경고음

1

입력의 0 번째 인덱스 값을 지우면 나에게 도움이되었습니다 . 아래 코드를 시도해보십시오 (AngularJs).

          scope.onClick = function() {
            input[0].value = "";
                input.click();
            };
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.