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

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

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

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

jQuery

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

Q&A

解決済

2回答

1290閲覧

jQueryのeachの使い方がいまいちわかっていない

jiplog

総合スコア11

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2018/08/20 06:43

前提・実現したいこと

ここに質問の内容を詳しく書いてください。

それぞれの野菜の文字数に合わせてwidthを変えたいのですが、
合計の文字数が出力されてしまいます。
どうしたらいいでしょうか。。。

■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ

該当のソースコード

$(function () { $('.txtlength').each(function(){ var yasaiTxt = $('.txtlength').length); $(this).css('width',yasaiTxt + 'em'); }); });

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

野菜の文字数に合わせて

野菜はどこにあるねん
野菜の文字数教えてくれって質問で野菜がないってどういうことやねん

ツッコミはさておき見ていきましょう。
まずはeachの使い方からおさらい。

書式はjQueryObject.each( function(index, Element) )です。
jQueryオブジェクトはDOMツリーを検索した結果の、
擬似的な「要素の配列」といった存在のオブジェクトを指します。

eachという英単語を翻訳すると「各々」といった感じの意味で、
この配列として取れたDOM君すべてに、各々この関数を実行しなさいといった感じの命令となります。
したがって、引数は「各々で実行する」を満たす為に必要な情報が格納されます。

  • 第一引数index: 0から始まる配列のindex値、jQuery.get(index)等としてアクセスできる
  • 第二引数element: 配列の1要素、jQueryではなくDOM APIの正式なElementを指す

この前提条件をJSのコードを見ていきましょう。
※HTMLがわからないので完全にヤマカンです。

JavaScript

1$(function () { 2 $('.txtlength').each(function(){ 3 var yasaiTxt = $('.txtlength').length); 4 $(this).css('width', yasaiTxt + 'em'); 5 }); 6});

要点は.txtlengthです。
jQueryは$(CSSセレクタ)でDOMツリーを検索して対象となるDOMを見つけて配列(jQueryオブジェクト)として返してくれます。
つまり、ドットで始まる.txtlengthはクラス名ということがわかります。

なら現状のHTMLはこんな感じにしてるんじゃないですかね?

HTML

1<ui class="vegetables"> 2 <li> 3 <h3>水菜</h3> 4 <span class="txtlength" style="display: none;">2</span> 5 </li> 6 <li> 7 <h3>大根</h3> 8 <span class="txtlength" style="display: none;">2</span> 9 </li> 10</ui>

もしそうなら子供要素の.txtlengthを検索してきて、
CSSの横幅をいじったとしても親要素のliとしては大したことないですよね?
$(this).parent().css()みたいな感じで親のブロック要素を直接いじる必要が出てきます。

また、JavaScriptの世界では文字列はtext.lengthという風に.lengthで文字数を取得出来ますので、
「水菜」の横に「Radish」等と日本語と英語がごちゃ混ぜでない限りは野菜名のみで上手くいくでしょう。
したがってtxtlengthという文字数だけを格納したタグは不要です。

上記のHTML想定ですが、セレクタは.vagetables liにしましょう。
コードに落とし込むとこんな感じになります。

HTML

1<ui class="vegetables"> 2 <li> 3 <h3>水菜</h3> 4 </li> 5 <li> 6 <h3>大根</h3> 7 </li> 8</ui>

JavaScript

1$(function () { 2 $('.vagetables li').each(function(){ 3 var yasaiTxt = $(this).find('h3').text(); 4 $(this).css('width', yasaiTxt.length + 'em'); 5 }); 6});

投稿2018/08/20 07:16

miyabi-sun

総合スコア21158

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

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

jiplog

2018/08/20 08:31

めちゃくちゃ詳しいご対応ありがとうございます! 多分ここの方ならこの程度の質問であれば、html部分はなくてもわかるだろうと思って省略してしまいました。すいません! (実質思った通りのすごい方が回答してくださっております!) 横並びでflexでwrapしないで並べたかったのですが、幅を一番長い文字数で合わせると幅がどんどん長くなってしまうので名前に合わせてそれぞれの文字数に合わせて li の幅を自動で出力して欲しかったのです。 助かりました!ありがとうございます!
guest

0

ベストアンサー

こうでは?

js

1// var yasaiTxt = $('.txtlength').length); 2// ↓ ↓ ↓ 3 var yasaiTxt = $(this).text().length;

投稿2018/08/20 06:52

kei344

総合スコア69407

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

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

jiplog

2018/08/20 06:56

迅速なお答えありがとうございます!!! 助かりました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問