🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

jQuery

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

Q&A

解決済

2回答

751閲覧

【jQuery】コードが長くダサいので、シンプルにまとめたい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

0グッド

3クリップ

投稿2019/12/12 19:40

機能は動きます。
ただ、コードが恐らく無駄に長いので、シンプルにまとめる方法をご教授いただけたら幸いです。
つぎはぎで手探りでコードを書いていたら、下記のようなコードになってしまいました、、、

jQuery

1 <script> 2 $(function() { 3 $(':radio.now, #wight__wrap :checkbox').on('change',function(e) { 4 var scores = $(':radio.now:checked,#wight__wrap :checkbox:checked').map(function(){ 5 return parseInt($(this).data("price")); 6 }).get()||[]; 7 if($('#p__model__inner a.submitBtn').data("price")>0){ 8 scores.push($('#p__model__inner a.submitBtn').data("price")); 9 } 10 if($('#p__engraving__inner a.submitBtn').data("price")>0){ 11 scores.push($('#p__engraving__inner a.submitBtn').data("price")); 12 } 13 if($('#p__grip__inner a.submitBtn').data("price")>0){ 14 scores.push($('#p__grip__inner a.submitBtn').data("price")); 15 } 16 if($('#p__shaftband__inner a.submitBtn').data("price")>0){ 17 scores.push($('#p__shaftband__inner a.submitBtn').data("price")); 18 } 19 if($('#p__cover__inner a.submitBtn').data("price")>0){ 20 scores.push($('#p__cover__inner a.submitBtn').data("price")); 21 } 22 if($('#weight__stamp__inner a.submitBtn').data("price")>0){ 23 scores.push($('#weight__stamp__inner a.submitBtn').data("price")); 24 } 25 if($('#p__option__inner a.submitBtn').data("price")>0){ 26 scores.push($('#p__option__inner a.submitBtn').data("price")); 27 } 28 if(scores.length>0){ 29 var sum = scores.reduce((a,x)=>a+x); 30 if (sum >= 30000) { 31 $("#sent").text(0); 32 } else { 33 $("#sent").text(550); 34 } 35 var postage = Number($("#sent").text()); 36 if ($(":radio.plusbutton").is(":checked") && $(":radio.plusthree").is(":checked")) { 37 sum -= 30000; 38 } 39 if ($(":radio.plusbutton").is(":checked") && $(":radio.ifplate").is(":checked")) { 40 sum -= 12000; 41 } 42 $("#sum").text(sum); 43 $("#tax").text(sum * 0.1); 44 $("#all").text(sum + sum * 0.1 + postage); 45 } 46 }).eq(0).trigger('change'); 47 48 $('#p__model__inner a.submitBtn').on('click', function(e) { 49 e.preventDefault(); 50 $(this).data("price",$('[name=model]:checked').data('price')); 51 $(':radio.now').eq(0).trigger('change'); 52 }).data("price",0); 53 54 $('#p__engraving__inner a.submitBtn').on('click', function(e) { 55 e.preventDefault(); 56 $(this).data("price",$('[name=engraving]:checked').data('price')); 57 $(':radio.now').eq(0).trigger('change'); 58 }).data("price",0); 59 60 $('#p__grip__inner a.submitBtn').on('click', function(e) { 61 e.preventDefault(); 62 $(this).data("price",$('[name=grip]:checked').data('price')); 63 $(':radio.now').eq(0).trigger('change'); 64 }).data("price",0); 65 66 $('#p__shaftband__inner a.submitBtn').on('click', function(e) { 67 e.preventDefault(); 68 $(this).data("price",$('[name=shaftband]:checked').data('price')); 69 $(':radio.now').eq(0).trigger('change'); 70 }).data("price",0); 71 72 $('#p__cover__inner a.submitBtn').on('click', function(e) { 73 e.preventDefault(); 74 $(this).data("price",$('[name=weight__stamp]:checked').data('price')); 75 $(':radio.now').eq(0).trigger('change'); 76 }).data("price",0); 77 78 $('#weight__stamp__inner a.submitBtn').on('click', function(e) { 79 e.preventDefault(); 80 $(this).data("price",$('[name=p__cover]:checked').data('price')); 81 $(':radio.now').eq(0).trigger('change'); 82 }).data("price",0); 83 84 $('#p__option__inner a.submitBtn').on('click', function(e) { 85 e.preventDefault(); 86 $(this).data("price",$('[name=p__option]:checked').data('price')); 87 $(':radio.now').eq(0).trigger('change'); 88 }).data("price",0); 89 90 }); 91 </script>

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

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

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

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

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

m.ts10806

2019/12/12 21:08

>機能は動きます 仕様を説明せずにコードだけで理解しろと言うのは横暴ではないでしょうか。 リファクタリングをする上で大事なのは「改修後も同じ動作をすること」です。 ダサいかどうかはどうでも良く、どのような機能なのかをきちんと説明しないことには見た目簡潔なコードに見えても同じ動作をしない可能性もあります。 全ての要件を満たしたうえでリファクタリングする必要がありますね。 ということでJavaScriptのコードだけ提示されても再現確認ができません。 HTML,CSS含めて仕様もきちんと提示してください。
退会済みユーザー

退会済みユーザー

2019/12/13 15:16

お世話になっております。 ご回答頂き、誠に有難うございます。 今後、上記の点を気をつけたいと思います。 引き続き、どうぞよろしくおねがいいたします。
guest

回答2

0

ベストアンサー

例えば、

javascript

1if($('#p__model__inner a.submitBtn').data("price")>0){ 2 scores.push($('#p__model__inner a.submitBtn').data("price")); 3} 4if($('#p__engraving__inner a.submitBtn').data("price")>0){ 5 scores.push($('#p__engraving__inner a.submitBtn').data("price")); 6}

の部分は、

javascript

1var a; 2 3a = $('#p__model__inner a.submitBtn'); 4if(a.data("price")>0){ 5 scores.push(a.data("price")); 6} 7 8a = $('#p__engraving__inner a.submitBtn'); 9if(a.data("price")>0){ 10 scores.push(a.data("price")); 11}

のように書き直すことで、

javascript

1if(a.data("price")>0){ 2 scores.push(a.data("price")); 3}

を共通のコードとして取り出せます。
この部分を関数化することで、

javascript

1var f = function(a) { 2 if(a.data("price")>0){ 3 scores.push(a.data("price")); 4 } 5}; 6 7f($('#p__model__inner a.submitBtn')); 8f($('#p__engraving__inner a.submitBtn'));

のように書けます。

リファクタリングの基本はこんな感じです。
これ以上は作業依頼となるので、あとはご自身でがんばってください。

投稿2019/12/12 22:41

2KOH

総合スコア999

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

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

退会済みユーザー

退会済みユーザー

2019/12/13 15:14

お世話になっております。 具体的なコードまで頂き、非常に有難うございます! 上記で実践したいと思います。
guest

0

たぶんクラスでまとめると驚くほど短くなると思います
逆にhtmlを例示し何をトリガーにどうしたいか書いたほうが回答はしやすいと思います

投稿2019/12/13 00:21

yambejp

総合スコア116694

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

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

退会済みユーザー

退会済みユーザー

2019/12/13 15:15

お世話になっております。 いつもご回答頂き、誠に有難うございます。 非常に参考になりました。 今後、上記の点を気をつけたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問