使用 JavaScript 循环遍历 ID 中带有数字的元素
Using JavaScript to cycle through elements with numbers in the ID
我有兴趣循环浏览一些 div 我的页面上有 ID 中的数字。
这是我目前所拥有的...
var count = 1;
while(count != 12) {
$('#logo-'.concat(count).concat(' > img')).click(function() {
if($('#info-'.concat(count)).hasClass('dropdown-active')) {
$('#info-'.concat(count)).slideUp();
$('#info-'.concat(count)).removeClass('dropdown-active');
} else {
$('#info-'.concat(count)).slideDown();
$('#info-'.concat(count)).addClass('dropdown-active');
}
return false;
});
count++;
}
计数似乎在达到 if 语句时停止工作。
所以页面上的 ID 是 logo-1、info-1、logo-2、info-2 等等...
您可以更干净地执行此操作,如下所示:
while(count != 12) {
$('#logo-' + count + ' > img').click(function() {
var origin = $(this).parent(),
targetId = '#info-' + origin[0].id.substring(5),
target = $(targetId);
if(target.hasClass('dropdown-active')) {
target.slideUp();
target.removeClass('dropdown-active');
} else {
target.slideDown();
target.addClass('dropdown-active');
}
return false;
});
count++;
}
但最好为所有徽标提供相同的 class(例如,"logo"),然后您可以放弃 while
循环:
$('.logo > img').click(function() {
var origin = $(this).parent(),
targetId = '#info-' + origin[0].id.substring(5),
target = $(targetId);
if(target.hasClass('dropdown-active')) {
target.slideUp();
target.removeClass('dropdown-active');
} else {
target.slideDown();
target.addClass('dropdown-active');
}
});
编辑: 正如 Karl-André Gagnon 在评论中指出的那样,您还可以使用 $('[id^="logo-"]')
作为给他们 class 的替代方法,并且仍然使用无 while 循环方法。
从 ID 中解析数字的另一种方法是将数字存储在 data-num
属性中:
<div class='logo' data-num='1'>...</div>
然后用 substring 方法代替 var origin...
东西,你会:
var num = $(this).parent().data('num'),
target = $('#info-' + num);
虽然 JLRishe 的答案更可取,但这里有一个主要是用闭包来做的学术演示:
var count = 1;
while(count != 12) {
(function(id){
$('#logo-'.concat(id).concat(' > img')).click(function() {
if($('#info-'.concat(id)).hasClass('dropdown-active')) {
$('#info-'.concat(id)).slideUp();
$('#info-'.concat(id)).removeClass('dropdown-active');
} else {
$('#info-'.concat(id)).slideDown();
$('#info-'.concat(id)).addClass('dropdown-active');
}
return false;
});
}(count));
count++;
}
通过调用函数并将值作为参数传递,您创建了一个新范围,因此 id 将在点击函数中保持它的值。我不一定会推荐这种方法(此外,您的代码中还有许多低效之处),但希望它是闭包和作用域的有趣演示。
我有兴趣循环浏览一些 div 我的页面上有 ID 中的数字。
这是我目前所拥有的...
var count = 1;
while(count != 12) {
$('#logo-'.concat(count).concat(' > img')).click(function() {
if($('#info-'.concat(count)).hasClass('dropdown-active')) {
$('#info-'.concat(count)).slideUp();
$('#info-'.concat(count)).removeClass('dropdown-active');
} else {
$('#info-'.concat(count)).slideDown();
$('#info-'.concat(count)).addClass('dropdown-active');
}
return false;
});
count++;
}
计数似乎在达到 if 语句时停止工作。
所以页面上的 ID 是 logo-1、info-1、logo-2、info-2 等等...
您可以更干净地执行此操作,如下所示:
while(count != 12) {
$('#logo-' + count + ' > img').click(function() {
var origin = $(this).parent(),
targetId = '#info-' + origin[0].id.substring(5),
target = $(targetId);
if(target.hasClass('dropdown-active')) {
target.slideUp();
target.removeClass('dropdown-active');
} else {
target.slideDown();
target.addClass('dropdown-active');
}
return false;
});
count++;
}
但最好为所有徽标提供相同的 class(例如,"logo"),然后您可以放弃 while
循环:
$('.logo > img').click(function() {
var origin = $(this).parent(),
targetId = '#info-' + origin[0].id.substring(5),
target = $(targetId);
if(target.hasClass('dropdown-active')) {
target.slideUp();
target.removeClass('dropdown-active');
} else {
target.slideDown();
target.addClass('dropdown-active');
}
});
编辑: 正如 Karl-André Gagnon 在评论中指出的那样,您还可以使用 $('[id^="logo-"]')
作为给他们 class 的替代方法,并且仍然使用无 while 循环方法。
从 ID 中解析数字的另一种方法是将数字存储在 data-num
属性中:
<div class='logo' data-num='1'>...</div>
然后用 substring 方法代替 var origin...
东西,你会:
var num = $(this).parent().data('num'),
target = $('#info-' + num);
虽然 JLRishe 的答案更可取,但这里有一个主要是用闭包来做的学术演示:
var count = 1;
while(count != 12) {
(function(id){
$('#logo-'.concat(id).concat(' > img')).click(function() {
if($('#info-'.concat(id)).hasClass('dropdown-active')) {
$('#info-'.concat(id)).slideUp();
$('#info-'.concat(id)).removeClass('dropdown-active');
} else {
$('#info-'.concat(id)).slideDown();
$('#info-'.concat(id)).addClass('dropdown-active');
}
return false;
});
}(count));
count++;
}
通过调用函数并将值作为参数传递,您创建了一个新范围,因此 id 将在点击函数中保持它的值。我不一定会推荐这种方法(此外,您的代码中还有许多低效之处),但希望它是闭包和作用域的有趣演示。