2012-07-03 4 views
1

약간 둘러 보았지만 아직 답변을 찾지 못했습니다.Ajax 요청이 너무 빠르면 jQuery 애니메이션이 제대로 작동하지 않습니다.

버튼을 클릭하면 정보가 서버로 전송되고 현재 div가 숨겨지고로드되는 gif가로드된다는 Ajax 요청이 있습니다. 서버가 응답 할 때 GIF를 없애고 서버의 내용을 표시하도록 설정했습니다.

코드 :

$("#submit").click(function(e){ 
    e.preventDefault(); 
    var $domain = $.fn.HTTP($('#domain').val()); 
    if(!$.fn.ValidURL($domain)){ 
     $('#domainerror').fadeIn(500); 
     return false; 
    } 

    if($('#domainerror').css('display')!=='none'){ 
     $('#domainerror').fadeOut(350); 
    } 

    $('#question').hide(500, function(){ 
     $('#waiting').show(350); 
    }); 

    $.getJSON('http://localhost/file.php', 
    { 
     i: $domain 
    }, 
     function(data){ 
     $('#answer').html(data.message + $('#trybutton').html()); 
     $('#waiting').hide(350, function(){ 
      $('#answer').show(350); 
     }); 
    }); 
}); 

문제는 jQuery를 서버 너무 빨리 사라지지 않는 로딩 GIF에서 응답을 수신합니다.

그러나 서버에 3 초 동안 대기하면 제대로 작동합니다. 이것은 내가 원하는 해결책이 아닙니다.

아이디어가 있으십니까?

+0

"서버에 3 초 동안 잠자기라고 말하면 제대로 작동합니다."해결책이있는 것 같습니다. –

+1

내 질문이 편집되었습니다. 그건 내가 원하는 해결책이 아니야. 그것이 괜찮 으면 즉시 될 수 있다면. 로딩 바가 잘 될 수 있도록 모바일 연결에서 사람들을 위해 최적화하려고합니다. 나는 의도적으로 사용자가 대답을 위해 3 초를 기다려야하는 것을 원하지 않는다. – Peter

+1

응답이 즉시 다시 발생하면 무엇이 문제입니까? 왜 사용자가 아주 오래 기다리지 않으면 왜 "로드 중"이미지를 보여야합니까? – Pointy

답변

3

너무 빠르기 때문에 사용자가 애니메이션을로드하지 않아도되는 것은 좋은 일입니다.

어쨌든, 문제는 애니메이션이 적어도 500ms 걸리는 것입니다. 애니메이션은 AJAX 요청과 동시에 비동기 적으로 처리됩니다. 서버를 잠자기 상태로 만드는 대신 CPU가 낭비되는 대신 AJAX 요청을 보내기 전에 브라우저를 대기 상태로 두십시오.

setTimeout() 함수의 호출을 넣어,이 예제는 3 초를 기다려야 할 것입니다 :

setTimeout(function() { 
    $.getJSON('http://localhost/file.php', 
    { 
     i: $domain 
    }, 
    function(data){ 
     $('#answer').html(data.message + $('#trybutton').html()); 
     $('#waiting').hide(350, function(){ 
      $('#answer').show(350); 
     }); 
    }); 
}, 3000); 

이상적인 솔루션 그러나 애니메이션 효과를 사용하고 단지 쇼()와 숨기기를 사용하지하는 것입니다().

+0

요청을 보내기 전에 3 초 대기하는 것도 시간 낭비입니다. – Bergi

+0

매우 사실입니다. 전환 효과를 원한다면 500ms를 기다려야합니다. 첫 번째 페이드 애니메이션이 완료되기 전의 시간이기 때문입니다. 그럼에도 불구하고 fadeOuts는 숨김으로 변경 될 수 있으며 지연을 전혀 필요로하지 않습니다. – greg84

2

대기 애니메이션을 표시하는 데 지연 시간을 없애므로 요청이 반환 될 때 여전히 표시되지 않습니다.

$('#question').hide() //was 500 
$('#waiting').show(); //was 350 

모두 추가하면 거의 1 초 후입니다. 그때까지는 아약스 요청이 대부분의 시스템에서 반환되었을 수 있으므로 그 시점까지는 여전히 애니메이션을 적용 할 가치가 없습니다.

0

질문 숨기기가 끝나기 전에 ajax 콜백이 실행되고 $('#waiting').show(350);$('#waiting').hide(350, ...) 뒤에옵니다. 당신이 가 immidiately가 (페이드 아웃 할 수있는 질문을 기다리고되지 않음), 이런 일이되지 않습니다 #waiting IMG을 보여했다면

; 당신은 해결하기 위해 세 가지 가능성이 있습니다 그 대답은 또한 숨기기를 기다리는 것을 기다리지 않아야합니다.당신이 원하는 경우

var answered = false, 
    waiting = false; 
$('#question').hide(500, function(){ 
    if (!answered) { 
     waiting = true; 
     $('#waiting').show(350); 
    } 
}); 

$.getJSON('http://localhost/file.php', { 
    i: $domain 
}, function(data){ 
    $('#answer').html(data.message + $('#trybutton').html()); 
    answered = true; 
    if (waiting) { 
     $('#waiting').stop().hide(350, function(){ 
      $('#answer').show(350); 
     }); 
    } else { 
     $('#answer').show(350); 
    } 
}); 

:


은 또는 당신은 어떤 애니메이션을 을 대답은 이미 질문 페이드 아웃 때 페이드되었음을 나타냅니다없고, 보여 변수를 사용 에 대한 네 개의 애니메이션은 항상을 연속적으로 (최소 1550ms) 표시하므로 수동으로 코딩해야합니다 (

).
var showanswer = false; 
$('#question').hide(500, function() { 
    $('#waiting').show(350, function() { 
     if (showanswer) // already loaded 
      showanswer(); // execute callback 
     else 
      showanswer = true; // mark as shown 
    }); 
}); 

$.getJSON('http://localhost/file.php', { 
    i: $domain 
}, function(data){ 
    $('#answer').html(data.message + $('#trybutton').html()); 
    function animate() { 
     $('#waiting').hide(350, function(){ 
      $('#answer').show(350); 
     }); 
    } 
    if (showanswer) // waiting image shown 
     animate(); 
    else 
     showanswer = animate; // set as callback 
}); 
0

자바 스크립트의 setTimeout을 사용하십시오. 코드는 다음과 같이 (아마도 정확히) 보일 수 있습니다 :

setTimeout("getResponse()", 3000); 

function getResponse() { 
    $.getJSON('http://localhost/file.php', 
    { 
     i: $domain 
    }, 
     function(data){ 
     $('#answer').html(data.message + $('#trybutton').html()); 
     $('#waiting').hide(350, function(){ 
      $('#answer').show(350); 
     }); 
    }); 
} 

여전히 file.php의 코드를 처리하고 데이터를 다시 전송 서버로 i 변수를 전송하여 AJAX 요청을 가지고 그런 식으로하는 당신을 다룰수있다. 유일한 트릭은 함수에 넣는 것입니다 (필수는 아니지만 setTimeout 함수를 더 예쁘게 보이게 만듭니다). 3000 밀리 초 후에 호출하십시오.

+0

이것은 작동하지 않습니다. setTimeout [here] (https://developer.mozilla.org/en/DOM/window.setTimeout)에 대해 알아보십시오. 또한 대기 3는 시간 낭비입니다. – Bergi

+0

Bergi - setTimeout에 대해 가르쳐 주셔서 감사합니다. 이 질문은 3 초 동안 코드를 지연시키는 방법을 묻습니다. 나는 이것이해야할 일이 아니라는 것에 동의하지만, 나는 그 일을 할 수있는 대답을 주었다. – cereallarceny

+0

대기중인 서버 대신 대기중인 스크립트를 요청했다고 생각하지 않습니다. 그는 타이밍 문제라고 방금 증명했습니다. – Bergi

관련 문제