2011-08-20 33 views
1

我使用廣泛的AJAX和我的基於PHP的通知系統是不夠的。jQuery通知,首先不顯示

我有這樣的功能:

<script> 
function user_notify($string, $class){ 
if($class == null){ 
    $class = 'error'; 
} 


$('<div class="' + $class + '"><div class="notification-text">' + $string + '</div></div>').hide().appendTo('#system-notifications').fadeIn('slow'); 
} 

function DeleteTask(SpanName, TaskId){ 
if (confirm("Are you sure you want to delete this task?")) { 
    var curDateTime = new Date(); //For IE 
    var status = document.getElementById('status'); 
    var poststr = "uniqueID=" + curDateTime.getTime() ; 
    var SpanName = SpanName; 
    if(SpanName == 'project_todos_complete'){ 
     var showCompleted = 1; 
    } else { 
     var showCompleted = 0; 
    } 
    //alert (SpanName); 
    makePOSTRequest('http://*****webdesigns.com/project_manager/include/ajax/global.php?action=delete_task&showCompleted=' + showCompleted + '&id=' + TaskId, poststr, SpanName); 
} 

if(ajax_status == 4){ 
    user_notify('Task deleted.', 'success'); 
    ajax_status = null; 
} 
} 
</script> 

我有持有readyState的一個全球性的javascript變量。如果4是來自服務器的響應,我們可以假設AJAX是成功的(我知道,如果有的話,cgi/php是不會執行的)。所以我將它存儲起來,並且在調用AJAX帖子的函數中,如果readyState是4,我就調用user_notify函數。

它工作得很漂亮,但有一個例外:應該觸發通知的第一個動作不會。所有連續操作都成功生成一條消息。這不是一個不起作用的具體行動,只是第一個。

的HTML:

<body> 

<div id="system-notifications"></div> 

<div class="wrapper">...</div> 

缺少什麼我在這裏?


UPDATE:

我在移動遺留的JavaScript/AJAX調用的jQuery /阿賈克斯的過程。除了一個方面外,一切都有效:目標div不會使用來自.ajax jQuery調用的返回數據進行「刷新」。彈出通知(第一次和所有連續的時間),php執行(刷新頁面驗證了這一點),但div不會更新PHP腳本生成的html。

$('form#addToDoForm').submit(function(){ 

    var project_id = $('#addToDoForm input[name=project_id]'); 
    var assigned_id = $('#addToDoForm input[name=assigned_user_id]'); 
    var description = $('#addToDoForm textarea[name=description]'); 
    var responsible_id = $('#addToDoForm input[name=responsible_user_id :selected]'); 
    alert(responsible_id.val()); 
    return false; 
    var due = $('#addToDoForm input[name=due]'); 

    var result_div = 'project_todos_' + project_id; 
    var query_string = 'action=add_to_do&id=' + project_id; 
    var ajax_url = 'http://avwebdesigns.com/basecamp/include/ajax/global.php?' + query_string; 
    var successMessage = '<b>' + description.val() + '</b> added.'; 

    var data = 
     'project_id=' + project_id.val() + 
     '&assigned_user_id=' + assigned_id.val() + 
     '&responsible_user_id=' + responsible_id.val() + 
     '&description=' + encodeURIComponent(description.val()) + 
     '&due=' + encodeURIComponent(due.val()); // encodeURIComponent() 


    $.ajax({ 
     type: 'POST', 
     url: ajax_url, 
     data: data, 
     cache: false, 
     success: function(data){ 
      $('#'+result_div).html(data); // $('#'+result_div).html(data.returnValue); 

      user_notify(successMessage, 'success'); 
     }, 
     error:function(data){ 
      $('#'+result_div).html(data); 

      user_notify(failureMessage, 'error'); 
     } 
    }); 

    return false; 
}); 

任何想法?

回答

0

您可能錯過了AJAX調用的非阻塞特性。我真的不知道makePOSTRequest是做什麼的,但從你的設計來看,我認爲你期望它可能是同步的,但它可能不是。由於AJAX調用的異步性質,您需要將回調函數傳遞給在AJAX請求完成時調用的調用。

您的情況可能發生的是makePOSTRequest立即返回,並且因爲第一個請求尚未完成,ajax_status將不會是4。然後,在發送第二個請求時,您的第一個請求已經完成,您的全局變量將被設置爲4,所以這次它可以工作,這也是它在所有後續嘗試中都能正常工作的原因。

這表明設計中存在另一個缺陷:捕獲全局變量中AJAX請求的狀態實際上是一個非常糟糕的主意。這些請求可能會以併發方式發送,因此您可能會有多個請求共享同一個變量 - 這就要求提供「競爭條件」。查看Ajax section of the jQuery documentation中的示例,瞭解如何在回調函數的幫助下正確處理此問題。

+0

我認爲這是類似的東西,其中全局變量是從以前的調用剩餘的。但是你會看到我在檢查並確認之後做了無效處理。 callbakc函數聽起來就像解決方案。 – AVProgrammer