$('#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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア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
総合スコア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総合スコア114775
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア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総合スコア6586
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。