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

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

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

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

HTML

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

Q&A

2回答

410閲覧

連続して同じ画像をプレビュー出来ない

hiromats

総合スコア17

jQuery

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

HTML

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

0グッド

0クリップ

投稿2018/11/13 09:37

HTMLとjQueryで開を行なっています。
前回、質問した箇所と同じになるのですが、今回は後付けで生成し、分裂したスペースと一緒に画像をプレビュー表示しようとしています。
連続して同じ画像を選ばなければ、スペースが分裂してプレビュー表示されるのですが、連続して同じ画像を選ぼうとするとプレビューが表示されない(1回目に選んだ画像は2回目では選択しても何の変化もないが、2回目に別の画像を選んだ時に、3回目では1回目と同じ画像を選ぶことができる)、また画像プレビューが成功して一つ目のスペースが生成され分裂した後に、画像ファイルから選択せずにキャンセルを押すと、プレビューがないにも関わらず二つ目のスペースが生成され、分裂してしまいます。

様々な箇所のクラス名やid名を変えてみましたが、何も変わらない状態です。

こうなってしまう原因と解決法をご教授いただければ幸いです。

よろしくお願いします。

html

1<div class="sell-dropbox-container clearfix"> 2 <div class="sell-upload-items have-item", id="items"> 3 <ul> 4 </ul> 5 </div> 6 <div class="sell-upload-drop-box have-item", id="dropbox"> 7 <img class="m-preview"> 8 <%= fields_for(@item) do |f| %> 9 <input type="file" class="sell-upload-drop-file" multiple="" 10 name="image1" style="display: none;"> 11 <%= f.file_field :image %> 12 <pre class="visible-pc"></pre> 13 <% end %> 14 </div> 15</div>

jQuery

1$(function(){ 2 3 function buildIMAGE1(){ 4 var html = ` <li class="sell-upload-item"> 5 <figure class="sell-upload-figure figure-1"> 6 <img> 7 </figure> 8 <div class="sell-upload-button"> 9 <a href="" class="sell-upload-edit">編集</a> 10 <a id="delete" >削除</a> 11 </div> 12 </li>` 13 return html; 14 } 15 16 function buildIMAGE2(){ 17 var html = ` <li class="sell-upload-item"> 18 <figure class="sell-upload-figure figure-2"> 19 <img> 20 </figure> 21 <div class="sell-upload-button"> 22 <a href="" class="sell-upload-edit">編集</a> 23 <a id="delete" >削除</a> 24 </div> 25 </li>` 26 return html; 27 } 28 29 30 //画像アップロード 31 $(document).on("change", ".have-item", function(e){ 32 // 1分割 33 $("#items").removeClass("have-item").addClass("have-item-1") 34 $("#dropbox").removeClass("have-item").addClass("have-item-1") 35 var html = buildIMAGE1() 36 $("#item").append(html) 37 var file = e.target.files[0]; 38 var reader = new FileReader(); 39 var IdentifiedImg = $(".figure-1").children("img"); 40 41 reader.onload = (function(file){ 42 return function(e){ 43 IdentifiedImg.attr("src", e.target.result); 44 IdentifiedImg.attr("title", file.name); 45 }; 46 }) (file); 47 reader.readAsDataURL(file); 48 49 // 2分割 50 $(document).on("change", ".have-item-1", function(e){ 51 $("#items").removeClass("have-item-1").addClass("have-item-2") 52 $("#dropbox").removeClass("have-item-1").addClass("have-item-2") 53 var html = buildIMAGE2() 54 $("#item").append(html) 55 var file = e.target.files[0]; 56 var reader = new FileReader(); 57 var IdentifiedImg = $(".figure-2").children("img"); 58 reader.onload = (function(file){ 59 return function(e){ 60 IdentifiedImg.attr("src", e.target.result); 61 IdentifiedImg.attr("title", file.name); 62 }; 63 })(file); 64 reader.readAsDataURL(file); 65}) 66 67

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

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

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

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

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

guest

回答2

0

optionはあくまで例なので、画像を持っているli要素に対してフォーカスを外してください。

http://javascriptist.net/ref/element.blur.htmlとか
https://qiita.com/tk1024/items/2681c22e380338969085とか
https://mseeeen.msen.jp/javascript-blur-and-focus-with-buttons/とか

を参考にどうぞ。

投稿2018/11/13 23:53

FKM

総合スコア3633

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

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

0

htmlのプルダウンメニューと同じ要領で考えたらいいと思います。以下はテストサンプルです。

html

1<select id="sel"> 2 <option value="img1"><img src="hogehoge.jpg"></option> 3</select>

連続して同じ画像を選ぼうとするとプレビューが表示されない

changeイベントですが、動的にoptionタグを追加して、追加されたoptionタグにフォーカスがあたっている状態なので、同じ画像を引き続き選択できない状態となっています。ですので、イベントを実施した後、該当タグのフォーカスを外すとうまくいくのではないでしょうか。

jQuery

1#(".have-item-1").find('option:selected').prop("selected",false);

画像ファイルから選択せずにキャンセルを押すと、プレビューがないにも関わらず二つ目のスペースが生成

これがけっこう誤解を招きやすいのですが、changeイベントはvalueの値が変更されたときにイベントが起きるので、キャンセルしても、空値が送られたと判断してイベントを実行してしまうことになります。したがって、この場合は空値が転送された場合は、処理を中断するとうまくいくと思います。

jQuery

1var imgval = #(this).val(); 2if(imgval == ""){ 3 return false; 4}

投稿2018/11/13 10:05

編集2018/11/13 10:10
FKM

総合スコア3633

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

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

hiromats

2018/11/13 11:30

回答ありがとうございます。 理解が足りなくて申し訳ないのですが、selectedはoptionタグで用いる属性というのは分かるのですが、optionタグは記述していないので、optionタグを追加しろという解釈でいいのでしょうか? $(".have-item-1").find('option:selected').prop("selected",false); を記述してみたのですが、特に変化はありませんでした。
hiromats

2018/11/14 02:01

再度解答ありがとうございます。 debuggerで調べてみると別の箇所(#item_image)に焦点が当たっていたので、それらURLを参考にしてその箇所の焦点を外してやってみたのですが、特に効果がなかったので、別の要因の可能性も考えられます。 下記のように実行してみました。 // 2分割 document.activeElement.blur() $(document).on("change", ".have-item-1", function(e){ // 2分割 $("#item_image").blur() $(document).on("change", ".have-item-1", function(e){
FKM

2018/11/14 06:11

フォーカスを外しても効果がないのなら、mouseleaveイベントで、マウスが離れたタイミングでイベントを実行して、その時の取得した値によって、イベントを起こすなどしたら如何でしょうか。
hiromats

2018/11/14 08:04

changeからmouseleaveに変えるという意味でしょうか? それだと、分裂前は画像ファイルを開くためのスペースが、画像選択をした後に選択した画像のプレビューのスペースと画像ファイルを開くためのスペースに分裂して、画像ファイルを開くためのスペースにはその画像のデータが残っているので、そのスペースからマウスを離すと勝手にその画像のプレビューのスペースが出来てしまいますね。
FKM

2018/11/14 08:37

そうなります、なので、そのときに取得したvalueのタイミングで、特定の値のときのみ処理を継続するなどの対処で行けるのではないかと思いますが、どうでしょうか。 あと、自分もプルダウンでテストしましたが、blur()やfocusout()では、うまくプルダウンのフォーカスが外れなかったので、明示的に$(.hoge").val("")などとして、メニューを初期化してテストしています。
hiromats

2018/11/14 09:14

特定のクラスを指定してval("")は自分もやってますね。 ただ、厄介なのが画像ファイルを開くためのスペースにカーソルを合わせて放置していると画像データが残ってるのは分かるのですが、検証やconsole.logなどからでは確認できないので、どう条件付けをして処理をすればいいのかが分からないんですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問