2016-05-19 3 views
1

Я работаю над веб-приложением, которое должно быть совместимо с Internet Explorer 8 (вы знаете, совместимо с HELL). Дело в том, что я загружаю файл, который позже обрабатывается кодом PHP и обновляет страницу. Когда у меня есть обработанный файл, я использовал этот файл для вставки данных в таблицу, поэтому мне нужна панель процессов и блокировка пользовательского интерфейса, когда я вставляю эти данные (мне нужно вызвать другой процесс PHP для каждой строки).Блокировка пользовательского интерфейса на готовом документе

Проблема заключается в том, следующий, я хочу заблокировать этот интерфейс, у меня есть логика и все проблемы совместимости решены; но после 5 дней работы я не могу блокировать пользовательский интерфейс. Это минимальный код (который инкапсулирует все, что нам нужно), чтобы упростить эту идею:

$(document).ready({ 
    (...) 
     $("#title").html('some text'); 
     $("#bar").html(''); 
     $.blockUI({message: $('#window'),css:{width:'303px'}}); 
     go = true; 
     while (go){ 
      $.ajax({<ASYNC FALSE AJAX CALL}); 
      if (!file.lines) go = false; 
      <update progress> 
     } 

     $.unblockUI(); 
    (...) 
    }); 

Очевидно, что $ .blockUI должен блокировать основной поток (пока я не разблокирует) и показать персонализированный окно, которое есть следующий код является:

<div id="window" style="display: none; cursor: default"> 
    <div id="title_bar"> 
     <div id="titulos">some text</div> 
     <div id="cerrar"></div> 
    </div> 
    <div id="body"> 
     <img src="an icon" 
      alt="enviando" border="0" width="33" height="33" id="enviar"> 
     <p class="titulo" id='title'></p> 
     <p class="texto" id='bar'></p> 
     <br /> 
    </div> 
</div> 

Я думаю, что проблема в том, что I'm выполнение этого блока на нить, которая не является основной поток, и я не могу на самом деле блокирует пользовательский интерфейс; но мне нужен этот блок, потому что я вынужден заставить пользователя ждать, пока я обработаю всю информацию.

Спасибо, ребята, я надеюсь, вы могли бы помочь мне в этом.

+0

Попробуйте удалить 'async: false'. Это очень плохая практика, и это означает, что ваш пользовательский интерфейс не будет обновлен, что будет мешать используемому плагину 'blockUI'. –

+0

Любая ошибка, которую вы получаете. или у вас есть скрипка? –

+0

Я не могу удалить «async: false», я знаю, что это плохая практика, но мне нужно это на этом фрагменте кода @RoryMcCrossan. У меня нет какой-либо ошибки, консоль разработчика говорит типичный предупреждающий о 'async: false'. –

ответ

1

Я думаю, что в основном из-за синхронности, но если вы сделаете это асинхронно, вам нужно внести изменения в свой код. Удалите while-loop и вызовите функцию, которая сделает асинхронный вызов и при успешном завершении вызовет ту же функцию рекурсивно. После того как ваше состояние терминала будет выполнено, разблокируйте пользовательский интерфейс, как показано ниже:

$.blockUI({message: $('#window'),css:{width:'303px'}}); 
// based on the above code I assume you will get file as a response. 
process(); 

function process(file){ 
    if (file && !file.lines){ 
     $.unblockUI(); 
    } 

    $.ajax({<ASYNC TRUE AJAX CALL}) 
     .done(function(file){     
       <update progress> 
       process(file); 
      }); 
} 
+0

Хорошо, большое вам спасибо. Это была идеальная идея. Я не думал о рекурсивных функциях. Так что теперь он работает правильно. Благодаря!!!! –