質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

6510閲覧

<input type="file">にてファイルを選択せずキャンセルを押した際のjQueryでの制御について

janhampino

総合スコア6

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/02/24 10:15

編集2021/02/24 10:27

前提・実現したいこと

以下のようなフローでファイルをアップできるようなページを作成しています。(jQueryを使用)

・html上の「ローカルファイルを選択」ボタンをクリック
・「ローカルファイルを選択」とは別の要素の見た目上見えなくしてある<input type=file>を.trigger("click")を使用して間接的に発火
・発火させた<input type="file">のイベントによりPCのファイルを選択し「開く」を押す
・ファイル情報を取得しファイル名を<div>input-file-boxという要素を作成後そこに出力
・次回分のinput要素を先ほど使用したinputの隣に追加
以上
再度同じフローを踏んでファイルを選択すると2つ目以降のファイル名が横にどんどん並ぶように追加されていくというような結果を想定しています。
以下ののコードにてファイルを選択した際は想定通りの出力結果を得られたのですが、
ファイルを選択するタイミングでキャンセルを押した後、もう一度最初の手順からファイルを選択し「開く」を押すとinput要素が2つ作成されてしまう事象が起きてしまいます。

推測としてはクリックイベントの後にchangeイベントが実行されず残ってしまい、
次の新しいクリックイベントを実行した際に止まっていたイベントが同時に動き要素が2つ作成されてしまっているのかと考えています。
ただ、その後の対処に詰まってしまい質問をさせていただくに至りました。
アドバイスのほどよろしくお願いいたします...!

発生している問題・エラーメッセージ

該当のソースコード

javascript

1 2 let addLocalFile = function(){ 3 let activeFileNum = $('#origin-file-input-elm').find('.input-local-file').length; 4 5 $('#local-file-' + activeFileNum).trigger("click"); 6 popInActivate(); 7 8 $('#local-file-' + activeFileNum).on('change', function(){ 9 let addFileNum = activeFileNum + 1; 10 let fileBoxElm = '<div class="input-file-box" id="input-file-box-' + activeFileNum + '"><div class="clip-icon"></div><div class="file-name"></div><button class="file-delete-icon" id="fille-' + activeFileNum + '></button></div>'; 11 $('#js-input-files-wrapper').append(fileBoxElm); 12 let fileObj = $('#local-file-' + activeFileNum).prop('files')[0]; 13 $('#input-file-box-'+ activeFileNum).find('.file-name').text(fileObj.name); 14 15 let fileInputElm = '<input class="input-local-file" id="local-file-' + addFileNum + '" type="file"></input>' 16 $('#clone-origin-file-input-elm').append(fileInputElm); 17 }); 18 } 19$("#js-open-local-file").click(addLocalFile);

html

1 <form class="form" action=""> 2 <div class="wrapper"> 3 <div class="input-files-wrapper" id="js-input-files-wrapper"> 4              <!--- このコメント内の要素にファイル名を出力してファイルを選択するごとに横に並べる 5              <div class="input-file-box" id="input-file-box-1"> 6 <div class="clip-icon"> </div> 7 <div class="file-name">ファイル名.zip</div> 8 <button class="file-delete-icon" id="fille-delete-1"></button> 9 --> 10 </div></div> 11 <div class="clone-origin-file-input-elm" id="clone-origin-file-input-elm"> 12 <input class="input-local-file" id="local-file-1" type="file"> 13 <!--- ここに input type=file を追加していく---> 14 </div> 15 16 </div> 17 18 </form> 19 <button id="js-open-local-file" type="button"> 20 ローカルファイルを選択 21 </button>

試したこと

changeイベントを addLocalFileの外側に出して試したりもしましたが、
そうするとactiveFilleNumの受け渡しがうまくできずファイル選択画面が開かない状態でした。
(同期的に処理すればよろしいのでしょうか...?ただそのやり方もイマイチ理解できずわからない状態なので、もしそうだとしたらその方法もお教えいただければ幸いです。)

javascript

1 let activeFileNum = ''; 2 let addLocalFile = function(){ 3 activeFileNum = $('#clone-origin-file-input-elm').find('.input-local-file').length; 4 console.log(activeFileNum); 5 $('#local-file-' + activeFileNum).trigger("click"); 6 popInActivate(); 7 8 } 9 10 $("#js-open-local-file").click(addLocalFile); 11 12 $('#local-file-' + activeFileNum).on('change', function(){ 13 let addFileNum = activeFileNum + 1; 14 let fileBoxElm = '<div class="c-input-file-box" id="input-file-box-' + activeFileNum + '"><div class="clip-icon"></div><div class="file-name"></div><button class="file-delete-icon" id="fille-delete-' + activeFileNum + '></button></div>'; 15 $('#js-input-files-wrapper').append(fileBoxElm); 16 let fileObj = $('#local-file-' + activeFileNum).prop('files')[0]; 17 $('#input-file-box-'+ activeFileNum).find('.file-name').text(fileObj.name); 18 19 let fileInputElm = '<input class="input-local-file" id="local-file-' + addFileNum + '" type="file"></input>' 20 $('#clone-origin-file-input-elm').append(fileInputElm); 21 });

補足情報(FW/ツールのバージョンなど)

jQuery 3.5.0
ブラウザはIE11まで対応できればと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

2つの方法で解決できました。

1つ目

https://teratail.com/questions/324474
詳しくはこちらで質問させていただきました。
input type="file"のキャンセルを選択した際のイベントをなんとか取得し、
それによって条件分岐させることで処理を完結させ次回以降の二重実行を防ぎます。

2つ目

change イベントをoffすることによって前の実行で残っていたイベントを削除し、
改めて新しいイベントでファイルを選択した際のイベントを実行するというもの。

JavaScript

1let addLocalFile = function(){ 2 let activeFileNum = $('#origin-file-input-elm').find('.input-local-file').length; 3 console.log(activeFileNum); 4 $('#local-file-' + activeFileNum).trigger("click"); 5 popInActivate(); 6 7 $('#local-file-' + activeFileNum).off('change');//コレを追加し残っていたイベントを消す 8 $('#local-file-' + activeFileNum).on('change', function(){ 9 let addFileNum = activeFileNum + 1; 10 let fileBoxElm = '<div class="c-input-file-box" id="input-file-box-' + activeFileNum + '"><div class="clip-icon"></div><div class="file-name"></div><button class="file-delete-icon" id="fille-delete-' + activeFileNum + '></button></div>'; 11 $('#js-input-files-wrapper').append(fileBoxElm); 12 let fileObj = $('#local-file-' + activeFileNum).prop('files')[0]; 13 $('#input-file-box-'+ activeFileNum).find('.file-name').text(fileObj.name); 14 15 let fileInputElm = '<input class="input-local-file" id="local-file-' + addFileNum + '" type="file"></input>' 16 $('#origin-file-input-elm').append(fileInputElm); 17 }); 18 } 19 $("#js-open-local-file").click(addLocalFile);

投稿2021/02/26 13:24

janhampino

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問