• 締切済み

複数の画像をランダム(シャッフル)表示

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 詳しい方いましたら教えて頂けませんか? 宜しくお願いします。

みんなの回答

  • think49
  • ベストアンサー率59% (285/482)
回答No.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。 > さいしょからわかってたべぇ~~~? プロフィールを見てませんでした…。 自分のことなら我慢できますが、他人のことは気になってしまう。 この性分何とかしないといけないですね。

回答No.7

いぜん、sortでしゃっふるしたら、してきされて・・・ Fisher-Yatesという、やつらしい。 でも、このあいだは、sort(~).sort(~)なんて、れんちゃんしたり >どうかと思いますが しつもんすう12にたいして、おれいすう0。 さいしょからわかってたべぇ~~~? あっちをみているひとは、こっちもみてる。 なにはともあれ、どちらもが、じぶんのためになら!^^;

  • think49
  • ベストアンサー率59% (285/482)
回答No.6

#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/maclovedesu0204

回答No.5

ごめん! <br/>と<a href="" ~ /> は、だめだった。なおしてね

回答No.4

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>

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

#1です。 >更新ボタンを一回押しますと >パッパッと二回ランダムしてしまいます・・ 確認しましたが、そのような動作はしていないはずです。 想像するところ、ulより下にloadに時間がかかるものがあって、スクリプトが実行される前に、初期状態のリストが表示され、その後にランダムに表示し直されているとかではないでしょうか? もしそうだとすると、 ・最初にリストを非表示にしておいて、ランダム後に表示にする。  (スクリプトオフのユーザだと表示されないままになるけど) ・ul部分をロード直後に、スクリプトを直接実行させておく。 のどちらかでいけると思いますが… そうでない場合は、原因がわからないので対処法も考えられません。

  • think49
  • ベストアンサー率59% (285/482)
回答No.2

思いつきで作りましたが、それなりにシャッフルしてくれている感じ。 --- <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.appendChild

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

やりたいことがよくわからないけど、特定の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>

89389311
質問者

補足

ご回答ありがとうございます!! 初心者なので、すごく感謝・助かりました! さっそく設置し、ランダムできたのですが、 更新ボタンを一回押しますと パッパッと二回ランダムしてしまいます・・ どうしたら直りますでしょうか?

関連するQ&A