2010-12-11 92 views
1

我不明白爲什麼這個腳本不會在第一次點擊事件後觸發。 show()函數完美工作,但hide()不起作用。jquery show()/隱藏()第一次點擊後沒有觸發

<script type="text/javascript"> 
$(document).ready(function() { 
    $(".event.hidden").click(function() { 
     var div_id = this.id.replace(/But/, 'Div'); 
     $("#" + div_id).show('slow', 'linear'); 
     $(this).attr("src", "images/but_hide_event.png"); 
     $(this).removeClass('hidden').addClass('shown'); 
    }); 
    $(".event.shown").click(function() { 
     var div_id = this.id.replace(/But/, 'Div'); 
     $("#" + div_id).hide('slow'); 
     $(this).attr("src", "images/but_event_info.png"); 
     $(this).removeClass('shown').addClass('hidden'); 
    }); 
}); 
</script> 

頁中的問題是在http://randykrohn.com/schedules.php?Param=all

+0

你」重新選擇東西效率低下。你不應該像這樣兩次重複相同的代碼,只是改變的部分。如果你考慮如何重新設計它,答案應該很明顯。 – Incognito 2010-12-11 04:19:11

回答

2

您需要使用.live()方法。在文檔準備好後,您將綁定到.event.hidden,但它不匹配任何元素。一旦你運行顯示功能,你需要重新運行該選擇器。更簡單地說,你可以使用.live():

說明:將處理程序的 事件的 當前選擇現在匹配這,所有的元素,並在未來 。

將其更改爲

$(".event.hidden").live('click', function() { ... 

,如果你希望再能再次使用的節目,你會想要做這一個了......

$(".event.shown").live('click', function() { ... 
+0

非常感謝。像魅力一樣工作。不知道我理解你關於附加處理程序的描述。 – dragboatrandy 2010-12-11 04:21:14

+0

沒問題。說明只是從jQuery API複製/粘貼。您可以點擊上面的.live()鏈接來閱讀它。這是一個非常有用的方法。 – macca1 2010-12-11 04:23:09

1

的問題是,您要附加行爲的click事件元素與eventshown當DOM第一就緒。也就是一次,在頁面加載。但它看起來像當時沒有.event.shown的元素,因爲您只是在之後交換了shown,即首先在.event.hidden元素上的click事件。

你應該重新考慮你的方法 - 或者,如果你不能,你就需要使用.live().delegate()觀看更改和動態附加新的行爲對這些click事件。