我正在尝试为Fvote
和vote-up
的所有元素添加一个函数vote-down
。
var voteup = document.getElementsByClassName("vote-up");
var votedown = document.getElementsByClassName("vote-down");
function Fvote(upordown,postid) {
var x=this;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {console.log(xmlhttp.responseText);
if(xmlhttp.responseText=="error")
;
else{
/*some JS actions*/;}
}
xmlhttp.open("GET", "ajax/vote.php?q=" + postid + "q2="+upordown, true);
xmlhttp.send();
}
for(var i=0;i<voteup.length;i++)
voteup[i].addEventListener('click', Fvote("up",voteup[i].getAttribute("data-vote")), false);
for(var i=0;i<votedown.length;i++)
votedown[i].addEventListener('click', Fvote("down",votedown[i].getAttribute("data-vote")), false);
但是当我加载页面时,它会运行函数Fvote
多次作为元素数量的计数,而不会点击任何项目。如果我点击类vote-up
或vote-down
的项目,则不会调用该函数。我做错了什么?
答案 0 :(得分:2)
您可以从函数中获取参数:
var voteup = document.getElementsByClassName("vote-up");
var votedown = document.getElementsByClassName("vote-down");
function Fvote(e) {
var x = e.target,
upordown = x.className.indexOf('vote-up') > -1 ? 'up' : 'down',
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
postid = x.getAttribute('data-vote');
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
console.log(xmlhttp.responseText);
if(xmlhttp.responseText=="error") {
/*some JS actions*/
} else {
/*some JS actions*/
}
}
xmlhttp.open("GET", "ajax/vote.php?q=" + postid + "q2="+upordown, true);
xmlhttp.send();
}
for(var i=0;i<voteup.length;i++)
voteup[i].addEventListener('click', Fvote, false);
for(var i=0;i<votedown.length;i++)
votedown[i].addEventListener('click', Fvote, false);
答案 1 :(得分:0)
你对addEventListener
的工作方式有错误的认识。
基本上它注册了一个事件处理程序,它是事件发生时要执行的函数的“地址”。你正在做的是调用函数并在循环中执行它。
这是通常使用的方式:
function handle() {
alert('An event!');
}
myElement.addEventHandler('click', handle);
请注意,在此片段中,handle
不带括号,因此“传入地址”,而不是调用调用。