2016-11-02 2 views
0

Я создаю курс для людей, которые никогда не программировали, и хотели бы продемонстрировать базовые манипуляции с DOM без использования асинхронных программ или функций обратного вызова.Chrome repaint DOM во время выполнения JavaScript

Я думал, что я мог бы сделать что-то вроде этого:

function color(element, color) { 
    element.style = "background: " + color + ";"; 
} 

function wait(milliseconds) 
{ 
    var e = new Date().getTime() + (milliseconds); 
    while (new Date().getTime() <= e) {} 
} 

function disco() { 
    var body = document.getElementById("body") 
    color(body, "red") 
    wait(500) 
    color(body, "darkGreen") 
    wait(500) 
    color(body, "darkBlue") 
} 

disco() 

Это прекрасно работает, но интерфейс не не обновляется до конца, так что фон не станет красным или зеленым - это просто заканчивается синим.

Есть ли способ принудительно перекрасить во время выполнения функции?

Я знаю, что это не очень хорошая идея или даже приемлемая для реальной реализации, но моя цель - держать вещи в руках для новичков.

+1

Возможный дубликат [Что это версия JavaScript сна()] (http://stackoverflow.com/questions/951021/what-is-the-javascript-version- of-sleep) – Andreas

+0

Это ваш точный код? Затем вам не хватает точек с запятой в конце строк внутри 'disco'. – elementzero23

+0

@ elementzero23, точки с запятой, хотя и рекомендованы, не являются обязательными. – melancia

ответ

1

Пока вы заняты оживлением, браузер не может ничего сделать. Этот подход серьезно не рекомендуется. Вместо этого вы можете настроить свою дискотеку следующим образом.

var body = document.body; 
var colors = [ "red", "darkgreen", "darkblue" ]; 
var nextColor = 0; 

function color(element, color) { 
    element.style = "background: " + color + ";"; 
} 

function setNextColor() { 
    color(document.body, colors[nextColor%color.length]; 
    nextColor = nextColor + 1; 
} 

function disco() { 
    setInterval(setNextColor, 500);   
} 

Обратите внимание, что этот код предназначен только для демонстрации техники, а не для тестирования.

+0

Благодарим вас за ответ. Хотя я согласен с тем, что ожидание в ожидании - это, как правило, ужасная идея, цель моего кода - продемонстрировать базовое программирование, чтобы заполнить новичков с помощью браузера, поэтому я хотел избежать использования обратных вызовов. У вас есть предложение, как я могу использовать ваш код для создания концепции, которая понятна новичкам? – severin

+0

На самом деле это ** ** концепция для такой задачи в браузере, поскольку JavaScript является однопоточным. Я думаю, что эта концепция понятна и для новичков. Его можно немного упростить, используя глобальные переменные, я отредактирую соответственно. –

+0

Изменен код. В новой версии используется 'setInterval' для запуска типа асинхронного цикла и использует глобальные переменные, чтобы сделать вещи более понятными. Кроме того, 'getElementById' не требуется для получения' body', просто используйте 'document.body'. –

0

Вы можете использовать setTimeout и style.backgroundColor вместо функций color() и wait(). Я предлагаю эту функцию дискотеку:

function disco(){ 

    var body = document.getElementById("body"); 

    time = 0; 

    for (var i=0;i<10;i++) // I've put this color to change 10 times, just for test. 
    { 
     setTimeout(function(){ body.style.backgroundColor = "red"}, time); 
     time += 100; 
     setTimeout(function(){ body.style.backgroundColor = "darkGreen"}, time); 
     time += 100; 
     setTimeout(function(){ body.style.backgroundColor = "darkBlue" }, time); 
     time += 100; 
    } 

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