2010-08-12 3 views
1

Я использую jQuery на моей странице ASP.NET MVC 2. Это супер простая почта, которая получает дату взамен. Сам процесс выполняется очень быстро. Я хочу использовать изображение с прядильщиком, чтобы показать, что пользователь что-то происходит. Все работает отлично в Firefox, тестируя локально. Однако в IE 8 изображение счетчика не отображается достаточно долго; он просто мерцает. Это может запутать конечного пользователя, если они не видят указания о том, что процесс работает/выполнен. Какой был бы лучший способ исправить эту проблему?jQuery + Ajax + Загрузка Spinner Image = Too Fast!

Спасибо.

<img id="signedout<%: item.Id %>" src="/Content/Images/signed_out.png" alt="Signed Out" title="Signed Out" style="display:none" /> 
       <div id="ajaxloader<%: item.Id %>" style="display:none;text-align:center"><img src="/Content/Images/ajax-loader.gif" alt="loading..." title="loading..." /></div> 

       <script type="text/javascript"> 
        $(function() { 
         var id = "<%: item.Id %>"; 

         $("#signout" + id).click(function() { 
          if (confirm("Are you sure you want to sign this visitor out?")) { 

           $(this).hide(); 
           //$("#signout" + id).hide(); 
           $("#ajaxloader" + id).show(); 

           var url = '<%: Url.Action("signout") %>'; 

           $.ajax({ 
            type: "POST", 
            url: url, 
            data: "id=" + id, 
            success: function (result) { 
             $("#timeout" + id).append(result); 
             $("#ajaxloader" + id).hide(); 
             $("#signedout" + id).show(); 
             $("#row" + id).css("background", "#E8E8E8"); 
            }, 
            error: function() { 
             alert("There was an unexpected error. Please try again later."); 
             $("#ajaxloader" + id).hide(); 
             $("#signout" + id).show(); 
            } 
           }); 
          } 
         }); 
        }); 
       </script> 
+0

Выполняется ли запрос только быстрее в IE8 или прядильщик скрыт до завершения запроса? Если это просто так быстро заканчивается, то в чем проблема? – DLH

+0

Он заканчивается быстрее в IE8, что не является проблемой. Проблема в том, что, так как он так быстро, пользователь не видит загрузку gif и не подумает, что ничего не произошло. – Mike

+0

Я полагаю, что в реальной жизни, когда есть латентность сети, запрос может быть выполнен медленнее? Erm ... –

ответ

1

Вы можете установить тайм-аут в JS и что будет гарантировать, что счетчик не будет скрыт до окончания тайм-аут истек:

function HideLoadingSpinner() { 
     $("#ajaxloader" + id).hide(); 
    } 

Затем замените АЯКС вызов с этим один:

$.ajax({type: "POST", 
      url: url, 
      data: "id=" + id, 
      success: function (result) { 
       $("#timeout" + id).append(result); 
       setTimeout(HideLoadingSpinner, 2000); 
       $("#signedout" + id).show(); 
       $("#row" + id).css("background", "#E8E8E8"); 
      }, 
      error: function() { 
       alert("There was an unexpected error. Please try again later."); 
       setTimeout(HideLoadingSpinner, 2000); 
       $("#signout" + id).show(); 
      } 
    }); 

Вы также можете переместить другую логику в обратном вызове успеха в функцию HidingLoadingSpinner, если вы получите странное поведение из-за таймера.

+0

Спасибо Это то, что я искал . Процесс не задерживается, мы просто следим за тем, чтобы изображение счетчика отображалось не менее 2 секунд (в вашем пример). – Mike

2

Не можете ли вы просто показать сообщение «Данные загружены» на ярком фоне с постепенным исчезновением через несколько секунд после перезагрузки?

+0

Я мог бы, но это не то, что я собираюсь сделать. Я не должен делать y, потому что я не могу понять x, когда * должен * быть способом заставить x работать. – Mike

+1

И ваша проблема заключается в том, что данные загружаются слишком быстро ... Тогда вы можете добавить спящий режим в скрипт logout или setTimeout в js, чтобы отложить печать данных/анимацию ... Но почему для медленного процесса DOWN, поскольку люди обычно предпочитают быстрые приложения – Im0rtality

+0

Я вижу, откуда вы. Но я хочу показать прядильщика. У вас есть решение для этого? Если да, пожалуйста, поделитесь своей идеей с кодом с нами. – Mike

3

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

Это основано на ответе амурры и предназначено либо скрыть счетчик, как только процесс будет загружен, если и только если таймаут уже возвращен. Поэтому, если запрос AJAX возвращает «слишком быстро», он будет ждать таймаута.

var timeoutComplete=false; 
var requestComplete=false; 

function HideLoadingSpinner() { 
    if(requestComplete) { 
     $("#ajaxloader" + id).hide(); 
    } else { 
     timeoutComplete=true; 
    } 
} 

Между тем, внутри обработчика щелчка ...

setTimeout(HideLoadingSpinner, 2000); 

$.ajax({type: "POST", 
    url: url, 
    data: "id=" + id, 
    success: function (result) { 
     $("#timeout" + id).append(result); 
     $("#signedout" + id).show(); 
     $("#row" + id).css("background", "#E8E8E8"); 
     if(timeoutComplete) { 
     $("#ajaxloader" + id).hide(); 
     } else { 
     requestComplete=true; 
     } 
    }, 
    error: function() { 
     alert("There was an unexpected error. Please try again later."); 
     $("#ajaxloader" + id).hide(); 
     $("#signout" + id).show(); 
    } 
}); 

EDIT: Я просто удалил if(timeoutComplete) вещи из функции error, так как там будет alert перед ним в любом случае.

1

Я видел это раньше. Фактически, вы видите, что IE занимает обычное количество времени для выполнения запроса, а FF занимает больше времени, чем должно было. Вы можете установить network.dns.ipv4OnlyDomains на localhost в about:config, чтобы резко ускорить FF на localhost. Source.

В моих собственных приложениях я следую предложению @ Im0rtality и уведомляю вас, что запрос ajax завершен, и покажите, как это происходит. Много раз я даже не вижу прядильщика. Я использую custom implementation JBar для моих уведомлений, которые очень профессионально выглядят.

Насколько показывая кок во время AJAX вызовов, вы включаете это в вашей главной страницы, чтобы показать кок во всех JQuery AJAX звонки:

$(function() { 
    $('.spinner') 
    .hide() 
    .ajaxStart(function() { 
     $(this).show(); 
    }) 
    .ajaxStop(function() { 
     $(this).hide(); 
    }); 
}); 

Тогда вы не должны включать отображения и скрытия spinner w/every call to $.ajax.

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