2009-02-07 44 views
2

我有我遇到了一個小問題一個jQuery功能:jQuery的Ajax請求不觸發後續事件

我第一次點擊鏈接,事件功能按預期工作。然而,隨後每次點擊鏈接時,該類都會正確切換,但是$ .get請求不會觸發。

任何想法爲什麼對服務器的請求只會第一次觸發?

編輯:這裏是我使用的標記:

<table> 
    <tr> 
    <th> 
     Header Text 
    </th> 
    ... and so on ... 
    </tr> 
    <% foreach (var item in Model as Item[]) 
    {%> 
    <tr> 
    <td> 
     <a href="#" 
     class='<%= "CompletedCheckBox " + (item.Complete ? "CheckedCompletedCheckBox" : "") %>' 
     id='<%= item.ID %>'></a> 
    </td> 
    ... and so on ... 
    </tr> 
    <% } %> 
</table> 

編輯2:這正常在Firefox,而不是IE7。我想在我的應用程序中支持IE,所以我需要想出爲什麼這不適用於IE。

我從谷歌加載jQuery(http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js),如果它有任何區別。

+0

我試過在Vista上的IE7(沒有筆記本電腦來啓動XP了,嘿嘿) - 工作正常,即使從谷歌加載jquery後。 – 2009-02-07 08:55:51

回答

4

IE可能會緩存$ .get()請求的結果。嘗試添加時間戳的GET請求的URL,因爲這樣的:

var myDate = new Date(); 
var timestamp = myDate.getTime(); 
$.get("/Tasks/Complete/" + this.id + '?t=' + timestamp); 
0

這是你執行的確切代碼嗎?那麼a.CompletedCheckBox也會有一個CheckedCompletedCheckBox類呢?

這似乎應該工作......但如果您在您的實際代碼中使用其他選擇器,我可以看到這可能會出錯。

你有沒有樣本標記?

3

只有一件事,你可以simplfy一個方面:

$(function() { 
    $("a.CompletedCheckBox").click(function() { 
    $(this).toggleClass("CheckedCompletedCheckBox"); 
    $.get("/Tasks/Complete/" + this.id, "", function() {}); 
    }); 
}); 

你獲得()調用看起來OK。請記住,雖然瀏覽器會限制同時發生的Ajax請求的數量(通常爲2或更少)。你確定你的電話回來了嗎?您是否考慮過使用.ajax()調用,並指定超時和/或錯誤處理程序,以便您可以看到發生了什麼?

編輯:試過下面的代碼,它的作品完美。你還有其他事情要做。

<html> 
<head> 
    <title>Test Get</title> 
    <style type="text/css"> 
    .CompletedCheckBox { background-color: yellow; display: block; } 
    .CheckedCompletedCheckBox { border: 2px solid black; } 
    </style> 
</head> 
<body> 
</body> 
<a id="abcd" class="CompletedCheckBox">Click me</a> 
<script src="http://www.google.com/jsapi"></script> 
<script> 
    google.load("jquery", "1.3.1"); 
    google.setOnLoadCallback(function() { 
     $(function() { 
      $("a.CompletedCheckBox").click(function() { 
       $(this).toggleClass("CheckedCompletedCheckBox"); 
       $.get("/test2.php?id=" + this.id, "", function() {}); 
       }); 
     }); 
    }); 
</script> 
</html> 

<?php 
error_log("User pressed link for id $id"); 
?> 

好了,ID沒有未來通過,但在錯誤日誌是每次點擊。

+0

我正在使用Fiddler(http調試代理)來查看對服務器發出的請求,以便我可以實時看到返回的內容,以及沒有返回的內容。 – 2009-02-07 08:14:34

+0

我按照你的建議改爲使用.ajax,併發生同樣的問題。 – 2009-02-07 08:29:40

1

我沒有問題在本地執行您的代碼。即使在服務器上設置了Thread.Sleep後,每個GET都會返回。

您的「/任務/完成/」網址是否會返回任何內容? HTML,純文本,json?

您使用的瀏覽器是?這個問題是否在所有瀏覽器中都存在? 我會嘗試使用FireFox與FireBug add-on在其控制檯中查看返回的內容。

讓我們知道您在找什麼!

+0

我在Windows XP SP3上使用IE7(在VM中運行)。我有同樣的想法,現在正在下載FireFox。 – 2009-02-07 08:31:01

0

是的,請發佈演示?

我嘗試使用您的代碼摘錄,但它工作正常。

我想這可能是你從DOM刪除()-a.CompletedCheckBox?

我在1.2.6中遇到了這個問題,在那裏你刪除(和添加)一些元素,事件再也不會觸發。

這是記錄在這裏:

http://docs.jquery.com/Manipulation/remove#expr

由於您使用的1.3.1,您可以嘗試使用活()。

這裏有一個演示:

http://waynekhan.com/sandbox/index.php/demo/get

在紅色框會一直工作的聯繫,因爲我們不調用remove()。藍色框中的鏈接只能使用一次,因爲我們調用remove()。這可能是你的問題。綠色框中的鏈接起作用,因爲我們調用remove(),但是我們使用的是live(),而不是click()。

0

我knowt他是個老問題,現在...但IE7是過分熱心緩存HTTPXML對象......所以你必須要麼:

  • 把一些隨機數據在您的網址的結尾(如rmurphy說)
  • 使用.post的$()方法來代替,如IE緩存犯規的POST
  • 設置緩存超時服務器響應,使IE不緩存:
 
    Cache-Control = "no-cache" 
    Pragma = "no-cache" 
    Expires = "0" 
0

這對我有效:Response.Expires = -1;