2009-01-21 62 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