2011-08-20 6 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가를 보유하고 글로벌 자바 스크립트 변수가 :

나는이 기능을 가지고있다. 4가 서버로부터의 응답이라면, 우리는 AJAX가 성공했다고 가정 할 수 있습니다 (나는 cgi/php가 존재한다면 반드시 실행하지는 않습니다). 그래서 나는 이것을 저장하고 AJAX 포스트를 호출 한 함수 내에서 readyState가 4라면 user_notify 함수를 호출한다.

알림을 트리거해야하는 첫 번째 작업은 예외입니다. 모든 연속 작업은 성공적으로 메시지를 생성합니다. 작동하지 않는 특정 동작이 아니라 첫 번째 동작입니다.

HTML :

<body> 

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

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

내가 무슨 말이냐?


UPDATE :

나는/아약스 jQuery를/아약스 호출 자바 스크립트 유산을 이동하는 과정에서입니다. 모든 것은 하나의면을 제외하고는 작동합니다. 대상 div는 .ajax jQuery 호출의 반환 데이터로 '새로 고침'되지 않습니다. 알림 (첫 번째 및 모든 연속 된 시간) 팝업, PHP는 실행 (페이지 새로 고침이 이것을 verfies),하지만 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

관련 문제