2010-05-18 94 views
5

我有一个产品列表。每个产品都有一个标题和一个评论链接。目前,这些标题直接链接到各个产品页面,并且评论链接转到其他地方。jQuery每个循环 - 使用变量

我想使用jquery each循环遍历每个li,从标题(第一个链接)获取href,并将其应用于审阅链接(第二个链接),以便它们都指向产品页面。

简化的代码将如下所示:

<ul> 
    <li><a href="product1.html">Product 1</a><a href="review1.html">Review 1</a></li> 
    <li><a href="product2.html">Product 2</a><a href="review2.html">Review 2</a></li> 
    <li><a href="product3.html">Product 3</a><a href="review3.html">Review 3</a></li> 
</ul> 

我认为这将是类似以下内容:

$("li").each(function(){ 
    var link = $("a:eq(0)").attr('href'); 
    $("a:eq(1)").attr("href", link); 
}); 

但它总是使用相同的变量“链接”。

有人可以帮我吗?

回答

11

我传递this作为参数以限定用于each()循环的每次迭代的上下文。在每次迭代中,this引用了所讨论的元素。

$("li").each(function(){ 
    var link = $("a:eq(0)", this).attr('href'); 
    $("a:eq(1)", this).attr("href", link); 
}); 
+1

使用上下文参数+1。 – Gabriel 2010-05-18 21:20:48

+2

也许你应该解释一下,你传递给'$()'的第二个参数(这里是'this')定义了选择器的上下文。 – 2010-05-18 21:21:35

3
$("li").each(function(){ 
    var link = $(this).find("a:eq(0)").attr('href'); 
    $(this).find("a:eq(1)").attr("href", link); 
}); 
0

它,因为你不使用li为您a选择的范围:

试试这个:

$("li").each(function(){ 
    var a = $('a',this); 
    var link = a.filter(":eq(0)").attr('href'); 
    a.filter(":eq(1)").attr("href", link); 
}); 
0

尝试:

$("li").each(function(){ 
    var link = $("a:eq(0)", this).attr('href'); 
$("a:eq(1)", this).attr("href", link); 
    }); 
1

另一种选择,避免必须完全使用.each才是通过功能作为.attr的第二个参数。

此工作方式如下:

$('li').find('a:nth-child(2)').attr('href', function(index, href) { 
    return $(this).prev('a').attr('href'); // use previous sibling's href 
}); 

从本质上讲,这将需要每个选择器元件相匹配,使其通过的功能,然后将href属性设置为函数的结果。该函数将传递参数:第一个是匹配集中的索引(此处为$('li a:nth-child(2)')),第二个为属性的当前值。在你的特定情况下,你并不在乎,但通常你会想根据它的当前值转换一个属性,所以它可以很方便。

哪一个使用完全是味道问题,jQuery套件允许你做很多事情而不必直接使用.each

+0

很酷,为此欢呼 - 很高兴看到对同一问题采取不同的措施。这就是为什么我喜欢jquery :-) – 2010-05-19 14:54:54