很难准确地说,因为您的示例可能已简化。但是尝试使用更通用的选择器,而不是通过 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');
}