0

私のウェブサイトには、引用のリストからランダムな引用を選択し、ランダムに選択された引用をテキストボックスに投影するボタンがあります。これはJavaScriptを使用して行われます。

私はこれを機能させていますが、直後の引用が前の引用と同じになるのを防ぐ追加のコードが必要です。ただし、直接フォローするのではなく、以前は引用を再び表示できるようにしたいと思います。

可能であれば、使用した見積もりが最低3回クリックしても再び表示されないようにすることもできますが、これは単なるボーナスです。

とにかく、私が現在持っているコードは次のとおりです。

<head>    
  <script language="javascript"><!--
    function GenerateQuote(){var aquote=new Array;
      aquote[0]="\"Quote0\"";
      aquote[1]="\"Quote1\"";
      aquote[2]="\"Quote2\""
      aquote[3]="\"Quote3\"";
      aquote[4]="\"Quote4\"";
      aquote[5]="\"Quote5\"";
      aquote[6]="\"Quote6\"";
    rdmQuote=Math.floor(Math.random()*aquote.length);
    document.getElementById("quoteBox").value=aquote[rdmQuote];
    }
  -->
  </script>
</head>

<body>
  <textarea id="quoteBox" readonly></textarea>
  <button onClick="GenerateQuote()">Entertainment & Hobbies</button>
</body>

前もって感謝します; 頭脳派にとってはそれほど難しいことではないと確信しています!

4

4 に答える 4

1
  1. 引用符の配列を入力してから、コピーを作成します。
  2. 配列のコピーをスクランブルします(メソッドを使用するか、 alghoritm.sort()のjs実装を探すことができます。Fisher-Yates
  3. クリックイベントごとに配列を呼び出すpop()と、配列が完全に消費されるまで、毎回異なる見積もりが生成されます。
  4. 配列の長さがゼロの場合1)

参照:

于 2011-12-27T14:45:36.000 に答える
1
<head>
    <script type="text/javascript">
!function (){
    var quotes = ["quote0", "quote1", "quote2", "quote3", "quote4", "quote5", "quote6", "quote7", "quote8"],
        shuffleAfter = quotes.length, cur = 0;


    function shuffle( arr ) {
        var l = arr.length, j, i, tmp;

        for( i = l - 1; i > 0; --i ) {
            j = ( Math.random() * ( i + 1 ) ) >>> 0;
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }

        return arr;
    }

    function generateQuote(){
        var r;

        if( cur++ % shuffleAfter === 0 ) {
            shuffle(quotes);
        }

        r = quotes.shift();

        quotes.push( r );

        return r;
    }


    window.generateQuote = generateQuote;
}()
    </script>
</head>
<body>
    <textarea id="quoteBox" readonly></textarea>
    <button onClick="document.getElementById('quoteBox').value = generateQuote()">Entertainment & Hobbies</button>
</body>

generateQuote() を 27 回呼び出した結果:

2,9,7,5,8,1,3,4,6,9,6,1,7,5,4,3,2,8,3,1,6,5,2,7,9,4,8,2

ご覧のとおり、完全なサイクルの後、クオートは再びシャッフルされ、前回のサイクルでは最後で、新しいサイクルでは最初にあった場合、同じクオートが表示される可能性があります。少なくとも、私の mp3 プレーヤーでプレイリストをシャッフルするよりははるかに優れているはずです :P

于 2011-12-27T14:48:12.523 に答える
0

使用する

var lastQuote=-1;

関数の外にある場合、

var rdmQuote=lastQuote;
while (rdmQuote==lastQUote) rdmQuote=Math.floor(Math.random()*aquote.length);
lastQuote=rdmQuote;

関数内

于 2011-12-27T14:38:22.833 に答える
0

dontRepeatUntil を微調整して必要に応じることができます 確かにもっと良い方法がありますが、これはうまくいくはずです

var latestQuote = []
    , dontRepeatUntil=3
    , rdmQuote = null
    , quotes=[
        "\"Quote0\""
        ,"\"Quote2\""
        ,"\"Quote3\""
        ,"\"Quote4\""
        ,"\"Quote5\""
        ,"\"Quote6\""
    ]
;
function GenerateQuote(){
if(latestQuote.length >= dontRepeatUntil){
    latestQuote = latestQuote.slice(latestQuote.length-dontRepeatUntil+1);
}
    do{
        rdmQuote=Math.floor(Math.random()*quotes.length);
    }while(latestQuote.join(',').match(new RegExp('(^|,)'+rdmQuote+'(,|$)')));
    latestQuote.push(rdmQuote);
    document.getElementById("quoteBox").value=quotes[rdmQuote];
}
于 2011-12-27T14:48:28.080 に答える