我有以下JQuery代码,它执行类似Stackoverflow的功能,用户点击评论链接并显示评论或在这种情况下回复成员的状态更新,通常它很有效,除非成员发布新的状态更新,使用ASP.net MVC中的ajax异步回发更新状态更新列表。
如果您单击列表中的新项目,它会将它们带到一个新页面,而不是执行JQuery想要执行的操作,会发生什么。
<script type="text/javascript">
$(function() {
$("a[id ^='commentLink-']").click(function() {
match = this.id.match(/commentLink-(\d+)/);
container = $("div#commentContainer-" + match[1])
container.toggle();
if (container.is(":visible")) {
container.load($(this).attr("href"));
} else {
container.html("Loading...");
}
return false; //Prevent default action
});
});
</script>
注意:我认为导致它的原因是列表中的新项目实际上不在页面上,因为列表是通过ajax更新的,所以新的html不是直到页面刷新。
更新好的,我如何使用Paolo Bergantino在触发ASP.net MVC ActionResult时所说的实时/事件功能?
答案 0 :(得分:4)
查看jQuery 1.3中的新Events/live
功能
将处理程序绑定到所有当前和未来匹配元素的事件(如单击)。
因此,当您添加新项目时,jQuery应该使用此功能将click事件添加到它们。
如果由于某些奇怪的原因你不想升级到jQuery 1.3,你可以查看livequery
插件。
编辑以响应更新:
使用.live
的实际代码是这样的:
$(function() {
$("a[id ^='commentLink-']").live('click', function(event) {
match = this.id.match(/commentLink-(\d+)/);
container = $("div#commentContainer-" + match[1])
container.toggle();
if (container.is(":visible")) {
container.load($(this).attr("href"));
} else {
container.html("Loading...");
}
event.preventDefault();
});
});
所做的更改主要在第二行,其中
$("a[id ^='commentLink-']").click(function() {
被
取代$("a[id ^='commentLink-']").live('click', function(event) {
我现在也收到用于event
的参数event.preventDefault();
,这是建议您通过jQuery停止事件的方式。但是,如果return false;
能够解决问题,那么你可以保留它。
我还没有使用.live
,但我认为应该这样做。但是,在尝试此操作之前,请确保在服务器中获得jQuery 1.3。 :)