type='file'のvalueプロパティへのアクセスには、セキュリティ上の理由により制約が設けられています。
これらの制約は、ブラウザによっては下表のように違いがあります。
ブラウザ | 取得結果の書式 | 設定の可否 | |
---|---|---|---|
空文字 | 空文字以外 | ||
Internet Explorer 6,7,8,9 | C:\fakepath\filename | × | |
Mozilla Firefox | filename | ○ | × |
Google Chrome | C:\fakepath\filename | ○ | × |
Safari | C:\fakepath\filename | ○ | × |
Opera | C:\fakepath\filename | × |
valueへの空文字の設定が認められているブラウザは、value=''
とすればvalueの値はクリアされます。一方で、それ以外のブラウザにも対応させるには工夫が必要です。
まずinput要素を内包する要素を作成します。
<div><type="file" input id="file" /></div>
そしてvalueの値をクリアするときには、
var file = document.getElementById( 'file' ); file.parentNode.innerHTML = file.parentNode.innerHTML;
のように、input要素を内包する要素内に含まれるHTMLテキストを、同一のHTMLテキストで上書きします。このようにすることでinput要素が再生成されます。そして新しく生成されたinput要素にはvalueの値は設定されていないため、結果としてvalueの値がクリアされることになります。Netlobo.com | Clear File Input Using Javascript
このときinput要素にイベントが登録されていると、それらも同時にクリアされます。よって再び登録し直す必要があります。
受け入れ可能とするファイルのMIMEタイプを指示します。複数ある場合にはカンマで区切ります。
text/plain | |
audio/wav | |
audio/* |
外観を変更する方法はサポートされていないため、本来のinput要素をdisplay:noneで非表示にして、代替のインターフェイスを自作します。そしてそこからtype="file"の要素のclick()メソッドを呼び出すことで、機能はそのままで外観のみ変更できます。Web アプリケーションからファイルを扱う | MDN
<!-- 非表示にされたtype="file"要素 --> <input type="file" id="file" style="display: none" /> <!-- 代替のインターフェイス--> <input type="text" id="text" value="選択されていません" /> <input type="button" id="button" value="ファイルを開く" /> <script type="text/javascript"> var file = document.getElementById( 'file' ); var text = document.getElementById( 'text' ); var button = document.getElementById( 'button' ); file.onchange = function() { text.value = this.value; } text.onclick = button.onclick = function() { // type="file"要素のclickイベントを発生させる file.click(); } </script>
Internet Explorer 10より前では、この方法で設定されたファイルをform要素から送信できません。それを次に解説します。
Internet Explorer 10より前では、代替のインターフェイスからファイルの選択はできますが、form要素からの送信に失敗します。
input要素をopacity:0で透明にして重ねることで、代替のインターフェイスをクリックしているように見せかけて、本来のinput要素をクリックさせます。
重ね合わせ前 |
本物
代替
|
---|---|
↓ | |
半透明 (重ね合わせイメージ) |
|
↓ | |
透明 |
|
positionで絶対位置として、同一の位置を指定し重ねます。そしてz-indexで、type='file'の要素が上側になるようにします。
<div class="filebox"> <input type="file" class="file" /> <div class="fakefile"> <input type="text" /> <input type="button" value="参照" /> </div> </div> <style type="text/css"> .filebox { position: relative; } .file { position: absolute; right: 0; z-index: 2; opacity: 0; filter:alpha(opacity=0); } .fakefile { position: absolute; right: 0; z-index: 1; } </style>