ファイル選択でイベントを発生させる方法


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を
ウィル・ファーリー

回答:


128

ファイル入力の変更イベントを使用します。

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

30
フォームを非同期で送信し、ページから移動しないで、同じファイルをもう一度アップロードしようとするとどうなりますか?このコードは1回だけ実行され、2回目は同じファイルを選択しても変更イベントは実行されません
Christopher Thomas

6
@ChristopherThomasの反対がまさに私がここにいる理由であり、幸いにも、数年後、それを解決する以下の非常に信頼できる応答があります:stackoverflow.com/a/40581284/4526479
Kyle Baker

1
同じファイルをもう一度選択しても、変更イベントがトリガーされません。毎回機能する他の方法はありますか?
TᴀʀᴇǫMᴀʜᴍᴏᴏᴅ

1
@TᴀʀᴇǫMᴀʜᴍᴏᴏᴅあなたのすぐ上のコメントを参照してください。
David Lopez

3
答えが純粋なjavascriptを使用していないという事実は間違っています
Dimitris Filippou

68

入力フィールドでonchangeイベントをサブスクライブできます。

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

その後:

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

49

これは古い質問であり、@クリストファー・トーマスの上記の承認回答のコメントでの懸念に対処する新しい回答が必要です。ページから移動してファイルをもう一度選択しない場合は、クリックするかタッチスタート(モバイルの場合)を実行するときに値をクリアする必要があります。以下は、ページから移動して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 2017

あなたが試した上でそれは動作しないブラウザはどれですか?それでも問題が解決しない場合は、それ自体でオブジェクトを複製してみてください。
applecrusher 2017年

2
私の問題は使用しelement.setAttribute("value", "")ていたjQueryを使用していない場合はelement.value = ""、ファイル要素を実際に適切にクリアするために使用する必要があります。
Phil

1

ファイルが正常にロードされた後、何をしたいかを行います。ファイル処理の完了直後に、ファイルコントロールの値を空の文字列に設定します。そのため、ファイル名が変更されたかどうかにかかわらず、.change()は常に呼び出されます。例えばあなたはこのことをすることができて、魅力のように私のために働いた

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

1

同じファイルを複数回アップロードし、@ changeイベントがトリガーされない場合の問題を解決する、vueユーザー向けのソリューション:

 <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 = ''
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.