2009-02-07 70 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;