2013-05-08 34 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()方法,該事件的默認動作將不會被觸發。

資源: