2010-12-11 150 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事件。