JQuery Async回发问题,我该如何解决这个问题?

时间:2009-01-21 19:28:30

标签: javascript jquery asp.net-mvc

我有以下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时所说的实时/事件功能?

1 个答案:

答案 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。 :)