我目前正在开发一个Greasemonkey脚本,它允许将用户添加到一个忽略列表中,该列表将阻止他们的注释被渲染。
我通过“GM_setValue”存储他们的用户ID。一切都运行得很好,但我有问题来渲染我的脚本中的“管理你的禁令列表”部分以赦免用户。
我遇到麻烦的代码块:
var banList = GM_listValues(); // Array of Usernames
var manageBans = $("#content_content"); //The <div> I want to render the Banlist in.
manageBans.append("<h4>Manage ignorelist</h4>");
for (var i=0; i < banList.length; i++) {
var currentUser = banList[i];
manageBans.append($('<b>'+currentUser+'</b><a href ="javascript:void(null)"><img src="/redaktion/style/delete.png" width="16" height="16" alt="unblock_user"></a></br>').click(function(){ unbanUser(currentUser)}));
}
var unbanUser = function(name) {
GM_deleteValue(name);
};
所以基本上这个工作正常,所有被禁止的用户都在列表中呈现,我可以点击解除绑定。但是,一旦我点击任何用户调用“unbanUser”,列表中的最后一个用户就会被取消,而不是我点击的用户。
我猜变量“currentUser”始终是列表中的姓氏,我希望它在for循环完成后成为每个用户的修复链接。 这是一项相当简单的任务,但我找不到合适的解决方案。
你有暗示吗? 迎接答案 0 :(得分:1)
在循环结束时,currentUser
在每次迭代时都会被覆盖。在click
函数中,您指的是currentUser
,它等于currentUser
的最后定义。
要修复它,请使用闭包:
function doSomething(currentUser) {
manageBans.append($('<b>'+currentUser+'</b><a href="javascript:void(null)"><img src="/redaktion/style/delete.png" width="16" height="16" alt="unblock_user"></a></br>').click(function(){
unbanUser(currentUser)
}));
}
for (var i=0; i < banList.length; i++) {
doSomething(banList[i]);
}