这个jquery循环有什么问题?

What's wrong with this jquery loop?

本文关键字:问题 什么 jquery 循环 这个      更新时间:2023-09-26

简要地总结一下我要做的事情:我为用户提供了查看缩略图图库的功能,每个图库都有相应的下载链接。当下载链接被点击时,我向用户展示一个确认div,假设用户点击了"同意",他们就可以继续下载完整尺寸的缩略图了。

为了做到这一点,我使用了一个重复器来生成缩略图。我正在为'ItemCreated'事件中的每个链接创建一个唯一的id,以及一个唯一的隐藏字段,该字段存储该缩略图的目标文件的相对路径。

当用户点击相应缩略图的"下载"链接时,我的代码应该选择"同意"链接,并使用被点击项目的隐藏字段值更新它的目标路径(我希望这有意义?)。这基本上意味着只要点击"下载"按钮,"同意"链接就会更新,引导你到正确的文件。

我遇到的问题是,我的"同意"链接从来没有得到更新-它似乎指向相同的文件为每个缩略图。

下面是渲染的缩略图列表的一个片段:

<div class="download-listing">
    <div class="download">
        <img src="/img/thumb0.jpg" alt="" />
        <div id="downloadLink0" class="dl">Download</div>
        <input type="hidden" id="hf0" value="/GetImage.ashx?path=/img/0.jpg" class="hf" />                    
    </div>
    <div class="download">
        <img src="/img/thumb1.jpg" alt="" />
        <div id="downloadLink1" class="dl">Download</div>
        <input type="hidden" id="hf1" value="/GetImage.ashx?path=/img/1.jpg" class="hf" />              
    </div>
    <div class="download">
        <img src="/img/thumb2.jpg" alt="" />
        <div id="downloadLink2" class="dl">Download</div>
        <input type="hidden" id="hf2" value="/GetImage.ashx?path=/img/2.jpg" class="hf" />                    
    </div>
</div>
<input id="count" type="hidden" value="3" />
<!-- Hidden popup -->
<div id="popup">
<p><a id="close" class="bClose action">I disagree</a><a id="file-link" class="action" href="#">I agree</a></p>
</div>

希望你能从上面的代码中看到,我试图从点击的下载中提取隐藏字段路径,然后用这个值更新#file-link 'href'。

我正在使用的Javascript/Jquery(这就是问题所在)如下:

<script type="text/javascript">
$(document).ready(function () {
  for (var i = 0; i < $("#count").val(); i++) { 
    var index = i;
    $("#downloadLink" + index).click(function () {
      $('#file-link').attr('href', $('#hf' + index).val());
      $('#popup').bPopup();
    });          
  }      
});
</script>

然而,这些都不起作用!似乎每个下载链接都指向同一个路径——列表中的最后一个。我不知道我哪里做错了。有什么明显的东西我没注意到吗?

感谢给予的任何帮助!

谢谢

这样做不是更容易吗:

$(function(){
    $(".download .dl").click(function(){
        $('#file-link').attr('href', $(this).next("input").val());
        $('#popup').bPopup();
    });
});

试试这样做…

 $("div[id*='downloadLink']").click(function () {
          $('#file-link').attr('href',$(this).siblings('img').attr('src'));
          $('#popup').bPopup();
});         

点击任何下载链接后,此代码将把相关的图像href路径传递给file-link元素。

这里是工作小提琴

我建议不要使用所有这些输入字段。它只是创建了一堆不必要的标记。为什么不将#count值简单地存储在一个JavaScript变量中呢?包含图像路径的输入也可以被删除。您可以将该信息存储在每个下载链接的属性中,命名为"data-path"之类的东西。例如:

<div id="downloadLink0" class="dl" data-path="/GetImage.ashx?path=/img/0.jpg">Download</div>

现在,回到你最初的问题,上面的标记可以很容易地解决这个问题:

$('.dl').click(function(){
    $('#file-link').attr('href', $(this).attr('data-path')); //could also do $(this).data('path') if using jQuery 1.6 or later
    $('#popup').bPopup();
});

其他人已经提出了不同的方法来实现你想要的,但是没有人解释为什么你当前的代码不能工作。

目前不起作用的原因是Javascript中作用域的工作方式。没有块作用域*,所以你的index变量只定义一次,每次循环运行时更新,直到最后它有最大(最后)值。然后,当您的事件处理程序运行时,index仍然具有此值,并且将使用最后一项。

所以,在JS中,获取新作用域最简单的方法是使用闭包。下面是一个改编自您的代码的示例:

$(document).ready(function () {
  for (var i = 0; i < $("#count").val(); i++) {
    var fn = (function(index) {
      return function () {
          $('#file-link').attr('href', $('#hf' + index).val());
          $('#popup').bPopup();
      };
    })(i);
    $("#downloadLink" + i).click(fn);
  }     
});

与其他答案相比,这不是解决实际问题的好方法。但是,它演示了创建作用域的概念:您正在调用一个接受一个参数index的函数,并将循环迭代器变量i传递给它。这意味着它内部的函数(它返回的函数)现在总是可以访问这个参数的值。内部函数存储在fn中,然后作为click处理程序传递。

如果这看起来很棘手,这里有一个更深入的了解Javascript中的函数和作用域。

*注意,新版本的Javascript/Ecmascript可能会添加块作用域变量。但是,它目前还没有以跨浏览器的方式实现。

您可能应该从事件源(# downloadlink)中计算它,通过从字符串的末尾获得n