2016-11-02 4 views
0

私はプログラミングを一度もしていない人のためのコースを作成しており、非同期プログラミングやコールバック関数を使用せずに基本的なDOM操作を実演したいと考えています。 JavaScript実行時にDOMを再描画する

は、私はこのような何かを考えていた:これは正常に動作

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() 

が、UIは最後まで更新されませんので、背景が赤や緑に変わりはありません - それはちょうど青終わります。

関数の実行中に強制的に再描画する方法はありますか?

私はこれが良いアイデアではなく、実際の実装では許容されるものではないことを認識していますが、私の目的は、初心者にはコンパクトであるようにすることです。

+1

の可能性のある重複(http://stackoverflow.com/questions/951021/what-is-the-javascript-version-:私は、この機能のディスコを提案している[睡眠のJavaScriptのバージョンは(何ですか)?]睡眠) – 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'を使って非同期ループの種類を開始し、グローバル変数を使用してより単純なものにしています。また、 'body'を得るために' getElementById'は必要なく、 'document.body'を使うだけです。 –

0

関数color()およびwait()の代わりにsetTimeoutおよびstyle.backgroundColorを使用できます。

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; 
    } 

} 
関連する問題