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

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

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

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

Q&A

1回答

1010閲覧

jQueryでの任意関数などを使ったコードの短縮(ドライアップ)の正しい方法を教えて下さい

yuiran

総合スコア15

jQuery

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

0グッド

1クリップ

投稿2021/05/09 06:16

編集2021/05/10 02:04

jQueryを使ってWebアプリを作成しています。

かんたんな単位換算なのですが、換算する単位ごとに、if構文を作っているのですが、変数やelseの処理など、同じコードを書く部分があります。

同じコードを書く部分については、任意関数などを作って、ドライアップしたいと思うのですが、自分で作ってみてもうまくいきませんでした。

以下HTMLとjQueryのコードです。

HTML

1<div class="row"> <!-- 一段目 --> 2 <div class="col-auto">  <!-- インチ --> 3 <div class="card" style="max-width:20rem;"> 4 <div class="card-title h2 text-center">Inch</div> 5 <img class="card-img-top" src="picforucv/inch.png" alt="image of centimeter"> 6 <div class="card-body" style="text-align: center;"> 7  <form class="form-inline"> 8 <input style="width: 120px;" type="number" class="form-control mb-2 mr-sm-2" id="inch" name="inch" value="" > 9 <h3> Inch</h3> 10  </form> 11 <button type="button" class="btn-info" id="btnfin">Convert</button> 12 </div> <!-- card-body終わり --> 13 </div> <!-- card終わり --> 14 </div> <!-- col-4終わり --> 15 16 <div class="col-auto">  <!-- センチ --> 17 <div class="card" style="max-width:20rem;"> 18 <div class="card-title h2 text-center">Centi meter</div> 19 <img class="card-img-top" src="picforucv/centimeter.jpg" alt="image of centimeter"> 20 <div class="card-body" style="text-align: center;"> 21  <form class="form-inline"> 22 <input style="width: 120px;" type="number" class="form-control mb-2 mr-sm-2" id="cm" name="cm" value="" > 23 <h3> cm</h3> 24  </form> 25 <button type="button" class="btn-info" id="btnfin">Convert</button> 26 </div> <!-- card-body終わり --> 27 </div> <!-- card終わり --> 28 </div> <!-- col-4終わり --> 29 30 <div class="col-auto">  <!-- メートル --> 31 <div class="card" style="max-width:20rem;"> 32 <div class="card-title h2 text-center">Metre</div> 33 <img class="card-img-top" src="picforucv/meter.png" alt="origin of mtere"> 34 <div class="card-body" style="text-align: center;"> 35  <form class="form-inline"> 36 <input style="width: 120px;" type="number" class="form-control mb-2 mr-sm-2" id="m" name="m" value="" > 37 <h3> m</h3> 38  </form> 39 <button type="button" class="btn-info" id="btnfin">Convert</button> 40 </div> <!-- card-body終わり --> 41 </div> <!-- card終わり --> 42 </div> <!-- col-4終わり --> 43 44 45 </div> <!-- 一段目row終わり-->

jQuery

1 // (1)インチへの単位変換 2 $('#btnfin').click(function() { 3 4//inputタグへの各単位の割当 5 6  const inch = $('#inch').val(); 7 const cm = $('#cm').val(); 8 const m = $('#m').val(); 9 10 11//インチから他の単位系への計算式 12const convertedTocm = inch * 2.5399; /* センチへ */ 13const convertedTom = inch * 2.5399 / 100; /* メートルへ */ 14 15 16//インチに入力があったら他の単位系に計算後の数値を出力する 17if (inch !== '' && cm === '' && m === "" && feet === "" && sun === "" && shyaku === "") { 18 $('#cm').val(Math.round(convertedTocm * 10) / 10); 19 $('#m').val(Math.round(convertedTom * 1000) / 1000); 20 21 22 }else { 23 $('#inch').val(''); 24 $('#cm').val(''); 25 $('#m').val(''); 26 27 } 28 }); 29

jQueryのコードで以下の部分を、他の単位系からの換算のときにも全く同じコードを書くことになるので
任意関数などを作ってドライアップしたいと思っています。

jQuery

1//inputタグへの各単位の割当 2  const inch = $('#inch').val(); 3 const cm = $('#cm').val(); 4 const m = $('#m').val(); 5 6else { 7 $('#inch').val(''); 8 $('#cm').val(''); 9 $('#m').val(''); 10

以下は試したことです。

jQuery

1function unitAllocation(){ 2  const inch = $('#inch').val(); 3 const cm = $('#cm').val(); 4 const m = $('#m').val(); 56 7 // (1)インチへの単位変換 8 $('#btnfin').click(function() { 9 10//inputタグへの各単位の割当 11unitAllocation(); 12  13 14//インチから他の単位系への計算式 15const convertedTocm = inch * 2.5399; /* センチへ */ 16const convertedTom = inch * 2.5399 / 100; /* メートルへ */ 17 18 19//インチに入力があったら他の単位系に計算後の数値を出力する 20if (inch !== '' && cm === '' && m === "" ) { 21 $('#cm').val(Math.round(convertedTocm * 10) / 10); 22 $('#m').val(Math.round(convertedTom * 1000) / 1000); 23 24 25 }else { 26 $('#inch').val(''); 27 $('#cm').val(''); 28 $('#m').val(''); 29 30 } 31 }); 32 33

各単位への入力及び表示のinputタグへの割当を任意関数を作ってやってみたのですが、うまく動きません。
具体的には、インチの入力欄に1を入力して、convertボタンをクリックしても、反応せず、他の単位に換算された数値が入りませんでした。

上記の様にドライアップしていないコードでは、換算された数値が入力されうまく動きます。
つまり、unitAllocation();という関数を作成しないで、

$('#btnfin').click(function() {
の下に、

const inch = $('#inch').val();
const cm = $('#cm').val();
const m = $('#m').val();

を書いたコードでは、インチの入力欄に数値を入力し、Convertボタンをクリックすると、他の単位の入力欄に換算された数値が入り動きます。

elseの部分もドライアップしたいと思っています。

上記のような場合は、どのようにしたら正しくドライアップできるのでしょうか?
あるいは、できないものなのでしょうか?

初心者なので、お手数とは思いますが、噛み砕いて説明いただけますと大変助かります。

よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2021/05/09 06:32

リファクタリングの類はやろうと思えば幾らでもできるので なるべく観点や具体的な目的を明確にした方が良いです。 結局「動けばそれで正しい」ので「正しい方法」というのは実は存在しません。ゴールは1つでもルートは無数にあります。
yuiran

2021/05/09 08:05 編集

コメントをありがとうございます。 そうかも知れませんが、何度も同じコードを書くのは効率が悪いし、冗長になってしまうのかなと思い、それらは短縮してかけたらと思って調べており、自分ではうまくできなかったのでこちらに相談をさせていただきました。 質問にあげました箇所について、短縮して書く方法をご存知でしたら、教えていただけますと幸いです。 よろしくお願いいたします。
m.ts10806

2021/05/10 02:07 編集

「試したこと」に関してだけ言及すると、変数や関数のスコープを理解してないところからです。関数内でをconstつけて定義してしまうとその変数のスコープはその関数内です。
m.ts10806

2021/05/09 10:55

「正解がない」のでアドバイス得られないと思って差し支えないです。 なので、なるべく観点を明確にした方が良いですし、試したことについても「うまくいかない」ではなく「起きている問題」を明記してほしいです。 質問は編集できます。
int32_t

2021/05/10 00:56

「ドライアップ」とはどういう意味でしょうか?
yuiran

2021/05/10 02:08 編集

m.ts10806さん 丁寧にお返事をいただきありがとうございました。 また、私の質問のし方に不十分な点があり、わかりにくかったとのこと申し訳ありませんでした。 合わせて、ご指導いただき感謝しております。 「うまく行かなかった」部分については具体的にどうだったのかを質問文に追記してみました。
yuiran

2021/05/10 02:08

int32_tさん ドライアップとは、海外のjQueryの講座を見ていたときにその先生が使っていた言葉で、何回も書くことになる、同じコードを、関数などを作ってまとめ、それを使う箇所に記述することで、コード全体の書く量を短くすることです。
m.ts10806

2021/05/10 02:12

文脈からなんとなく理解したつもりですが海外的な表現なんですかね。 「非効率な処理の効率化やコードの正規化(変数名などの見直し含め)」を伝えたいのでしたら先に書いたように「リファクタリング」としたほうがダイレクトに伝わると思います。teratailのタグにもあるので、質問タグとして追記してみては。 https://teratail.com/tags/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0 となると、jQueryの書き方や機能というよりJavaScriptのコードの正規化になるのでJavaScriptもタグとしてあったほうが良さそうです。
yuiran

2021/05/11 03:12

すみません。使う言葉が適切ではなかったようですね。ドライアップという単語はプログラマーの中で万国共通で使われている専門用語だと思っておりました。 失礼いたしました。
guest

回答1

0

レートをオブジェクトでもっておけばよいでしょう

javascript

1const rate={ 2m:{cm:100,mm:1000}, 3cm:{m:0.01,mm:10}, 4mm:{m:0.001,cm:0.1}, 5} 6console.log(rate["m"]["mm"]);

投稿2021/05/10 02:00

yambejp

総合スコア116724

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

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

yuiran

2021/05/11 07:51

ありがとうございます。 初心者なので理解力が足りず申し訳ありません。 お示しいただきましたアドバイスは、各単位での変換レートの式でしょうか? 私が短縮したいのは、変換前の各単位の入力欄と、変換後の各単位の表示欄についてのコードを短縮したいと思っております。 例:インチは、#inchとidをふったinput欄に表示あるいは入力すると規定するためのコードです。 換算の式は、各単位系から他の単位系に換算するのがすべて異なるのでここは短縮せずに書こうと思っています。 理解力が乏しく、失礼になっていましたら申し訳ありません。 よろしくお願いいたします。
yambejp

2021/05/11 08:34

こういうイメージかと思ったのですが違いますか? <script> window.addEventListener('DOMContentLoaded', ()=>{ const rate={ m:{cm:100,mm:1000}, cm:{m:0.01,mm:10}, mm:{m:0.001,cm:0.1}, } document.querySelectorAll('select,input').forEach(x=>{ x.addEventListener('input',e=>{ const x1=document.querySelector('#x1').value; const x2=document.querySelector('#x2').value; const x4=document.querySelector('#x4').value; const v=x1*rate[x2][x4]; document.querySelector('#x3').value=v||""; }); }); }); </script> <input type="text" id="x1"> <select id="x2"> <option value="">--</option> <option value="m">m</option> <option value="cm">cm</option> <option value="mm">mm</option> </select><br> <input type="text" id="x3" readonly> <select id="x4"> <option value="">--</option> <option value="m">m</option> <option value="cm">cm</option> <option value="mm">mm</option> </select>
yuiran

2021/05/14 02:33

ご回答をありがとうございます。 イメージが難しくなりすぎていて余計わからないです… 初心者なので、自分が考えたフレームワーク以外のことを深く提案されても 余計混乱してしまいます。すみません。 コードで書くとお互いに理解に関する負担がかかって大変かもしれないと思いましたので、言葉で説明しますと、 単位換算をするために、3つのinputタグを使って、換算したい単位の数値を入力でき、かつ、入力がない場合には、他の単位からの換算された数値が出力されるinput欄を作りました。 短縮したいコードは上記コードで、この部分のコードは、どの単位から外の単位に換算するクリックファンクションのコードでも同じことを書くことになるので、この部分を1行など短い記述で短縮できるようにする方法はないかなと思っての質問です。
yambejp

2021/05/14 02:48 編集

> 自分が考えたフレームワーク以外のことを深く提案されても > 余計混乱してしまいます 了解しました。 煩雑なソースだったリファクタリングを希望されているのかと思ったのですが そういうわけではないのですね? ちょっとおせっかいが過ぎたようです。 私からはこれ以上助言はありません。がんばってください
yuiran

2021/05/14 07:42

高度なアドバイスを私の方で受け取れない形になってしまい申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問