2013-05-08 119 views
2

每次执行jquery $ .post()时,我都会收到“取消”状态。这似乎是一个异步的问题?我访问本地项目与http://127.0.0.1:8933/myproject/default/index.html

的index.html:

<script> 
    $(document).ready(function() { 
     $('#mybutton').click(function() { 
       var post_url = get_url(); // resolves to "/myproject/default/process_func" 
       var data = ...; 
       do_action(post_url, data); 
     }); 
    }); 
</script> 

<a href="" id="mybutton"> Click me! </a> 

util.js中:

function doPost(url, data) { 
    $.post(url, data).then(doSuccess, doFail): 

    function doSuccess(data) { 
      alert('Successful!'); 
    } 
    function doFail(data) { 
      alert('Failed!'); 
    } 
} 

function do_action(url, data) { 
    var jsondata = JSON.stringify(data); 
    // some other stuffs... 

    doPost(url, jsondata); 
} 

的想法是发布一些数据返回给服务器使用JSON数据处理。用户将点击锚点按钮,do_action()将会触发,然后它将被张贴在doPost()

这似乎工作,因为我看到json数据传递给我的处理函数在服务器上。但是,我会看到警告消息“失败!”即使数据已经处理,每次都会弹出。在铬的调试面板中,我在“网络”选项卡下看到该帖子的状态为“(已取消)”,整行将以红色突出显示。所述类型是“待定”。

我认为这是一个异步问题,但我不确定如何解决它。

回答

7

使用此,取消<a>的默认navigatin行为:

$('#mybutton').click(function(e) { // <-- Add `e` here 
    e.preventDefault(); // <-- Add this line 
    var post_url = get_url(); 
    var data = ...; 
    do_action(post_url, data); 
}); 

我相信AJAX请求是由浏览器中止,因为点击该链接时,虽然要求没有得到被红牌罚下,该链接尝试导航到新页面,以便浏览器必须中止打开的AJAX请求。

+1

谢谢。这工作。我对javascript不熟悉,但我认为'doPost()'中的'.then()'会等到请求完成。 – Bak 2013-05-08 15:59:55

+1

它的确如此,但原始动作(点击链接)没有。 – JJJ 2013-05-08 16:00:38

+0

@Bak Juhana说的是什么。这些行为是完全不同的,分开的。 – Ian 2013-05-08 16:02:56

0

你可以试试这个...

$('#mybutton').live("click", function(e) { 
    e.preventDefault(); 
    var post_url = get_url(); 
    var data = ...; 
    do_action(post_url, data); 
}); 

根据jQuery的版本你正在使用,您可以使用jQuery.live()jQuery.on()方法

当如果调用此方法被称为e.preventDefault()方法,该事件的默认动作将不会被触发。

资源: