2015-06-25 3 views
2

У меня есть панель и нажимаю на кнопку Я звоню Ajax. на firefox я мог видеть маску на панели, но на хром она не работает. Даже я создаю отдельный объект маски перед вызовом Ajax, но он отображается только после завершения вызова Ajax. Я мог показать/скрыть маску с помощью javascript-консоли браузера, но почему-то не работает, когда вызов Ajax, выполняющий мой вызов Ajax, синхронизируется. и проблема только с хромом.Экранная панель нагрузки Extjs не работает на хроме

jsfiddle.net/naveen_ramawat/6d7pyohL/2/

+1

вниз проголосовали за разметили этот вопрос с "Java". Кроме того, вы могли бы предоставить подробную информацию, например. версия ExtJS, Firefox, Chrome, OS, могла бы опубликовать скрипку. – Greendrake

+0

Hi DrakeES, я удалил ярлык java из сообщения, My ExtJS версии 4.2.1, версию Chrome версии 43.0.2357.130 m и ОС Windows 7, не смог опубликовать мой производственный код здесь, а пример jsfiddle не создан прямо сейчас, потому что вызов Ajax не работает на перекрестном домене. Надеюсь, это полезно для вас. –

+0

Hi DarkeEs my JSfiddle - -http: //jsfiddle.net/naveen_ramawat/6d7pyohL/2/ –

ответ

3

Используйте маску для всего тела

Ext.getBody().mask('your message'); 

до того АЯКС вызова и использования,

Ext.getBody().unmask(); 

внутри АЯКС успеха

Обновлено jsfiddle- http://jsfiddle.net/yq8e7na8/3/

(установить тайм-аут перед asynchronos АЯКС вызова)

+0

Да, я пробовал, но не работал в моем случае. Ничего не происходит во время вызова Ajax, который появляется после завершения Ajax-вызова, но в это время я разоблачил сообщение. –

+0

попробуйте функцию settimeout перед показом маски –

+0

Да, попробовав Ext.Function.defer, но результат такой же, появляется маска после завершения Ajax. –

2

Попробуйте этот код вместо:

panel = Ext.getCmp('panel'); 
var myMask = new Ext.LoadMask(panel , {msg:"Loading..."}); 
myMask.show(); 

Тогда можно скрыть в функции успех обратного вызова:

myMask.hide(); 
+0

Я знаю, что он должен работать, но он не работает в моем случае. Если я не скрывал маску, она появляется после завершения вызова Ajax, Не знаю, почему она не появляется во время вызова Ajax. –

+0

Можете ли вы опубликовать полный код? Нам трудно догадаться, о чем ты говоришь. –

+0

Здесь Если я вызову Ajax после использования Ext.Function.defer с некоторой задержкой, чем появилась начальная маска загрузки, но она зависает, когда Ajax-вызов запускается и становится нормальным после завершения Ajax-вызова, я хочу знать, почему Ajax вызывает зависание текущей загрузочной маски? –

2

Это вещь:

мой звонок Ajax является синхронизацией. и проблема с хромом только

синхронизации AJAX устарела и Chrome на самом деле does not process it anymore, показывая это предупреждение в консоли:

Синхронный XMLHttpRequest в основном потоке является устаревшим из-за свои пагубные последствия до конца опыт пользователя. Для получения дополнительной информации, check http://xhr.spec.whatwg.org/.

Использование async AJAX.

ОБНОВЛЕНИЕ:

Хром фактически, кажется, обработать запрос синхронизации AJAX, однако, показывает маску нагрузки падает до конца. Похоже, в отличие от Firefox, Chrome не дождался, пока интерфейс действительно отобразит маску, прежде чем переходить на следующий бит кода JavaScript. И поскольку следующий бит - это вызов AJAX с синхронизацией, который является , замораживает все, за которым следует myMask.hide() - мы никогда не видим маску.

Чтобы увидеть маску в Chrome, вы можете поместить небольшую задержку (1 миллисекунду было достаточно на моей машине) после того, как myMask.show();:

handler(){ 
       var myMask = new Ext.LoadMask(mypanel , {msg:"Loading..."}); 
       myMask.show(); 
       setTimeout(function(){ 
        Ext.Ajax.request({ 
         url: '/echo/js/?delay=5&js=', 
         method: 'GET',   
         async: false 
        }); 
        console.log('hiding mask'); 
        myMask.hide();    
       }, 1); 
      } 

Во время задержки маска оказывается перед браузер зависает делает синхронизацию AJAX вызов. Рабочая скрипку: http://jsfiddle.net/6d7pyohL/4/

+0

Да, но здесь мой вызов ajax работает и получает ответ от сервера, даже если он асинхронный, а loadmask - скрыть/показать вручную. Итак, почему маску загрузки не отображается, маска загрузки является ручной, поэтому она не должна зависеть от функции Aynax async? BTW, вы заслуживаете повышения за свой последний ответ: P –

+0

Отвечено обновлено. Это можно считать ошибкой Chrome, если синхронизация AJAX не устарела. – Greendrake

0
var myMask = new Ext.LoadMask(Ext.getBody(),{msg:"please wait..."}); 
$(document).ajaxStart(function(){ 
    myMask.show(); 
}); 
$(document).ajaxComplete(function(){ 
    myMask.hide(); 
}); 

jQuery.ajax({ 
    url:"abc.php", 
    async:true, 
    type:"POST", 
    success:function(data){ 

    } 
}); 

вместо асинхронной: ложь, используйте асинхр: истинный

+0

Нет моего требования с ExtJs только с запросом синхронизации Ajax. См. Jsfiddle, данный в вопросе, и откройте в chrome и firefox, чтобы увидеть разницу в поведении браузера. –

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