2009-08-12 3 views
2

У меня есть оверлей div «processing ...», который я показываю с помощью $ (''). Show() перед тем, как делать ajax-вызовы и скрыться при завершении. Проблема, с которой я сталкиваюсь, заключается в том, что если я хочу показать div, а затем сделать несколько вызовов ajax до сокрытия div снова, кажется, очередь в событиях в Internet Explorer (7) и Chrome (2.0.172.39), но я получить ожидаемый результат в Firefox (3.0.13). Когда есть один вызов ajax, он работает нормально. Код выглядит примерно так:JQuery show() задерживается в Internet Explorer/Chrome

<div id="foo">processing...</div> 
<button onclick="performSingle()" /> <-- This behaves like it's supposed to 
<button onclick="performMultiple()" /> <-- This queues the events in IE/Chrome. 

<script> 
$(document).ready(function(){ 
    $('#foo').hide(); 
}); 

function singleAjaxCall() { 
    $.ajax({ 
     url: ..., 
     type: "GET", 
     async: false, //There is a reason for this. 
     success: function() {} 
    }); 
} 

function multipleAjaxCalls() { 
    singleAjaxCall(); 
    singleAjaxCall(); 
    singleAjaxCall(); 
    singleAjaxCall(); 
    singleAjaxCall(); 
    singleAjaxCall(); 
    singleAjaxCall(); 
    singleAjaxCall(); 
} 

function performSingle(){ 
    $('#foo').show(); 
    singleAjaxCall(); 
    $('#foo').hide(); 
} 

function performMultiple(){ 
    $('#foo').show(); 
    multipleAjaxCalls(); 
    $('#foo').hide(); 
} 
</script> 

ответ

0

Возможно, вы должны обработать сигнал, присоединившись к полному событию отдельных вызовов ajax? Если вы подключите свои аякс-звонки, это заставит его сериализоваться и вести себя так, как я полагаю, вы этого хотите. Убедитесь, что окончательный метод полностью скрывает диалог, поскольку вызовы ajax не будут блокироваться.

0

Вы можете подключить функцию для вызова, когда шоу будет завершено.

$('#foo').show(0, function(){multipleAjaxCalls();}) 

http://docs.jquery.com/Effects/show

+0

Пропущенная 'функция' игнорируется, если вы передали' 0', как вы это сделали. –

+0

Теперь. благодаря –

0

Да, попробуйте вложенности ваш Ajax звонки. Что-то вроде этого -

function singleAjaxCall() { 
    $.ajax({ 
     url: ..., 
     type: "GET", 
     async: false, //There is a reason for this. 
     success: myCallback1 
    }); 
} 


function myCallback1($data) 
{ 
    if(some condition){ 
    performSingle(); 
    } 
} 
0

Ни в коем случае, чтобы добиться успеха, если асинхронной установлен в ложь, причина хорошо объясняется here и here.

При установке async на false браузер замерзает, независимо от того, что вы делали раньше. Вы должны обрабатывать ваш аякс-вызов асинхронно и, таким образом, адаптировать свой код (возможно, вы также можете посмотреть на this thread).

Смежные вопросы