jQuery ajax POST导致立即GET到同一个URL

时间:2010-11-22 07:43:18

标签: jquery ajax firefox

我正在使用带有Django后端的jQuery(1.4.2)并在Debian上使用Firefox(3.5.15)进行开发。我正在使用$ .ajax()将一些数据发布到我的服务器,这会将数据反映回浏览器。 Firefox正在发送POST,然后立即在同一个URL上执行GET。 GET来自哪里?我不希望它发生。

我用于POST的代码如下所示:

$.ajax({
    type: 'POST',
    url: '/edit_value/',
    data: JSON.stringify(data_to_post),
    success: function(updated) {
        alert('success');
    },
    error: function(request, description, exception) {
        alert('error');
    },
    async: false,
    dataType: 'json'
});

我看到成功警报消息,而不是错误警告消息。查看我的服务器日志,我正在回显data_to_post。

我已经看过tcpdump并看到了POST请求。它看起来完全像我期望的那样:

POST /edit_value/ HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.15) Gecko/20101028 Iceweasel/3.5.15 (like Firefox/3.5.15)
Accept: application/json, text/javascript, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost:8000/
Content-Length: 30
Cookie: csrftoken=9e3edd79a51956f088f4a505ca1b4282; sessionid=80d72430f4682632ccfb8dc8047b7d17
Pragma: no-cache
Cache-Control: no-cache

[{"id":"161","value":"988.0"}]

响应看起来也正常:

HTTP/1.0 200 OK
Date: Mon, 22 Nov 2010 07:28:44 GMT
Server: WSGIServer/0.1 Python/2.6.6
Vary: Cookie
Content-Type: text/json

[{"id":"161","value":"988.0"}]

如果async设置为true,有时浏览器会提前挂断TCP连接,有时请求/响应完成。通过将async设置为false,请求/响应始终完成(对于上面的示例,它已设置为false)。 Firefox然后立即发送GET。

GET /edit_value/ HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.15) Gecko/20101028 Iceweasel/3.5.15 (like Firefox/3.5.15)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:8000/
Cookie: csrftoken=9e3edd79a51956f088f4a505ca1b4282; sessionid=80d72430f4682632ccfb8dc8047b7d17

这个GET来自哪里?如何在页面重新加载之前将其捕获到Firebug中?我可以提供哪些其他信息?

谢谢, 克雷格

3 个答案:

答案 0 :(得分:6)

当我在<form>标记内对值进行Ajax请求时,我遇到了类似的问题。

我的问题出现了,因为我在该表单上有一个操作(例如<form action="mypage.aspx"...) - 即使Ajax POST成功 - 导致表单被提交。

如果这与您的情况相同,请尝试删除表单标记中的操作声明或在Ajax请求中包含return false;语句。

答案 1 :(得分:0)

您需要在Phil告诉您的Ajax请求中包含return false;语句。

我只是想建议一个可以帮助你进行Ajax调试的好应用程序:

Selenium web site

答案 2 :(得分:0)

使用e.PreventDefault完全不需要返回false。 在这种情况下,超链接的默认操作是重定向,从而导致get。使用e.preventDefault()语句就可以了。(注意:e是作为参数传递给函数的事件对象)