2011-06-29 31 views
3

所以我想要做的就像使用jquery的youtube上的大拇指向上/向下投票系統,暗示一旦用戶投了票,兩個div(圖片,無所謂)都將無法用於該特定帖子。JQuery在同一個類的.click()中使用toggleClass()似乎並不奏效

到目前爲止,我使用了一個.click(),其中toggleClass()將改變它自己的類,我可以看到,如果我檢查DOM,類會改變,但爲什麼.click )仍在爲新班級工作?

//TO BE CALLED WHEN USER CLICKS VOTE FORGIVENESS 
$('.voteUp').click(function() { 
    var id = $(this).closest("article").attr("id"); 

    //Make it impossible to vote again 
    $(this).toggleClass('voteUp votedUp'); 
    $(this).parent().find('.voteDown').toggleClass('voteDown votedDown'); 

}); 

而我的HTML(PHP)

 <article class='yellowSheet' id='57'> 
      <div class="title"> 
       <h1>StuffUp says :</h1> 
       <p class="story">What happened ?</p> 
      </div> 

      <div class="entryContent"> 
       <p>guy, 2011-06-28 17:11:48</p> 
      </div> 

      <div class="voting"> 
       <img class="voteUp" src="images/thumbsUp.png" /></div> 
       <img class="voteDown" src="images/thumbsDown.png" /></div> 
      <div class="storyBottom"></div> 

     </article> 

我不明白的是爲什麼切換下課後,我仍然可以在新的講座「votedDown」因爲那類沒有點擊有一個.click方法?

謝謝

回答

3

類名是隻有你用匹配的元素指:click處理程序註冊元素本身將被命名是否仍然暴露了類與否。

您可以使用live()註冊一個事件處理程序,將只能被稱爲如果元素的初始選擇仍然匹配:

$(".voteUp").live("click", function() { 
    // Your event handler. 
}); 
+0

工作完美,非常感謝(並感謝我不知道的信息)! – Julz

0

你已經束縛一個click事件的對象。您不能刪除該課程,因爲期望該點擊事件與它一起出現。你想要的是這樣的:

$(this).unbind('click'); 
0

我實際上會刪除voteUp並添加votedUp。

$(this).removeClass('voteUp').addClass('votedUp'); 

如果你想切換一個類,可能只是切換'votedUp',而不是'voteUp votedUp'。如果您有分配給「voteUp」的點擊事件,只需在切換中添加「votedUp」即可取消該點擊綁定。

0

.click將一個事件處理程序綁定到在運行時匹配選擇器的所有實體 - 因此,儘管刪除了該類,實體仍然有一個單擊事件綁定。

你可以做兩件事之一。無論是使用:

$('.voteUp').live('click', function() { 
    // etc 
}); 

「活」的行爲在你期待「點擊」的方式,當你點擊的東西,它的選擇只匹配激活 - 它分析了每次點擊的時間。

或者你可以在事件處理程序手動解除綁定的事件,如:

$('.voteUp').bind('click.voteUp', function(e) { 
    $(this).unbind('click.voteUp'); 
    // and the rest of what you want to do; 
}); 

第二個例子也使用命名空間中的事件處理程序,一個實用的功能jQuery中,這意味着只有你指定的事件處理程序將被刪除。

0

它實際上綁定到元素而不是類。類名僅用於初始查找。

在這種情況下,你要麼要使用.unbind()方法來解除綁定的Click事件中它被點擊$(this).unbind('click');

OR

使用.one()method這將只允許被點擊一次的元素之後。

$('.voteUp').one('click', function() {... 
0

不知道它的問題在這一點上,但你有一個額外的「</div>」,我重新格式化你有什麼使問題更加清晰:

<div class="voting"> 
    <img class="voteUp" src="images/thumbsUp.png" /> 
</div> <!-- Extra close div --> 
    <img class="voteDown" src="images/thumbsDown.png" /> 
</div> 

所以我不認爲find()在這個語句將會匹配任何東西:

$(this).parent().find('.voteDown').toggleClass('voteDown votedDown');