这个jquery循环有什么问题?
What's wrong with this jquery loop?
简要地总结一下我要做的事情:我为用户提供了查看缩略图图库的功能,每个图库都有相应的下载链接。当下载链接被点击时,我向用户展示一个确认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。
- 我不知道我的编码有什么问题.(JavaScript)
- 什么'这个javascript代码getElementById有问题
- 我的流星路线出了什么问题
- 此nodeValue替换代码有什么问题
- 这个正则表达式的日期/时间有什么问题
- 我的CSS/Javascript下拉菜单测试代码出了什么问题
- 这个代码出了什么问题?(Jquery)
- 下面的Reg表达式出了什么问题
- 鼠标事件,我的代码出了什么问题
- 这个javascript语法有什么问题
- 动态创建foreignGroup并将其添加到svg中有什么问题
- 此代码中动态生成选择框有什么问题
- 我的javascript有什么问题?.className
- 这个 ajax.js 代码有什么问题
- 框架的可用性问题是什么
- JS代码有什么问题,让我知道代码是否可以改进
- 我的 Browserify JavaScript 代码有什么问题
- 图像上传功能将++(+1)副本添加到下一次上传.出了什么问题或如何重置“选定图像”
- 使用 Javascript 动态删除行.我的代码有什么问题
- Ajax jQuery图片上传-新手问题什么是最好的方式来处理这个