2010-01-14 4 views
3

следующие работы правильно:JavaScript Порядок выполнения задачи

alert("start"); 
loadData(); // takes a while 
alert("finished"); 

LoadData() представляет собой метод, который вставляет большое количество данных в таблицу в DOM и занимает несколько секунд.

Это, однако, не работает, как ожидалось:

document.getElementById("mydiv").style.display = "block"; 
loadData(); // takes a while 
document.getElementById("mydiv").style.display = "none"; 

Данные загружаются в таблицу без отображения mydiv до загрузки не будет завершена, а затем mydiv быстро отображается и ушел.

Но это работает, как это предполагается: отображается

document.getElementById("mydiv").style.display = "block"; 
alert("start"); 
loadData(); // takes a while 
alert("finish"); 
document.getElementById("mydiv").style.display = "none"; 

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

Кто-нибудь знает, почему второй раздел кода выше не работает должным образом?

ответ

4

Я не знаю точной причины, но могу думать, что LoadData - это тяжелая функция, поэтому браузер занят оценкой этого, поэтому он поддерживает рендеринг. Когда u дает предупреждение, между ними предоставляется достаточное время для рендеринга div, а затем оценка LoadData.

Работа вокруг:

function LoadData() 
{ 
//Show Div here 
//window.setTimeout(newFunc,100); 
} 

function newFunc() 
{ 
//Do data operations here 
//Hide Div 
} 
+0

Да, loadData() - тяжелая функция. Но показывать mydiv должно быть просто, не так ли? И это также на первом месте в коде. Так почему браузер пропускает его и переходит к более сложному? Кстати, это происходит во всех основных браузерах. – stepanian

+0

Кстати, ваше решение сработало. Я просто не знаю, почему :) – stepanian

+1

show div получает вызов, тайм-аут устанавливается, затем завершается выполнение javascript, управление потоком возвращается в браузер так, что он может рисовать, тогда происходит событие таймаута, событие loop захватывает событие таймаута и вызывается newFunc(). – Breton

3

Придумайте JavaScript, как вставить некоторые интерпретируемый код в большую программу. Более крупная программа выглядит примерно так:

void eventLoop() { 
    struct event event; 
    while(event = getEvent()){ 
     runJavascript(event); 
     runBrowserCode(); 
     if(viewHasChanged) { 
      redrawViewRegions(); 
     } 
    } 

} 

Это не совсем точная информация, но это дает вам немного идеи. Пока работает javascript-код, браузер ничего не делает: включая обновление представления. это не дошло до этого. Браузер gui не запускается в отдельном асинхронном потоке, параллельно с javascript, как вы, кажется, себе представляете. Браузеру нужно дождаться завершения javascript, прежде чем он сможет что-либо сделать.

Вы можете увидеть обновление gui при использовании предупреждений, потому что, хорошо ... Чтобы отобразить предупреждение, вам необходимо обновить gui! так что это своего рода частный случай.

+0

Спасибо за разъяснение ..... Итак, когда в случае предупреждения появляется новое событие, которое по очереди приводит к перерисовке View Regions и, следовательно, мы видим Div. Пожалуйста, поправьте меня, если я ошибаюсь. –

+0

Я не мог точно сказать, что происходит, но я предполагаю, что когда вы вызываете «предупреждение», вы не избегаете части цикла «runJavascript».Включение предупреждения просто исчезает и явно вызывает «redrawViewRegions» как часть его реализации. Предупреждение - это блокирующий вызов, вы полностью замораживаете весь браузер, пока пользователь не нажмет кнопку «ok». – Breton

+0

Бретон, поэтому браузер рисует вещи только между перерывами в выполнении javascript, такими как тайм-ауты, ожидание взаимодействия с пользователем, загрузка содержимого AJAX и т. Д. Другими словами, если у вас есть повторяющиеся команды javascript, изменяющие пользовательский интерфейс, интерфейс становится обратным только один раз отражает то, как он должен следить за всеми командами (если в коде не было какого-то «ожидания»). Спасибо за объяснение. Я этого не знал. Это имеет смысл. – stepanian

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