2015-07-02 47 views
1

我試圖給類vote-upvote-down的所有元素添加一個函數Fvoteclick addEventListener被調用時未被點擊

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-upvote-down的項目,則不會調用該函數。我做錯了什麼?

回答

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); 
0

你對addEventListener的工作方式產生了錯誤的想法。

基本上它註冊一個事件處理程序,它是事件發生時要執行的函數的「地址」。你在做什麼是調用函數並在循環中執行它。

這裏就是它的正常使用:

function handle() { 
    alert('An event!'); 
} 

myElement.addEventHandler('click', handle); 

注意,在這個片段,handle而不括號因而「通過在地址」,而不是調用調用傳遞。