5

我有一个产品清单。每个产品都有一个标题和一个评论链接。目前,标题直接链接到单个产品页面,评论链接在其他地方。

我想在每个循环中使用 jquery 循环遍历每个 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);
});

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

有人可以帮我吗?

4

5 回答 5

11

我将this作为参数传递以定义each()循环的每次迭代的上下文。在每次迭代中,this指代有问题的元素。

$("li").each(function(){
   var link = $("a:eq(0)", this).attr('href');
   $("a:eq(1)", this).attr("href", link);
});
于 2010-05-18T21:19:36.510 回答
3
$("li").each(function(){
   var link = $(this).find("a:eq(0)").attr('href');
   $(this).find("a:eq(1)").attr("href", link);
});
于 2010-05-18T21:19:34.043 回答
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)')这里),第二个是属性的当前值。在您的特定情况下,您都不关心任何一个,但通常您会希望根据其当前值转换属性,因此它可以很方便。

Which one to use is entirely a matter of taste, jQuery sets allow you to do a lotof things without having to directly use .each.

于 2010-05-19T01:14:12.970 回答
0

这是因为您没有使用 theli作为您a选择的上下文:

试试这个:

$("li").each(function(){
    var a = $('a',this);
    var link = a.filter(":eq(0)").attr('href');
    a.filter(":eq(1)").attr("href", link);
});
于 2010-05-18T21:21:07.073 回答
0

尝试:

 $("li").each(function(){
    var link = $("a:eq(0)", this).attr('href');
 $("a:eq(1)", this).attr("href", link);
  });
于 2010-05-18T21:22:11.870 回答