あなたの例はおそらく単純化されているので、正確に言うのは難しいです。ただし、ID で選択するのではなく、より一般的なセレクターを試してください ( を使用できます$('[id^="q"]')
が、それは実際のベスト プラクティスではありません)。ID 要素をクラスのように使用していますが、これは実際にid
は目的ではありません。
ボタンやターゲットのclass
ような属性をすべて与えると、次のようなことができます:class="q"
class="item"
$('.q').each(function(index) {
var targetItem = $('.item').eq(index);
$(this).click(function() {
clearIt();
targetItem.show();
});
});
ただし、マークアップ内でクリック可能な各要素のターゲットを指定する方が簡単で、安全で、より良い方法です。
<a href="#" class="p" target-index="01">p01</a>
<a href="#" class="p" target-index="02">p02</a>
<div class="item" item-index="01">item01</div>
<div class="item" item-index="02">item02</div>
その場合、ページ上の順序と場所は問題になりません。それらを直接選択することができます:
var num = $(this).attr('target-index');
var targetItem = $('.item[item-index="' + num + '"]');
最後に (そして私の好みのアドバイス)、ターゲットの ID をボタン自体に入れることができます。
<a href="#" class="p" for="item01">p01</a>
<div id="item01">item01</div>
次に、ターゲットの場所に関係なく、ターゲットをすばやく安全に選択できます。
var targetItem = $('#' + $(this).attr('for'));
編集1:
最初のスニペットでは、要素の順序について仮定しています。これは、クリックされた要素をターゲット アイテムに関連付ける方法がたくさんあるためです。マークアップのルールを知っているのはあなただけです。つまり、どのような仮定が機能するかを知っているのはあなただけです。例えば:
var targetItem = $('#' + $(this).attr('id').replace(/^q/, 'item'));
var targetItem = $(this).siblings('[id^="item"]');
var targetItem = $(this).children('[id^="item"]');
var targetItem = $(this).parents('[id^="item"]');
var targetItem = $(this).find('[id^="item"]');
私が提案した手法を使用しない場合target-index
は、HTML に関する知識に基づいて、少なくともいくつかの仮定を行う必要があります。
編集2:
イベントバインディングコードを改善するのではなく、ハンドラーをトリガーしようとしているというコメントに基づいて、次のように行うことができます。
//quick and dirty zero-padding function from http://stackoverflow.com/q/10073699/399649
var pad = function(num, size) {
return (Math.pow(10, size) + ~~num).toString().substring(1);
};
for(var i = 1; i < $('[id^="q"]').length; i++) {
var index = pad(i, 2);
$('#q' + index).trigger('click');
}