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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

jQuery Mobile

jQuery Mobileとはスマートフォンとタブレット用に最適化されたフレームワークです。様々な携帯端末にjQueryで作られたユーザーインターフェイスシステムを提供します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

jQuery

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

HTML

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

Q&A

解決済

1回答

1398閲覧

jQuery キャプション表示が「undefined」になってしまう

mitrasi

総合スコア49

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

jQuery Mobile

jQuery Mobileとはスマートフォンとタブレット用に最適化されたフレームワークです。様々な携帯端末にjQueryで作られたユーザーインターフェイスシステムを提供します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

jQuery

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

HTML

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

0グッド

0クリップ

投稿2021/07/11 03:14

前提・実現したいこと

「jQuery標準デザイン講座」のキャプション表示を作成したいのですが、「undefined」になってしまいます。
打ち間違いは見当たらないようなのでなぜなのか気になります。

どうかご教授よろしくお願いいたします。

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

console.logで特にこれらの領域に関するエラーは発生しておりません

該当のソースコード

HTML

1 2<section class="section-title" id="style"> 3 <div class="content-wrapper"> 4<h2 class="section-title">Style</h2> 5<div class="style-wrapper"> 6<ul> 7 8 <li class="style-item"><img src="images/style02-min.jpg" alt="大人キュートなベリーショート" class="style-img"></li> 9 <li class="style-item"><img src="images/style03-min.jpg" alt="かわいくて大人気!甘えんぼなガーリースタイル" class="style-img"></li> 10 <li class="style-item"><img src="images/style04-min.jpg" alt="愛されゆるふわガール" class="style-img"></li> 11 <li class="style-item"><img src="images/style05-min.jpg" alt="ボリューミーで女性らしいシルエット" class="style-img"></li> 12 <li class="style-item"><img src="images/style06-min.jpg" alt="ナチュラル清楚な美人に" class="style-img"></li> 13 <li class="style-item"><img src="images/style07-min.jpg" alt="さっぱりエネルギー溢れる活力のある女性" class="style-img"></li> 14 <li class="style-item"><img src="images/style08-min.jpg" alt="エネルギッシュさにオトナらしさもプラス" class="style-img"></li> 15 <li class="style-item"><img src="images/style09-min.jpg" alt="カントリーチックな最先端スタイル" class="style-img"></li> 16 <li class="style-item"><img src="images/style10-min.jpg" alt="定番のさらさらストレート" class="style-img"></li> 17 <li class="style-item"><img src="images/style11-min.jpg" alt="小動物感漂うふわふわ感癒されること間違いなし" class="style-img"></li> 18 <li class="style-item"><img src="images/style01-min.jpg" alt="お父さんのスタイリングもお任せください" class="style-img"></li> 19</ul> 20</div> 21<a href="#"><img src="images/linesend_black-min.png" alt="" class="line_btn"></a> 22 </div> 23</section> 24

該当のソースコード

SCSS

1/*style*/ 2#style{ 3main li{ 4 position:relative; 5 6 width:300px; 7 height:300px; 8 color:$cWhite; 9} 10 11/*キャプション部分*/ 12/*今はないが後からjQueryにより生成される*/ 13/*今はないがhoverした時に画像の大きさいっぱいに重なる要素になるキャプションを表示するための領域となる*/ 14main div{ 15 position:absolute; 16 display: none; 17 width:100%; 18 height:100%; 19 padding:20px; 20 background:rgba(17,179,179,.7); 21 top:0; 22left:0; 23box-sizing:border-box;} 24 25/*アニメーションように10pxずらしておく*/ 26/*今はないが後からjQueryにより生成される 上記のdivの中に入れるキャプションの本文になる*/ 27main p { 28 position:relative; 29 top:10px; 30} 31}

該当のソースコード

js

1$(function () { 2 //画像のキャプション表示 3//li最後の要素にdivを追加 4$("li").append("<div>"); 5//そのなかにdiv 6$("div").each(function() { 7//画像のキャプションを取得 8//自分(div)からみて親要素(li)の子要素(img)のalt属性 9//$(this).parent().children("img").attr("alt"); 10//それを取得したキャプション用にテキストをp要素としてdiv要素内におさめる 11$(this).html("<p>" + $(this).parent().children("img").attr("alt") + "</p>"); 12}); 13 //マウスオーバーした時の処理 14 /* $("li").hover(function () { 15 //マウスオーバー時の処理 16//フェードイン 17 $(this).children("div").stop().fadeIn(300); 18 //キャプションのテキスト位置:10pxから0pxへ移動 19 $(this).children("div").children("p").stop().animate({ "top": 0 }, 300); 20 21 //マウスアウト時の処理 22 }, function () { 23 24 }); */ 25}); 26

試したこと

■見本コードと誤字脱字がないか見比べる
→特に見当たらない様子。

■コメントアウトして原因箇所を探ってみる
→一行ずつコメントアウトしてみたところ、<div>を生成するところ、<img>のalt属性を取得してくるところ(単体のコード)までは特に問題なく画像も表示されているが、以下の箇所からこの問題が発生することからここに問題があるのではないかと推測しています。

$(this).html("<p>" + $(this).parent().children("img").attr("alt") + "</p>");

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

OS:Windows
エディタ:VScode
ブラウザ:クローム

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

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

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

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

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

guest

回答1

0

ベストアンサー

私は該当の本を見たことはないのに加えてjQueryは標準的に使用していないのですが、その本はあまり良くないような気がします。まず、おそらく動くであろうコードを置いておきます。

imgのalt属性がある時のみ

javascript

1$(function () { 2 $("li").append("<div>"); 3 $("div").each(function () { 4 const alt = $(this).parent().children("img").attr("alt"); 5 // imgにalt属性がある時のみ 6 if (alt) { 7 $(this).html("<p>" + alt + "</p>"); 8 } 9 }); 10}); 11

さて、$("div").eachの部分ですが、これは $("li").append("<div>");で追加したdivだけではなく、 <div class="content-wrapper"> <div class="style-wrapper">も取得します。

該当の本の作者はこれで上手く言ったのでしょうが、そうならない場合もあります。
domの操作は基本的に非同期ですので、eachで最初の方に操作したものが最後に反映されることもあります。

例えば <div class="content-wrapper">がthisで指定された場合の$(this).parent().children("img").attr("alt")undefinedです。
これをコード通り$(this).html("<p>" + $(this).parent().children("img").attr("alt") + "</p>");でhtmlに指定したらundefinedが表示されます。

liそれぞれはちゃんと反映されていたのに、最後にundefinedで上書きされてしまったのです。

そうならないために、操作する要素はきちんと絞り込む必要があります。

操作する要素を絞り込む

$(function () { // li要素でstyle-itemクラスを持つ要素 $("li" + ".style-item").append("<div>"); $("li" + ".style-item").each(function () { const alt = $(this).children("img").attr("alt"); console.log(alt); $(this) .children("div") .html("<p>" + alt + "</p>"); }); });

console.log(alt);を残しておきましたが、元のコードであってもこの様にconsole表示をすればなんとなく原因はわかったはずです。

jQueryは便利ですが、なんとなく使用していると自分が何を操作しているのかわからなくなります。
一つ一つ確認して作成していきましょう。

投稿2021/07/11 04:17

編集2021/07/11 04:20
k4a

総合スコア983

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

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

mitrasi

2021/07/14 07:36

ご回答ありがとうございます。 遅くなりまして申し訳ございません。 おっしゃる通り試してみましたところ、画像は問題なく表示されました。 (consoleのほうにも無事altの値が出力されているのを確認しました) キャプション表示の方はいまだに表示されませんが、今回の質問としましては一応「undefinedが出る現象の原因と解決」でしたので、その点は解決したということで一旦こちらは示させて頂きたく思います。 もう少し試してみて直らなければ再度別途質問にてご質問させて頂きます。 ご丁寧な解説まで、ありがとうございました。
k4a

2021/07/14 08:17

キャプション表示されませんか? 私の環境ですと、ご提示いただいたHTMLと回答のJSでキャプションが表示されています。 ※alt属性の文字列がp要素として追加されている状態を私はキャプションと認識しています jqueryの読み込み忘れなどありませんか?
mitrasi

2021/07/15 06:26

ご回答ありがとうございます。 jQueryはhead内で読み込んでおりました。 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 検証ツールで見た際にHTMLに追加されている、ということでしたら私の方でも確認できております。 ただ、したいこととしましては、hoverすると画像の上に幕(?)のように色のついたdivがかぶさり、そこに取得したキャプションが表示される(こちらに関してはcssはあらかじめ設定していて、jsをきっかけにスタイルが適用される)という感じのものです。 私の説明不足で申し訳ありません。 新規質問の方にcssなどもあげておりますので、よろしければお力添え頂けますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問