テーブルごとにランダム表示

[新着] Webテンプレートを仮オープンしました



0   名前: みかん : 2007/05/25(金) 19:40  ID:nYEKtUpV sub-gm
少し複雑かと思うのですが、よろしくお願い致します。

HTMLタグで作成したテーブルを丸ごとランダム表示させたいと思っています。



以下のようなテーブルを複数(それぞれリンク先・
画像・説明・テーブルの背景画像などを替えて)作成しました。
テーブルの大きさは、統一しています。

-------------------テーブル---------------------

<TABLE border="1">
<TBODY>
<TR>
<TD width="50"><A href="リンク先URL1"><IMG src="画像1.gif"></A></TD>
<TD width="50" bgcolor="#ff0000">テーブル1の説明</TD>
</TR>
<TR>
<TD width="50"><A href="リンク先URL2">リンク先</A></TD>
<TD width="50" background="背景画像1.gif">テーブル1の特長</TD>
</TR>
</TBODY>
</TABLE>

-------------------------------------------------


このようにして作成していった複数のテーブルを、
画面更新(リロード)する度に、ランダムに1つだけ呼び出したいと思っています。

どなたか、この方法がお分かりになる方いらっしゃいましたら、
よろしくお願い致します。

1   名前: 匿名 : 2007/05/25(金) 19:40  ID:bSDyoqPy sub-Ds
1. テーブルごと消すのを好きなだけ作る(display設定)
2. ランダムでCSSを選択
3. うち、1つだけが表示される

2   名前: みかん : 2007/05/25(金) 19:40  ID:nYEKtUpV sub-gm
>>1
匿名さん、ちょっと意味が分からないのですが、
それは具体的にどのようなことでしょうか?

3   名前: Z ◆XTzyosZXcL : 2007/05/25(金) 19:40  ID:KXOMMoT8 sub-Cl
「スタイルシート JavaScript ランダム」でここ(TAG INDEX)内を検索すると150件弱ほどスレッドが見つかりますが、その中で目的が達成できるものはありませんか?

検索結果:
http://www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&oe=Shift_JIS&q=%83X%83%5E%83C%83%8B%83V%81%5B%83g%81@%83%89%83%93%83_%83%80+JavaScript%81@site%3Atagindex.com&btnG=Google+%8C%9F%8D%F5&lr=lang_ja

関連・掲示板Q&A:
http://www.tagindex.com/bbs/qa.html

参考・えじさんからのメッセージ(質問される方へ):
http://www.tagindex.com/bbs/note.html#h2

4   名前: みかん : 2007/05/25(金) 19:40  ID:nYEKtUpV sub-gm
>>3
Zさん、はじめまして。
「スタイルシート JavaScript ランダム」でもちろん検索しました。
他のキーワードでも、様々に組み合わせて検索したのですが、
どうしても自分では分かりませんでした。

ランダム表示といっても、「テーブル丸ごと」のランダム表示への方法は
どのように応用したらよいか分からないのです。

5   名前: みかん : 2007/05/25(金) 19:40  ID:nYEKtUpV sub-gm
特定のページに「テーブル丸ごと」ランダムに表示することは可能ですか?

6   名前: アム : 2007/05/25(金) 19:40  ID:WTP7ML/f sub-Cl
可能です。
私は下記を参考に、テーブルを丸ごとランダム表示させるjavascriptを作成したことがあります。

http://www.tagindex.com/javascript/message/random.html

ちょっとソースが見辛くなりますが、ランダム表示したいソースの改行を全て取っ払って変数に格納すれば、ランダム表示する中身以外は変更することなく利用できました。

テーブルであろうと画像であろうと、HTMLタグであることには変わりありません。
画像に限った話ではないですが、画像のランダム表示ができてテーブルができないなんてことはそこまでないはずです。
このことを意識して検索結果とにらめっこすると、また違う見え方になりますよ。

7   名前: みかん : 2007/05/25(金) 19:40  ID:nYEKtUpV sub-gm
>>6
アムさん、お返事ありがとうございます。

>ランダム表示したいソースの改行を全て取っ払って変数に格納すれば

変数に格納というのは、どのようにすればよいでしょうか。
自分のスキルでは、どうも理解できませんでした…。

テーブルを丸ごとランダム表示させるjavascriptを作成したことがあるとのこと、
もしよろしかったら、是非とも、具体的なjavascriptを、この場でご教授頂けないでしょうか?

どうぞ、よろしくお願い致します。


8   名前: Z ◆XTzyosZXcL : 2007/05/25(金) 19:40  ID:KXOMMoT8 sub-Cl
>>8
 下記を今一度ご確認を(>>6の方を疑うわけではありませんが、やたらとサンプルコードを求めるのは悪意のあるコードを知らずに使わされてしまう結果にもなりかねませんから好ましくありません)。

質問時のご注意:
http://www.tagindex.com/bbs/note.html#h2
「質問にならないような「コードの作成依頼のみ」の投稿はご遠慮ください。(どうしてもという場合には、事情を説明した上でお願いしてみてください)」

9   名前: NullPo : 2007/05/25(金) 19:40  ID:Z0FHbpib sub-ii
window.onload = function()
{
  var tables = [];
  tables[0] = "<table><tbody><tr><td>あいうえお</td></tr></tbody></table>";
  tables[1] = "<table><tbody><tr><td>かきくけこ</td></tr></tbody></table>";
  tables[2] = "<table><tbody><tr><td>さしすせそ</td></tr></tbody></table>";

  var index = parseInt(Math.random() * tables.length);
  setHTML.call(document.body, tables[index]);
}

function setHTML(htmlText)
{
 //元の子ノードを削除する。
  while(this.hasChildNodes())
    this.removeChild(this.firstChild);

  var lastChild = this;
  for(var ix = 0; ix < htmlText.length; ) {
    var nextIx = ix + 1;
    switch(htmlText.charAt(ix)) {
     case "<":
      nextIx = htmlText.indexOf(">", ix) + 1;
     //属性の開始まで。
      var tagEnd = htmlText.indexOf(" ", ix);
      if(tagEnd < ix || tagEnd > nextIx)
        tagEnd = nextIx - 1;
      var tag = htmlText.substring(ix + 1, tagEnd);
     //終了タグであれば最終要素を親要素に置き換える。
      if(tag.charAt(0) == "/") {
        lastChild = lastChild.parentNode;
        break;
      }
     //開始タグであれば要素を追加し、最終要素にする。
      var tagElement = document.createElement(tag);
      lastChild.appendChild(tagElement);
      lastChild = tagElement;
     //属性をセットする。
      var attributeText = htmlText.substring(tagEnd + 1, nextIx - 1);
      setAttributes(tagElement, attributeText);
      break;
     default:
     //テキストノードを追加する。
      nextIx = htmlText.indexOf("<", ix);
      if(nextIx < 0)
        nextIx = htmlText.length;
      var text = htmlText.substring(ix, nextIx);
      lastChild.appendChild(document.createTextNode(text));
    }

    ix = nextIx;
  }

 //属性セット関数
  function setAttributes(targetElement, attributeText)
  {
    for(var ix = 0; ix < attributeText.length; ) {
     //属性名称取得
      var nextIx = attributeText.indexOf("=", ix);
      var name = attributeText.substring(ix, nextIx);
     //属性内容取得
      ix = nextIx + 1;
      nextIx = attributeText.indexOf(" ", ix);
      if(nextIx < 0)
        nextIx = attributeText.length;
      var value = attributeText.substring(ix + 1, nextIx - 1);

     //属性の追加
      if(name.substring(0, 2) == "on")
        addEvent.call(targetElement, name.substring(2), new Function("event", value));
       else
        targetElement.setAttribute(name, value);

      ix = nextIx + 1;
    }

   //対象にイベントを追加する。
    function addEvent(eventName, eventFunction)
    {
      if(this.addEventListener)
        this.addEventListener(eventName, thatEvent, false);
       else if(this.attachEvent)
        this.attachEvent("on" + eventName, ieEvent);

     //IE用イベント
      function ieEvent() {
        if(typeof eventFunction == "function")
          return eventFunction.call(window.event.srcElement, window.event);
      }

     //その他用イベント
      function thatEvent(e) {
        if(typeof eventFunction == "function")
          return eventFunction.call(e.target, e);
      }
    }
  }
}

10   名前: アム : 2007/05/25(金) 19:40  ID:WTP7ML/f sub-Cl
javascriptろくに読むこともできない私はそろそろ退散したほうがいいかしら;
NullPoさんが既に何やら提示して下さってますが、とりあえず>>7のご質問部分の回答だけ…

変数に格納するというのは大雑把に言うと、「変数=○○」のような形で変数に○○を記憶させることです。
>>6のリンク先の場合、msg[x]='○○'の○○の部分をランダム表示させたいものに変えるのですが、その際
msg[0]='<TABLE border="1"><TBODY><TR><TD><A href="リンク"><IMG src="画像.gif" /></A></TD></TR></TBODY></TABLE>';

上のように間に改行を入れることなく記述しないといけません。
msg[0]='<TABLE border="1">
<TBODY>
<TR>
<TD>
<A href="リンク"><IMG src="画像.gif" /></A>
</TD>
</TR>
</TBODY>
</TABLE>';

このような書き方では駄目ですよというのを言いたくてその1文を付け足しただけだったのですが、言葉って難しいですねorz

11   名前: 匿名 : 2007/05/25(金) 19:40  ID:XItuWrOP sub-Cz
蛇足。

>>9
新ノードを大量に append するときは、いったん DocumentFragment に格納しておいて、最後にまとめて append すると格段に速くなります。
var fragment = document.createDocumentFragment ();
var lastChild = fragment;
...
this.appendChild (fragment);  // DocumentFragment の子ノード群がまとめて append される


>>10
タグ名が大文字なのに XHTML になってますのでご注意。なお、
var str ='<table>\
<tr><td>あ<\/td><\/tr>\
<\/table>';

のようにすれば、リテラル中で改行できる実装もあります。ECMA 規格外なので保証しませんが。



DOM3-LS(Opera 6+)
document.addEventListener ('load', {
    sources : [
        '<table><tr><td>あいうえお</td></tr></table>',
        '<table><tr><td>かきくけこ</td></tr></table>',
        '<table><tr><td>さしすせそ</td></tr></table>'
    ],
    
    handleEvent : function (event) {
        var implementation = event.target.implementation;
        var context = event.target.body;
        var parser = implementation.createLSParser (implementation.MODE_SYNCHRONOUS, null);
        var input = implementation.createLSInput ();
        input.stringData = this.sources[ Math.floor (Math.random () * this.sources.length) ];
        parser.parseWithContext (input, context, LSParser.ACTION_APPEND_AS_CHILDREN);
    }
}, false);

12   名前: NullPo : 2007/05/25(金) 19:40  ID:Z0FHbpib sub-ii
>>11
つっこみありがとうです。
初耳だったので早速DOM2-Coreの仕様書を読んできたのですが、ちんぷんかんぷんでした。

ドキュメントツリーに追加する代わりに使う、軽量のDocumentオブジェクトってことなんですかね。
実行速度を上げるため以外には何もしないのかな。

13   名前: 匿名 : 2007/05/25(金) 19:40  ID:XItuWrOP sub-Cz
オフトピ御免。

>>12
DocumentFragment は、Document ツリーに所属しない部分木を扱うときに「仮のルートノード」として使います。例えば、DOM-Range を使っていて、
<div>
  <p>..</p>
  <p>..</p>
  <p>..</p>
</div>

の範囲までの子ノード群を切り取ったとき(Range#extractContents())、複数のノードが戻り値になります。そこで、これらに「仮のルートノード」として DocumentFragment を与え、これを戻り値とします。

まあ、仮のルートノードとしてならダミーの Element でも良いのですが、DocumentFragment の利点は、これを append/insert するときに、子ノード群が append/insert されることです。つまり、イメージとしては appendChild (node1, node2, node3, ...) のようなことができるわけです。

DOM2-Range でぺたぺたノード群の切り貼りをしていると、よくお目にかかります。ついでに実装のバグにも。
http://members.jcom.home.ne.jp/jintrick/Personal/documentFragment.html

14   名前: NullPo : 2007/05/25(金) 19:40  ID:NwzmqAw7 sub-.G
>>13
なるほど、なんとなくわかってきました。
ありがとうございます。

一覧へ戻る