HTML5でファイル入力の値を記憶して再設定する方法(ドラッグ&ドロップ活用)
ファイル選択欄(input type="file")に、一度選択したファイルをドラッグ&ドロップで再設定する方法を解説します。以前はこの操作は実現できませんでしたが、現在ではHTML5のDataTransferオブジェクトを利用することで、正当な形でファイル入力欄へファイルを再入力(再設定)できるようになりました。
ドロップイベントでファイルを取得する
まず、ドロップイベントからdataTransferフィールドを取り出し、そこに含まれるファイル一覧を取得します。取得したファイルは、後述のhandleFiles()関数で処理します。
function drop(ev) {
ev.stopPropagation();
ev.preventDefault();
// イベントからdataTransferフィールドを取得
var d = ev.dataTransfer;
var files = d.files;
handleFiles(files);
}ドラッグ&ドロップのイベント処理を実装する
ドラッグ&ドロップを正しく動作させるには、dragover・dragleave・dropの3つのイベントをターゲット要素に登録します。それぞれの役割は以下のとおりです。
dragover(ドラッグ中)
要素の上でファイルがドラッグされている間の処理です。preventDefault()を呼び出してデフォルト動作を無効化し、ドラッグ中であることを示すCSSクラスを追加します。
// ドラッグ中
target.addEventListener('dragover', (ev) => {
ev.preventDefault();
body.classList.add('dragging');
});dragleave(ドラッグが離れたとき)
ファイルが要素から離れたときに、ドラッグ中を示すスタイルを解除します。
// ドラッグが離れたとき
target.addEventListener('dragleave', () => {
body.classList.remove('dragging');
});drop(ドロップされたとき)
ファイルがドロップされた時点の処理です。デフォルト動作を無効化し、スタイルを解除した上で、先ほどのdrop()関数を呼び出してファイルを取得します。
// ドロップターゲット
target.addEventListener('drop', (ev) => {
ev.preventDefault();
body.classList.remove('dragging');
});取得したファイルを入力欄に再設定する
ドラッグ&ドロップで取得したFileListを、ファイル入力欄に再設定するにはDataTransferコンストラクタを利用します。以下のように、新しいDataTransferオブジェクトを作成し、そのfilesプロパティを入力欄に代入するだけで完了です。
function handleFiles(files) {
const dt = new DataTransfer();
files.forEach((file) => dt.items.add(file));
fileInput.files = dt.files;
}この手法を使えば、ユーザーがドロップしたファイルをそのまま<input type="file">の値として記憶できるため、フォーム送信時にもドロップしたファイルを確実に扱うことができます。
-
【初心者向け】JavaScriptのFileとFileReaderを使ってファイルを読み込む方法
JavaScriptにおけるFileとFileReaderとは? JavaScriptでは、<input type=file>要素を使うことで、ユーザーにローカルファイルを選択させることができます。選択されたファイルはFileオブジェクトとして取得でき、ファイル名・サイズ・MIMEタイプなどの基本情報へアクセス可能です。 さらに、FileReaderオブジェクトを利用すれば、選択されたファイルの中身を非同期で読み込み、テキストやデータURLとして扱うことができます。 サンプルコード 以下は、JavaScriptでFileとFileReaderを使用して、ファイルの詳細情報を表示し
-
【HTML5】ドラッグ&ドロップ(DnD)の実装方法をサンプルコード付きで解説
ドラッグアンドドロップ(Drag and Drop / DnD)は、マウス操作だけで要素のコピー・並べ替え・削除などを直感的に行える、強力なユーザーインターフェースの概念です。ユーザーは要素の上でマウスボタンを押しながらドラッグし、目的の場所でボタンを離すことで、その要素を移動させることができます。従来のHTML4でこの機能を実現するには、複雑なJavaScriptのコーディングや、jQueryのような外部ライブラリ・フレームワークに依存する必要があり、実装のハードルが高いのが課題でした。ところがHTML5では、Drag and Drop(DnD)APIが標準で搭載され、ブラウザ自身がネイティ