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

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

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

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

jQuery

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

Q&A

解決済

5回答

1831閲覧

インクリメント処理のコードの纏め方

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2016/09/14 20:21

編集2016/09/14 20:29
$('#sample1').on('click', function() { $('#hide1').hide(); $('li:nth-child(1)').show(); }); $('#sample2').on('click', function() { $('#hide2').hide(); $('li:nth-child(2)').show(); }); $('#sample3').on('click', function() { $('#hide3').hide(); $('li:nth-child(3)').show(); });

数字部分がインクリメントなので、
上記のような連番処理を一つに纏めたいと思うのですが、どのような方法が考え得ますでしょうか。

また、上記がid指定で最も単純な形だと思われますが、纏める場合より、jsの処理速度としては最も速い形となりますでしょうか。

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

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

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

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

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

guest

回答5

0

ベストアンサー

#パターン1:属性セレクタでまとめる

JavaScript

1$("[id^=sample]").on("click", function() { 2 var num = this.id.substring(6); 3 $("#hide" + num).hide(); 4 $("li:nth-child(" + num + ")").show(); 5});

#パターン2:イベントハンドラは親要素に仕掛ける
イベントハンドラは#sample1~の親要素(祖先要素でも可)に仕掛けます。発生源はevent.targetで特定し、idから番号を取り出します。

JavaScript

1$("body").on("click", function(e) { 2 var t = e.target; 3 var num; 4 5 if(t.tagName === "P") { 6 num = event.target.id.substring(6); 7 $("#hide" + num).hide(); 8 $("li:nth-child(" + num + ")").show(); 9 } 10});
  • 手元でテストした時は、body要素に直置きしたので、仕掛け先がbody要素になっています。
  • #sample1~は適当にp要素にしたので、tagNameがPかどうかでチェックしています。

#パターン3:1つ1つ仕掛けていく(元の方法)
(割愛)

#実行速度の実測

  • p#sample1~10000、liを10000個、div#hide1~10000まで用意して実験
  • テスト環境はChrome、jQueryは2.2.3使用
  • $.onの仕掛けにかかる時間のみで、関数そのものの速度は考慮していません。

パターン1:3回平均80ms
パターン2:3回平均2ms
パターン3:3回平均148ms

#結論
イベントハンドラの仕掛けに限れば、親または祖先要素に仕掛けて、$.onの回数自体を減らしたほうが効果的かと思います。

個人的には1が最も遅いと予測していたのですが…単純にソースの長さとかかな…?3はテストだと何万行もありましたので。

投稿2016/09/15 00:12

編集2016/09/15 00:15
sii_side

総合スコア849

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

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

0

単にiで回して作ると同じiを見に行くので、即時関数で囲む必要があります。jQueryオブジェクト取得を事前に行っているため、クリックしたときの速度は元のコードより速くなっているはずです。

JavaScript

1for (let i = 1; i <= 3; i++) { 2 ((b, h, l) => { 3 b.on('click', () => { 4 h.hide(); 5 l.show(); 6 }); 7 })($(`#sample${i}`), $(`#hide${i}`), $(`li:nth-child(${i})`)); 8}

IE11などECMAscript2015に対応していないブラウザでも動かしたい場合は、Babel等でトランスパイルしてから使ってください。

投稿2016/09/14 22:19

raccy

総合スコア21735

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

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

0

タグ名でアクセスしてidを拾えばよいのでは?

javascript

1$(function(){ 2 $('div').click( function() { 3 if(r=$(this).prop('id').match(/^sample([0-9]+)$/)){ 4 $('#hide'+r[1]).hide(); 5 $('li:nth-child('+r[1]+')').show(); 6 } 7 }); 8});

#追記
どうしてもforで回したidを利用してアクセスしたいならこんな感じ?

javascript

1$(function(){ 2 for(var i = 1; i <= 3; i++) { 3 $('#sample'+i).data('i',i); 4 $('#sample'+i).click( function() { 5 var i=$(this).data('i'); 6 $('#hide'+i).hide(); 7 $('li:nth-child('+i+')').show(); 8 }); 9 } 10}); 11

投稿2016/09/15 00:53

編集2016/09/15 03:53
yambejp

総合スコア114775

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

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

yamato_hikawa

2016/09/15 03:43

あらゆるdiv要素をクリックするとこの処理を行う形なのがネックですね。
guest

0

私だったら1つの関数を用意してそれでまかなえるようにします。
ボタンに紐づく対象をそれぞれ事前に取得するようにして、イベント時にその対象を操作する形です。

html

1<div class="sample" data-index="1">test1</div> 2<div class="sample" data-index="2">test2</div> 3<div class="sample" data-index="3">test3</div> 4 5<div class="hide" data-index="1">hide1</div> 6<div class="hide" data-index="2">hide2</div> 7<div class="hide" data-index="3">hide3</div> 8 9<ul class="list"> 10 <li data-index="1">show1</li> 11 <li data-index="2">show2</li> 12 <li data-index="3">show3</li> 13</ul>

css

1.list li { 2 display: none; 3}

javascript

1var Sample = function(selector){ 2 this.$btn = $(selector); 3 this.init(); 4}; 5 6Sample.prototype = { 7 init: function(){ 8 /* indexの値を元に操作対象を絞り込み */ 9 this.index = this.$btn.data('index'); 10 this.$hide = this.getTarget('.hide', this.index); 11 this.$show = this.getTarget('.list li', this.index); 12 this.bindEvent(); 13 }, 14 getTarget: function(selector, index){ 15 return $(selector).filter(function(){ 16 return $(this).data('index') === index; 17 }); 18 }, 19 bindEvent: function(){ 20 var _self = this; 21 22 this.$btn.on('click', function(){ 23 _self.toggle(); 24 }); 25 }, 26 toggle: function(){ 27 this.$hide.hide(); 28 this.$show.show(); 29 } 30}; 31 32$('.sample').each(function(){ 33 new Sample(this); 34});

投稿2016/09/15 04:04

yamato_hikawa

総合スコア2092

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

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

0

回答しましたが、無名関数の考慮がもれていたので、無視してください。すみません。

javascript

1for(var i = 1; i <= 3; i++) { 2 $('#sample' + i).on('click', function() { 3 $('#hide' + i).hide(); 4 $('li:nth-child(' + i + ')').show(); 5 }); 6}

投稿2016/09/14 20:25

編集2016/09/14 23:00
popobot

総合スコア6586

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

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

raccy

2016/09/14 21:50

これで、本当にうまくいきますか?作られた3つの無名関数内全てで、iが常に3になりませんか?(ほかにも0から始まっている、'li:nth-child(i)'でのiがただの文字になっているというのもありますけど)
popobot

2016/09/14 22:36 編集

あら、無名関数であることをあまり意識してなかったです...色々ミスってましたね...すみません。ご指摘ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問