参见英文答案 >
JavaScript closure inside loops – simple practical example39个
我正在制作一个会生成很多按钮的用户脚本,我似乎无法给它们一个独特的功能.
我正在制作一个会生成很多按钮的用户脚本,我似乎无法给它们一个独特的功能.
我已经试过了
downArrow.onclick = function (){downVote(id,username)};<br>
和
downArrow.onclick = "downVote(\"" + id + "\",\"" + username + "\")";
但它们不起作用.然后我在某处读到只有以下工作:
downArrow.addEventListener('click',downVote(id,username),false);
这导致所有按钮仅下调迭代的最后ID和用户名.
我希望他们都有独特的onclick功能.
整个循环:
var targetPosts = document.getElementsByClassName("thing message"); for (var i=0;i<targetPosts.length;i++) { try { id = targetPosts[i].getAttribute("data-fullname"); username = targetPosts[i].childNodes[4].childNodes[1].childNodes[0].childNodes[1].childNodes[1].childNodes[0].innerHTML; var upArrow=document.createElement("DIV"); upArrow.className = "arrowUp"; upArrow.id = id + "up"; upArrow.addEventListener('click',function(){ upVote(id,username)},false); var downArrow=document.createElement("DIV"); downArrow.className = "arrowDown"; downArrow.id = id + "down"; downArrow.addEventListener('click',function(){ downVote(id,false targetPosts[i].childNodes[3].appendChild(upArrow); targetPosts[i].childNodes[3].appendChild(downArrow); } catch(err){} }
解决方法
bind就是针对这样的情况而发明的:
upArrow.addEventListener('click',upVote.bind(upArrow,id,false);
应该做的工作.