2009-01-21 30 views
1

我有以下JQuery代码,它执行类似Stackoverflow功能,其中用户点击注释链接并显示注释,或者在这种情况下回复成员的状态更新,一般情况下,除非成员发布新状态更新,它使用ASP.net MVC中的ajax异步回发来更新状态更新列表。JQuery异步回发问题,我该如何解决这个问题?

如果你点击列表中的新项目,它会把它们带到一个新的页面上,而不是去做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?

回答

4

退房jQuery的1.3

Events/live功能绑定的处理程序,为目前所有的事件(像click) - 和未来 - 匹配的元素。

因此,当你添加新的项目,jQuery应该添加点击事件给他们与此。

如果由于某种奇怪的原因你不想升级到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(); 
    }); 
}); 

所做的更改大多在2号线,其中

$("a[id ^='commentLink-']").click(function() { 

被替换为

$("a[id ^='commentLink-']").live('click', function(event) { 

我现在也收到参数event用于event.preventDefault();,这是您建议通过jQuery停止事件的方式。但是,如果return false;可以做到这一点,那么您可以保留这一点。

我还没有使用.live,但我认为应该这样做。尽管如此,确保在尝试此操作之前在服务器中获得jQuery 1.3。 :)

+0

是啊,这看起来不错,但问题是,DOM元素实际上并不存在......所以这是什么让人困惑的Jquery – dswatik 2009-01-21 20:39:18