JavaScriptでHTMLファイル入力をクリアするにはどうすればよいですか?


154

フォームで入力したファイルをクリアしたい。

ソースを同じ方法に設定することについて知っています...しかし、その方法では、選択したファイルパスは消去されません。

:ページを再読み込みしたり、フォームをリセットしたり、AJAX呼び出しを実行したりする必要はありません。

これは可能ですか?

回答:


-10

そのノードを削除して、同じ名前で新しいノードを作成するのはどうですか?


46
どういう意味ですか、例を挙げてください。

1
次のようなハンドラーは失われます。var inputPhoto = document.getElementById( 'photoInput'); inputPhoto.addEventListener( 'change'、handler_file、false);
Rui Martins

説明が足りないため投票に反対しました!
ジェイソン

211

JavaScriptでファイル入力をクリアするには3つの方法があります。

  1. valueプロパティを空またはnullに設定します。

    IE11 +およびその他の最新ブラウザーで動作します。

  2. 新しいファイル入力要素を作成し、古いものを置き換えます。

    欠点は、イベントリスナーとexpandoプロパティが失われることです。

  3. form.reset()メソッドを介して所有者フォームをリセットします。

    同じ所有者フォーム内の他の入力要素への影響を回避するために、新しい空のフォームを作成し、この新しいフォームにファイル入力要素を追加してリセットできます。この方法は、すべてのブラウザーで機能します。

私はJavaScript関数を書きました。デモ: 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
いいえ、必要ありません。フォーム要素がページドキュメントツリーに追加されていません。
2015

5
プログラムで要素に追加されたイベントやその他の属性を保持したい場合は、2や3のアプローチを使用して警告するだけでも意味があるかもしれません。私の場合、フォームリセット後にonclickイベントをフォーム要素に追加しましたが、フォーム要素をリセットすると消えました。このような場合は、アプローチ1.の方が適切です。(これは2.で指摘されましたが、3でも発生する可能性があります。)
Wolfie Inu 2015

85

tl; dr:最新のブラウザの場合は、

input.value = '';

古い答え:

どうですか:

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

これがwebkitで機能しない理由を私はまだ理解する必要があります。

とにかく、これはIE9>、Firefox、Operaで動作します。
webkitの状況は、ファイルに戻すことができないようです。
IE8では、セキュリティ例外がスローされるのが現状です。

編集: webkit、Opera、firefoxの場合、これは機能しますが、

input.value = '';

(この提案で上記の回答を確認してください)

GCを必要とせずにこのクロスブラウザを実行する、よりクリーンな方法を見つけることができるかどうかを確認します。

Edit2:

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

ほとんどのブラウザで動作します。IE <9では動作しません、それだけです。
firefox 20、chrome 24、opera 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 '19 / 03/14

よくやった。古いバージョンのIEブラウザーはテストしていません。ごめんなさい。
BigMac66 2014年

31

残念ながら、上記の回答のどれもすべてのベースをカバーしているようには見えません-少なくとも私のバニラJavaScriptでのテストでは。

  • .value = nullFireFox、Chome、Opera、IE11で動作するようです(ただしIE8 / 9/10では動作しません

  • .cloneNode(そして.clone()jQueryでは)FireFoxでは.valueオーバーコピーされているように見えるため、クローンは無意味になります。

だから、FireFox(27と28)、Chrome(33)、IE(8、9、10、11)、Opera(17)で動作する私が書いたバニラJavaScript関数は次のとおりです...これらは現在利用可能な唯一のブラウザーですテストする私に。

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
これが答えです。このページだけでなく他のフォーラムも検索して、この質問に対する非常に多くの回答の問題の1つは、「3つのファイルが選択されました」というテキストをクリアできることですが、実際にはhttpファイルはクリアされませんキュー。次に何が起きるかは、次回アップロードしようとしたときに1つのファイルしか選択できず、さらに悪いことに、前のファイルフォルダーに保存されることです。この回答で両方がクリアされ、最初のファイルセットをアップロードするのと同じくらい簡単に、次のファイルセットのアップロードを再開できます。
TARKUS

ifステートメントはcatchブロック内に配置すべきではありませんか?
Fahmi

@Fahmi-いいえ、すべきではありません
freefaller

ああ、値をに設定しようとすると、IE8 / 9/10が例外をスローすると思いましたnull。ではctrl.value = null;try...catchブロックの中に入れる意味は何でしょうか?newbの質問でごめんなさい。
ファーミ2017年

1
ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);-値をcloneNodeコピーするため、実際にどの時点で値をクリアしますか?
Fahmi

12

解決

次のコードはjQueryで私のために働いた。すべてのブラウザで動作し、イベントとカスタムプロパティを保持できます。

var $el = $('#your-input-id');
$el.wrap('<form>').closest('form').get(0).reset();
$el.unwrap();

デモ

コードとデモについては、このjsFiddleを参照してください。

リンク


11

新しいファイル入力に置き換える必要があります。jQueryでこれを行う方法は次のとおりです。

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

入力フィールドをクリアする必要がある場合は、この行を使用します(たとえば、いくつかのイベントで):

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

:オリジナルの要素を置き換える、より良いこれはルックスのためにstackoverflow.com/questions/1043957/...
Mengdiガオ

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

編集:
これはIEとオペラでは機能しませんが、Firefox、Safari、Chromeでは機能するようです。


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>


..そしてあなたの仲間にとって、これは潜在的なファイルのアップロードでエラーをチェックして表示するときに私を助けました。これはエラーでリセットされ、誰かがこのようなものを探している場合に備えて、ユーザーは同じファイルを再アップロードできます。
クリントンドブス

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()自分自身を使用していて、Firefoxで正常に動作しています(1年後もこれが当てはまるかどうかはわかりません=))
Abdo

@アブド- 私の答えを見ると、私がそうであることがわかるでしょう
フリーフォールヤ

質問はjQueryについて尋ねているのではありません。それはjavascriptについて尋ねています。
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=> labelinputおよびsubmit 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.