2012-07-01 5 views
0

비슷한 문제가 있지만 아직 답변을 찾을 수없는 다른 사람들이있는 것 같습니다. 다음은 시나리오입니다.첫 번째 jQuery 아약스 호출 jQuery 스타일 변경 후 재설정

//show the div containing the textarea 
$('#postTypeContainer').css({ 'display': 'block' }); 

다음은 사용자가 댓글을 입력하고 제출 버튼을 클릭하고 사업부 숨겨진 일부입니다 :

사용자는 코멘트를 만들 수있는 텍스트 영역을 포함하는 숨겨진 사업부를 표시하는 버튼을 클릭 데이터가 서버로 전송됩니다.

$("#loading").ajaxStart(function() { 
     $(this).show(); //shows a spinner 
    }).ajaxComplete(function() { 
     $(this).hide(); //hides the spinner 

     //hide the div that was opened earlier 
     $('#postTypeContainer').fadeOut('fast'); 
    }); 

    //send data 
    $.ajax({ 
     type: "POST", 
     url: rootUri + "main.aspx/StartNewThread", 
     data: jsonText, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (markUp) { 
      //stuff 
     } 
    }); 

이 모든 것이 제대로 작동합니다.

이제 사용자들은 다른 사용자에 태그를 원하기 때문에이 경우, @abc를 사용자 유형의 일부 데이터를

//show the div containing the textarea 
$('#postTypeContainer').css({ 'display': 'block' }); 

다음을 잘 작동 클릭을 통해 다시 DIV를 열고 다음은 사용 발생 '의 keyup'에 jQuery를 :

//ajax call to find users matching the @abc 
$.ajax({ 
     type: "POST", 
     url: rootUri + "main.aspx/GetMatch", 
     data: jsonText, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (data) { 

      //stuff 

     } 
    }); 

즉시이 아약스 호출이 DOM 그것은 AJAX 호출하기 전에 무엇으로 재설정되는 것처럼 닫혀 연 사업부를 반환한다. 따라서 텍스트 영역과 상호 작용하려는 중간에 div는 사용자를 매우 혼란스럽게합니다. 이 문제를 해결할 수있는 유일한 방법은 분명히 아약스를 사용하여 피하고 싶은 페이지를 새로 고치는 것입니다. 누군가를 호소하는 것은 잘못된 것에 대한 생각을 가지고 있습니다. 내가 성공적으로 시도한 한가지는 tagging에 대한 ajax 호출을하는 keyup 함수를 입력 할 때 div의 상태를 확인한 다음 Ajax 호출이 끝날 때 그것을 설정하려고 시도하는 것이다. 일. 어떤 도움을 주셔서 감사합니다.

+0

나는 확실히 당신의 질문을 이해하지만, 비동기 사용 해달라고 : 아약스가 –

+0

를 완료 한 후 정확히 문제가 무엇인지를 보여주기 위해 전체 코드와 jsfiddle 링크를 게시 할 경우 도움이 될 사업부가 페이드 아웃 있도록 아약스의 잘못된 속성을 입니다. 그러나 단지 아이디어 :'.ajaxComplete'는 ajax 호출이 완료 될 때마다 발생하고, 콜백하면'# postTypeContainer' div를 페이드 - 아웃합니다. 그래서 두 번째 아약스 호출이 완료되면 여전히 숨겨집니다. – nbrooks

+0

@ NicolásTorres 그래서 ajax 호출을위한 콜백 함수가 있습니다. 10 번 중 9 번 설정'async : false'는 나쁜 생각입니다. – nbrooks

답변

1

.ajaxComplete()은 글로벌 ajax 이벤트로, jQuery ajax 이벤트가 완료 될 때마다 발생합니다. 따라서 두 번째 아약스 호출이 완료되면 postTypeContainer div가 숨겨집니다. 그 아약스 호출에 대한 로컬 완료 이벤트에 숨기고 싶다고 생각합니다.

$("#loading").ajaxStart(function() { 
    $(this).show(); //shows a spinner 
}).ajaxComplete(function() { 
    $(this).hide(); //hides the spinner 
}); 

//send data 
$.ajax({ 
    type: "POST", 
    url: rootUri + "main.aspx/StartNewThread", 
    data: jsonText, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (markUp) { 
     //stuff 
    }, 
    complete: function() { // DO IT HERE 

     //hide the div that was opened earlier 
     $('#postTypeContainer').fadeOut('fast'); 

    } 
}); 
+0

아 하! 예, 그렇습니다. 나는 다음에 jQuery 문서를 더 가까이 읽을 필요가 있다고 생각한다. 또한 나는 이것이 글로벌 이벤트라는 다른 증상들을보고 있습니다. 아약스 호출이있을 때마다 동일한 코드가 있으므로 .ajaxComplete 코드는 여러 위치에 있어야합니다. 내가 제대로 이해한다면 모든 아약스 전화에 한 번만 필요하다. 도와 주셔서 감사합니다. 매일 새로운 무언가를 배웁니다 –

+0

@steven 네 말이 맞아. 또 다른 점은'.ajaxComplete'가 첫 번째 아약스 호출이 완료 되 자마자 트리거되지만, 마지막 아약스 호출이 끝날 때까지로드 스피너를 표시하려면 대신 .ajaxStop을 사용하는 것이 좋습니다. 하나. http://api.jquery.com/ajaxStop/ – nbrooks

관련 문제