2016-08-16 24 views
0

ボタンをクリックするたびにランダムに色が変わる背景があります。クリックごとに色が異なることを確認することは可能ですか(同じ色が2〜3回連続して生成される可能性を回避します)。 .jsファイルのソースコードは次のとおりです(HTMLは基本的にボタンです)。ランダムbgColor:クリックごとに色が異なる可能性はありますか?

var bgcolorlist, btn; 
function newColor() { 
    bgcolorlist = '#'+Math.floor(Math.random()*16777215).toString(16); 
    document.body.style.backgroundColor = bgcolorlist; 
} 
function initAll() { 
    btn = document.getElementById('click1'); 
    btn.addEventListener('click', newColor, false); 
} 
initAll(); 
+0

色を追加していることを保証します配列にある場合は、新しい配列を生成します。 – epascarello

+0

'document.body.style.backgroundColor'の目的は' initAll() 'にありますか? – Xenyal

+1

"同じ色"の定義/しきい値は何ですか?単純に任意のランダムな色をとることは、1千6百万回繰り返す可能性があることを考えれば、色がはっきりと違うことを確認した後かもしれないと感じています。 – JonSG

答えて

1

次のことを試してみてください。

var bgcolorlist, btn; 
var colorList = []; 
function newColor() { 
    bgcolorlist = '#'+Math.floor(Math.random()*16777215).toString(16); 
    while(colorList.indexOf(bgcolorlist) != -1){ 
    bgcolorlist = '#'+Math.floor(Math.random()*16777215).toString(16); 
    } 
    colorList.push(bgcolorlist); 
    document.body.style.backgroundColor = bgcolorlist; 
} 
function initAll() { 
    btn = document.getElementById('click1'); 
    btn.addEventListener('click', newColor, false); 
} 
initAll(); 
+0

与えられた解決策を気に入ってください。関数 'initAll'の中に' document.body.style.backgroundColor; 'を追加する目的を知ってもいいですか? –

+0

@GopinathShiva typo whoops :) –

+0

@Gopinath Shiva - ありがとう、余分な行が削除されました。 – ABCode

0

ここで以前に生成された色のセットに一定時間のルックアップとバージョンがあります。カラー配列が大きくなった場合には、使用されているカラー配列に対してこの方法を使用すると、速度が大幅に向上します。

var usedColors = {}; 
function randomColor() { 
    return Math.floor(Math.random() * 0xFFFFFF).toString(16); 
} 
function unusedColor() { 
    var color; 
    while ((color = randomColor()) in usedColors); 
    usedColors[color] = true; 
    return '#' + color; 
} 
window.onload = function() { 
    document.body.style.backgroundColor = unusedColor(); 
}; 
0

この戦略は、(新旧)、各チャンネルを比較して、チャネルごとに少なくとも最小の変化(しきい値)

function getChannelColor(color, threshold){ 
 
    var _new = 0; 
 
    var _tooCloseMin = color - threshold; 
 
    var _tooCloseMax = color + threshold; 
 

 
    do { _new = Math.floor(Math.random() * 256); } 
 
    while (_tooCloseMin < _new && _new < _tooCloseMax); 
 

 
    return _new; 
 
} 
 

 
setInterval(function(){ 
 
    var target = document.getElementById("target"); 
 
    var threshold = 5; 
 

 
    var prevRGB = getComputedStyle(target).backgroundColor.match(/\d+/g); 
 
    var prevR = parseInt(prevRGB[0]); 
 
    var prevG = parseInt(prevRGB[1]); 
 
    var prevB = parseInt(prevRGB[2]); 
 

 
    var newR = getChannelColor(prevR, threshold); 
 
    var newG = getChannelColor(prevG, threshold); 
 
    var newB = getChannelColor(prevB, threshold); 
 
    
 
    target.style.backgroundColor = "rgb(" + newR + ", " + newG + ", " + newB + ")"; 
 
}, 1000);
#target{ 
 
    width: 100px; 
 
    height: 100px; 
 
    margin: 1em; 
 
    background-color: rgb(255, 255, 255); 
 
}
<div id="target"></div>

関連する問題