파일 선택시 이벤트를 발생시키는 방법


95

나는 양식을 가지고

<form  onSubmit="return disableForm(this);" action="upload.php" method="post" name="f" id="wizecho" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button onClick="return disableForm(this),ajaxUpload(this.form,'wizecho_upload.php', '&lt;br&gt;Uploading image please wait.....&lt;br&gt;'); return false;">
        Upload Image
    </button>
</form>

이미지를 업로드하는 것입니다.

여기에서 이미지를 업로드하려면 버튼을 클릭해야하며 onClick이벤트 를 사용해야 합니다. 업로드 버튼을 제거하고 입력에서 파일이 선택 되 자마자 이벤트를 시작하고 싶습니다. 어떻게하나요 ??


당신이 동일한 파일을 두 번 선택에 대해 우려하는 경우, @applecrusher 선택한 응답보다 더 나은 솔루션이 stackoverflow.com/a/40581284/1520304을
윌 팔리

답변:


130

파일 입력에 변경 이벤트를 사용하십시오.

$("#file").change(function(){
         //submit the form here
 });

32
양식을 비동기 적으로 제출하고 페이지를 벗어나지 않고 동일한 파일을 다시 업로드하려고하면 어떻게됩니까? 이 코드는 변경 이벤트 실행되지 않습니다 같은 파일을 선택, 한 번 두 번 실행됩니다
크리스토퍼 토마스

6
@ChristopherThomas의 이의 제기는 제가 여기있는 이유입니다. 다행히도 몇 년 후 문제를 해결하기 위해 아래에 많은지지를받은 답변이 있습니다. stackoverflow.com/a/40581284/4526479
Kyle Baker

1
동일한 파일을 다시 선택할 때 변경 이벤트가 트리거되지 않습니다. 매번 작동 할 수있는 다른 방법이 있습니까?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ dec.

1
@ Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ 바로 위에있는 댓글을 참조하세요.
David Lopez

3
대답은 순수 자바 스크립트를 사용하지 않는 사실은 잘못이다
디미트리 필리포

68

입력 필드에서 onchange 이벤트를 구독 할 수 있습니다.

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

그리고:

document.getElementById('file').onchange = function() {
    // fire the upload here
};

49

이것은 수락 답변의 의견에서 위의 @Christopher Thomas의 우려를 해결할 새로운 답변이 필요한 오래된 질문입니다. 페이지를 벗어나지 않고 두 번째로 파일을 선택하는 경우 클릭하거나 터치 스타트 (모바일 용)를 수행 할 때 값을 지워야합니다. 아래는 페이지에서 벗어나 jquery를 사용하는 경우에도 작동합니다.

//the HTML
<input type="file" id="file" name="file" />



//the JavaScript

/*resets the value to address navigating away from the page 
and choosing to upload the same file */ 

$('#file').on('click touchstart' , function(){
    $(this).val('');
});


//Trigger now when you have selected any file 
$("#file").change(function(e) {
    //do whatever you want here
});

이 브라우저 간 호환이 가능합니까? val('')대부분의 브라우저에서 작동하지 않는을 사용하는 것 같습니다 .
Sean Kendle

시도한 브라우저에서 작동하지 않는 브라우저는 무엇입니까? 여전히 문제가되는 경우 개체 자체를 복제 해보십시오.
applecrusher

2
내 문제는 element.setAttribute("value", "")jQuery를 사용하지 않는 경우 element.value = ""파일 요소를 실제로 제대로 지우려면 사용해야 합니다.

1

파일이 성공적으로로드 된 후 원하는 작업을 수행하십시오. 파일 처리가 완료된 직후 파일 제어 값을 빈 문자열로 설정하십시오. 그래서 .change ()는 파일 이름이 변경 되든 아니든 항상 호출됩니다. 예를 들어 당신은이 일을 할 수 있고 매력처럼 나를 위해 일했습니다.

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

1

vue 사용자를위한 솔루션, 동일한 파일을 여러 번 업로드하고 @change 이벤트가 트리거되지 않을 때 문제 해결 :

 <input
      ref="fileInput"
      type="file"
      @click="onClick"
    />
  methods: {
    onClick() {
       this.$refs.fileInput.value = ''
       // further logic for file...
    }
  }

<input type = "file"@ change = "onFileChange"class = "input upload-input"ref = "inputFile"/> self. $ refs.inputFile.value = ''
Pragati Dugar

0

<input type = "file"@ change = "onFileChange"class = "input upload-input"ref = "inputFile"/>

onFileChange(e) {
//upload file and then delete it from input 
 self.$refs.inputFile.value = ''
}

0

es6를 사용하는 바닐라 js

document.querySelector('input[name="file"]').addEventListener('change', (e) => {
 const file = e.target.files[0];
  // todo: use file pointer
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.