2012-12-01 1 views
1

300 밀리 초가 걸리는 모든 Ajax 호출에서 body 요소에 "loading"클래스를 추가하려고합니다. 내가 오랫동안 좋은 초원 초에서 아약스 통화를 할 경우 지금이 작품ClearTimeout이 제대로 작동하지 않습니다 (첫 번째 타이머가 시작되기 전에 지울 때)

$(document).ready(function() 
{ 
    var timer; 
    $("body").on({ 
     ajaxStart: function() 
     { 
      var body = $(this) 
      var timer = setTimeout(function() 
      { 
       body.addClass("loading"); 
      }, 300) 
     }, 
     ajaxStop: function() 
     { 
      $(this).removeClass("loading"); 
      clearTimeout(timer); 
     } 
    }); 
}); 

: 그래서 내 common.js를 파일에 다음 스크립트를 추가했다. 즉시로드 클래스는 본문 요소에 남아 있습니다.

는 내가 처음 AJAX 호출이이 300ms 클래스를 제거하고 타이머를 삭제 요구가 만료되기 전에 끝이 10ms의 소요 말할 수 있지만, 의심 다음 타이머 화재 후 290ms 이상 ...

I 어떻게 테스트 할 수 있을지 궁금해하니? 및 날씨 위에서 설명한 작업을 수행하기 위해 뭔가 잘못하고 있습니다.

P.S ASP.NET MVC를 사용하고 있습니다.

답변

3

당신은 이전에 선언 된 변수의 높은 범위를 잃어버린, 변수를 재 선언하고 있습니다 :

$(document).ready(function() { 
    var timer; 
    $(document).on({ 
     ajaxStart: function() { 
      var body = $(document.body); 
      timer = setTimeout(function() { //don't use the "var" keyword 
       body.addClass("loading"); 
      }, 300) 
     }, 
     ajaxStop: function() { 
      clearTimeout(timer); 
      $(this).removeClass("loading"); 
     } 
    }); 
}); 
+0

은 역시'removeClass' 위의'clearTimeout' 이동하는 것이 좋습니다. –

+0

@PaulS. - 물론, 어떨까요,하지만 클래스를 추가하는 것은 너무 빠르기 때문에 몇 밀리 초의 차이입니다. – adeneo

+0

@adeneo 그 실제로 도움이되지 않았다 각 호출 전에 body.appends 및 ajaxStop 함수가 발생하지 않는 것으로 나타났습니다 ... MVC를 사용하여 메신저 캐시 수 있습니다 그래서 나는 왜 멈추지 않고 아약스 시작 있습니다. .. – Mortalus

관련 문제