プロが教える店舗&オフィスのセキュリティ対策術

10枚の画像を更新するごとに重複せず
ランダム(シャッフル)させるには
どうしたらいいですか?

理想は、JavaScriptは外部で読み込ませ、
そして下記のようにHTMLでリストを使い
ランダム表示させたいのですが・・・

<ul>
<li><a href="http://www.1/"><img src="s1.gif" /><br />あああ</a></li>
<li><a href="http://www.2/"><img src="s2.gif" /><br />いいい</a></li>
<li><a href="http://www.3/"><img src="s3.gif" /><br />ううう</a></li>
<li><a href="http://www.4/"><img src="s4.gif" /><br />えええ</a></li>
<li><a href="http://www.5/"><img src="s5.gif" /><br />おおお</a></li>
<li><a href="http://www.6/"><img src="s6.gif" /><br />かかか</a></li>
<li><a href="http://www.7/"><img src="s7.gif" /><br />ききき</a></li>
<li><a href="http://www.8/"><img src="s8.gif" /><br />くくく</a></li>
<li><a href="http://www.9/"><img src="s9.gif" /><br />けけけ</a></li>
<li><a href="http://www.0/"><img src="s0.gif" /><br />こここ</a></li>
</ul>




似たようなことをしているサイトがあったので
参考に貼り付けておきます。

function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_swapImage() { //v3.0
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}// JavaScript Document






詳しい方いましたら教えて頂けませんか?
宜しくお願いします。

A 回答 (8件)

>babu_babooさん (#7)


ご指導ありがとうございます。

> Fisher-Yatesという、やつらしい。
ああ、これは配列のランダムソートで検索したときに見た名前です。
#6を書き換えると、こんな形かな。

<script type="text/javascript">
window./*@cc_on @if(@_jscript) attachEvent('on' + @else @*/addEventListener(/*@end @*/ 'load', function (evt) {
// Fisher-Yates
var list = [0,1,2,3,4,5,6,7,8,9],
i = list.length, j, tmp;

while (--i) {
j = Math.floor(Math.random() * (i + 1));
if (i == j) continue;
tmp = list[i];
list[i] = list[j];
list[j] = tmp;
}

// append Element-Node
for(var i=0,l=list.length,li,ul=document.createElement('ul'); i<l; i++){
li = document.createElement('li');
li.appendChild(document.createTextNode(list[i]));
ul.appendChild(li);
}
document.body.appendChild(ul);
},false);
</script>

> しつもんすう12にたいして、おれいすう0。
> さいしょからわかってたべぇ~~~?
プロフィールを見てませんでした…。
自分のことなら我慢できますが、他人のことは気になってしまう。
この性分何とかしないといけないですね。
    • good
    • 0

いぜん、sortでしゃっふるしたら、してきされて・・・


Fisher-Yatesという、やつらしい。
でも、このあいだは、sort(~).sort(~)なんて、れんちゃんしたり


>どうかと思いますが

しつもんすう12にたいして、おれいすう0。
さいしょからわかってたべぇ~~~?
あっちをみているひとは、こっちもみてる。
なにはともあれ、どちらもが、じぶんのためになら!^^;
    • good
    • 0

#2です。


babu_babooさんのコードも面白いですね。デクリメントはあまり使わないから勉強になります。

>更新ボタンを一回押しますと
>パッパッと二回ランダムしてしまいます・・
document.createElement() でノードを生成するとか。

<script type="text/javascript">
window./*@cc_on @if(@_jscript) attachEvent('on' + @else @*/addEventListener(/*@end @*/ 'load', function (evt) {
var ul = document.createElement('ul'), li = document.createElement('li');
for(var i=0,content=[0,1,2,3,4,5,6,7,8,9],l=content.length,li; i<l; i++){
li = document.createElement('li');
li.appendChild(document.createTextNode(content[i]));
ul.appendChild(li);
}
for(var i=0,l=ul.childNodes.length; i<l; i++){
ul.appendChild(ul.childNodes[Math.floor(Math.random() * l)]);
}
document.body.appendChild(ul);
},false);
</script>

# 後で気が付きましたが、マルチポスト、#1さんのコードをコピペして再質問、本質問のコードもコピペなようです。
# 個人的にはfujillinさんに断りなく転載して再質問するのはどうかと思いますが…。

Yahoo!知恵袋 - maclovedesu0204さんのMy知恵袋
http://my.chiebukuro.yahoo.co.jp/my/maclovedesu0 …
    • good
    • 0

ごめん!


<br/>と<a href="" ~ />
は、だめだった。なおしてね
    • good
    • 0

think49さんにちかいね。



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Script-Type" content="application/javascript">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>TEST</title>
</head>
<body>
<ul id="abc">
<li><a href="http://www.1/"><img src="s1.gif" /><br />あああ</a></li>
<li><a href="http://www.2/"><img src="s2.gif" /><br />いいい</a></li>
<li><a href="http://www.3/"><img src="s3.gif" /><br />ううう</a></li>
<li><a href="http://www.4/"><img src="s4.gif" /><br />えええ</a></li>
<li><a href="http://www.5/"><img src="s5.gif" /><br />おおお</a></li>
<li><a href="http://www.6/"><img src="s6.gif" /><br />かかか</a></li>
<li><a href="http://www.7/"><img src="s7.gif" /><br />ききき</a></li>
<li><a href="http://www.8/"><img src="s8.gif" /><br />くくく</a></li>
<li><a href="http://www.9/"><img src="s9.gif" /><br />けけけ</a></li>
<li><a href="http://www.0/"><img src="s0.gif" /><br />こここ</a></li>
</ul>

<script type="text/javascript"><!--
//@cc_on @if( @_jscript ) attachEvent( 'on' + @else@*/ addEventListener (/*@end@*/
 'load', function ( evt ) {
  var doc = evt.ownerDocument || document;
  var p = doc.getElementById( 'abc' );
  var c = p.childNodes;
  var n = c.length;
  
  while( n-- ) p.appendChild( c[ Math.random() * n | 0 ] );
 }, false);
//ぜんかくくうはくは、はんかくにでもなおしてね。
//-->
</script>
</body>
</html>
    • good
    • 0

#1です。



>更新ボタンを一回押しますと
>パッパッと二回ランダムしてしまいます・・
確認しましたが、そのような動作はしていないはずです。

想像するところ、ulより下にloadに時間がかかるものがあって、スクリプトが実行される前に、初期状態のリストが表示され、その後にランダムに表示し直されているとかではないでしょうか?

もしそうだとすると、
・最初にリストを非表示にしておいて、ランダム後に表示にする。
 (スクリプトオフのユーザだと表示されないままになるけど)
・ul部分をロード直後に、スクリプトを直接実行させておく。

のどちらかでいけると思いますが…

そうでない場合は、原因がわからないので対処法も考えられません。
    • good
    • 0

思いつきで作りましたが、それなりにシャッフルしてくれている感じ。



---
<script type="text/javascript">
window./*@cc_on @if(@_jscript) attachEvent('on' + @else @*/addEventListener(/*@end @*/ 'load', function (evt) {
var ul = document.getElementById('test'), li = ul.getElementsByTagName('li');
for(var i=0,l=li.length; i<l; i++){
ul.appendChild(li[Math.floor(Math.random() * l)]);
}
},false);
</script>
</head>
<body>
<ul id="test">
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
---

appendChild() でノード移動できる挙動を利用しました。

element.appendChild - MDC
https://developer.mozilla.org/ja/DOM/element.app …
    • good
    • 0

やりたいことがよくわからないけど、特定のulの中のliの順序をランダムに入れ替えたいと解釈しました。



(liの内容は何でもよいので、↓では省略してあります)
<html>
<head>
<script type="text/javascript">
window.onload = function() {
var i, j, ln, tmp, e=[], ul = document.getElementById('test'), li = ul.getElementsByTagName('li');
for (i=0; li[i];) e[i] = li[i++];
ln = e.length;
for (i=0; i<ln; i++) {
var j = Math.floor(Math.random() * ln);
tmp = e[j], e[j] = e[i], e[i] = tmp;
}
for (i=0; i<ln; i++) ul.appendChild(e[i]);
}
</script>
</head>

<body>
<ul id="test">
<li>あああ</li>
<li>いいい</li>
<li>ううう</li>
<li>えええ</li>
<li>おおお</li>
</ul>
</body>
</html>

この回答への補足

ご回答ありがとうございます!!
初心者なので、すごく感謝・助かりました!

さっそく設置し、ランダムできたのですが、
更新ボタンを一回押しますと
パッパッと二回ランダムしてしまいます・・

どうしたら直りますでしょうか?

補足日時:2009/10/27 07:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!